最近我遇到了以下问题:在 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 建议不非法)?
IEEE 标准 1800-2012 https://standards.ieee.org/findstds/standard/1800-2012.html§23.2.1模块头定义声明两种标头类型:
模块头定义有两种样式,non-ANSI header和美国国家标准协会header.
The non-ANSI header样式将模块头的定义与模块端口和内部数据的声明分开。非 ANSI 风格模块头的非正式语法如下:
module_name ( port_list ) ;
parameter_declaration_list
port_direction_and_size_declarations
port_type_declarations
模块头定义在语法上由端口列表右括号后面的分号完成。定义端口特征的声明(方向、大小、数据类型、符号等)
是模块内的本地定义。
美国国家标准协会headerstyle 使端口特性的声明成为模块头的一部分(仍以分号结尾)。 ANSI 风格模块头的非正式通用语法如下:
module_name #( parameter_port_list )
( port_direction_and_type_list ) ;
没有提及标头语法匹配:
module_name ( port_direction_and_type_list ) ;
parameter_declaration_list
基于LRM https://standards.ieee.org/findstds/standard/1800-2012.html,您的示例标头没有投诉。任何支持该语法的内容都来自标准之外。
定义是合法的parameter
s and localparam
s 在带有 ANSI 样式标头的标头之后,只要标头不引用它们即可。示例中IEEE 标准 1800-2012 https://standards.ieee.org/findstds/standard/1800-2012.html第23.10节覆盖模块参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)