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