Verilog parameter声明是否必须指定默认值?
Verilog parameter声明是否必须指定默认值
明确结论
按照Verilog官方IEEE Std 1364-2005标准(原提问中1365为笔误)4.10.1「模块参数」章节的强制规定,parameter声明时必须指定默认值,默认值不属于可选配置项。
工具差异说明
你观察到的ModelSim可正常编译无默认值parameter、Riviera-PRO编译失败的现象,是不同工具对标准的遵循严格程度不同导致的:
- ModelSim(西门子EDA旗下仿真工具)提供了非标准的宽松兼容支持:允许省略parameter默认值,只要模块实例化时传入对应参数即可正常运行,这属于工具的扩展特性,不符合Verilog标准要求
- Riviera-PRO严格遵循Verilog标准实现,无默认值的parameter声明不符合语法规范,因此直接抛出编译错误,这一行为是符合标准的
跨工具兼容建议
如果需要编写可在多工具间正常编译的可移植Verilog代码,所有parameter声明都必须添加默认值,即使你预期所有模块实例化场景都会覆盖该参数,也要设置一个合理的默认值。
比如原示例中的无默认值声明parameter UP;修改为parameter UP = 1;即可兼容所有符合标准的编译器。
参考代码
带默认值parameter的计数器模块示例
module counter ( input clk, input rst, output reg [3:0] cntr ); parameter UP = 1; // 补充默认值,符合标准要求 // Counter always @(posedge clk or posedge rst) begin if (rst) cntr <= 4'd0; else if (UP) cntr <= cntr + 1; else cntr <= cntr - 1; end endmodule
测试台参考代码
module testbench(); // Declarations reg clk; reg rst; wire [3:0] cntr; // Clock generation initial begin clk = 0; forever #5 clk = ~ clk; end // Reset generation initial begin rst = 1; #100; rst = 0; end // DUT counter counter #(.UP(1)) dut (clk, rst, cntr); endmodule
内容的提问来源于stack exchange,提问作者EquipDev
相关产品推荐
相关产品推荐

