Verilog 参数声明是否需要默认值?

Is default value required for a Verilog parameter declaration?

Verilog代码中的参数通常声明为默认值,如:

parameter UP = 1;

但是如果参数总是在模块实例化时被覆盖,那么我也看到过没有默认值的声明,比如:

parameter UP;

这个没有默认值的参数声明可以在ModelSim中编译,但在Riviera-PRO中编译失败。

Verilog IEEE Std 1365-2005 部分“4.10.1 模块参数”显示默认值是必需的(不是可选的),如:

因此,如果需要默认值,则 ModelSim 可以接受没有默认值的参数,或者如果默认值是可选的,Riviera-PRO 不支持没有默认值的参数。

因此:Verilog 参数声明是否需要默认值?


下面包含一个计数器模块,包括没有默认值的参数声明,供参考。

module counter
  (
   input            clk,
   input            rst,
   output reg [3:0] cntr
   );

   parameter UP;

   // 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

所有的verilog标准都留有解释的空间。另请注意,1394 最后一次更新是在 2005 年,并且不再有效。它已被 SystemVerilog 标准取代。

默认值,根据您对 1394 标准的引用。 如果 ModelSim 忽略它,则该工具违反了标准。您可以向 Mentor 报告。但是,由于历史原因或某些技术原因,此行为可能是故意的。

在您的情况下,对标准的这种解释不会影响用户程序的行为(假设参数总是被覆盖)。

众所周知,多个供应商对 and/or 实施标准的解释不同。存在多项违规行为。由于客户群可能在他们的代码中使用了这些漏洞,他们拒绝修复一些问题。

System Verilog 标准有一个说明,允许省略值,但 在端口参数声明中:

param_assignment ::= parameter_identifier { unpacked_dimension } [ = constant_param_expression ] ^18

^18) It shall be legal to omit the constant_param_expression from a param_assignment or the data_type from a type_assignment only within a parameter_port_list. However, it shall not be legal to omit them from localparam declarations in a parameter_port_list