【问题标题】:Issue with parameters in ModelsimModelsim 中的参数问题
【发布时间】:2015-10-19 16:07:43
【问题描述】:

最近我遇到了以下问题:在 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】:

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

    有两种样式的模块头定义,non-ANSI header 和 ANSI header

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

    module_name ( port_list ) ;
      parameter_declaration_list
      port_direction_and_size_declarations
      port_type_declarations
    

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

    ANSI header 样式使端口特性的声明成为模块头的一部分(仍然以分号结尾)。 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 中的示例 覆盖模块参数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多