与Modelsim中的参数问题

问题描述 投票:2回答:1

最近我遇到了以下问题:在Quartus软件中,我已经定义了我的Verilog模块,如下所示:

module module_name(
  input     [w1-1:0]    in1,
  input     [w2-1:0]    in2,
  output    [w1-1:0]    out1
);

  parameter w1 = 16;
  parameter w2 = 8;

  ...

endmodule

这个模块编译没有任何问题。但是,当我尝试在Modelsim(-Altera)10.3d中模拟该代码时,我遇到以下错误:

(vlog-2730)未定义的变量:'w1'。 (vlog-2388)'in1'已在此范围内声明(module_name) (vlog-2730)未定义的变量:'w2'。 ... 必须使用端口模式声明标识符:in1 必须使用端口模式声明标识符:in2

我找到了通过以下代码绕过此问题的方法:

module module_name(
  in1,
  in2,
  out1
);

  parameter w1 = 16;
  parameter w2 = 8;

  input     [w1-1:0]    in1;
  input     [w2-1:0]    in2;
  output    [w1-1:0]    out1;

  ...

endmodule

另一种方法是使用以下构造:

module module_name #(parameter w1 = 16, parameter w2 = 8)(
  input     [w1-1:0]    in1,
  input     [w2-1:0]    in2,
  output    [w1-1:0]    out1
);

...

endmodule

但是:在使用这些参数的输入/输出信号之后定义参数是非法的(Quartus建议不是这样)吗?

verilog modelsim quartus
1个回答
3
投票

IEEE Std 1800-2012§23.2.1模块头定义状态两种头类型:

有两种样式的模块头定义,非ANSI头和ANSI头。

非ANSI标头样式将模块标头的定义与模块端口和内部数据的声明分开。非ANSI样式模块头的非正式语法如下:

module_name ( port_list ) ;
  parameter_declaration_list
  port_direction_and_size_declarations
  port_type_declarations

模块头定义在语法上由端口列表的右括号后的分号完成。定义端口特征(方向,大小,数据类型,签名等)的声明是模块中的本地定义。

ANSI标头样式使端口特性的声明成为模块头的一部分(仍由分号终止)。 ANSI样式模块头的非正式通用语法如下:

module_name #( parameter_port_list )
             ( port_direction_and_type_list ) ;

没有提到标头语法匹配:

 module_name ( port_direction_and_type_list ) ;
    parameter_declaration_list

根据LRM,您的样本标题是不抱怨的。任何支持该语法的东西都来自标准之外。

只要标题不引用它们,在标题后面用ANSI样式标题定义parameters和localparams是合法的。 IEEE Std 1800-2012中的示例§23.10覆盖模块参数

© www.soinside.com 2019 - 2024. All rights reserved.