2015-10-19 102 views
2

参数最近,我遇到了以下问题:在软件的Quartus我定义我的Verilog模块如下:问题与的ModelSim

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'。
(视频博客-2388) 'IN1' 在此范围内(MODULE_NAME)已经声明
(视频博客-2730)不确定变量: 'W2'。
...
标识必须用端口模式声明:第1
标识必须用端口模式声明: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建议不)?

回答

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样式标头的标头之后定义parameter s和localparam s是合法的。 IEEE Std 1800-2012 § 23.10 示例覆盖模块参数

+0

看起来我正在寻找文档中的错误位置(第6.20节)。谢谢。 – Qiu