在verilog中重新定义一个参数

Redefining a parameter in verilog

我是 verilog 的新手,我有一个问题。

我可以在全局范围内初始化一个参数并在模块范围内重新初始化它吗?

parameter GLOB_FOO = 5;
module mod2 (in1,clk,out1);
   parameter GLOB_FOO = 7;
   input in1,clk;
   output out1;
   assign out1 = in1;
endmodule

在这段代码中,我在全局范围和模块范围内初始化参数 GLOB_FOO

我也看了语言参考手册。但是找不到答案,因为有很多细节。

这种参数重新初始化在verilog中有效吗?

您在模块 mod2 重新声明了 GLOB_FOO,没有重新初始化它。这意味着您有两个参数,一个在编译单元范围内,值为 5,另一个在 mod2 中,值为 7。mod2 内的声明隐藏了外部编译单元的声明。 $unit:: 可用于访问外部声明。

parameter GLOB_FOO = 5;
module mod2 (input in1,clk, output out1);
   parameter GLOB_FOO = 7;
   initial begin
         $display(GLOB_FOO); // displays 7
         $display($unit::GLOB_FOO); // displays 5
     end
endmodule

您可以在实例化时覆盖模块内声明的参数值。

parameter GLOB_FOO = 5;
module mod2 (input in1,clk, output out1);
   parameter GLOB_FOO = 7;
   initial begin
         $display("%m %d %d", GLOB_FOO, $unit::GLOB_FOO);
endmodule
module top;
  bit A,B, C, CLK;
  mod2 #(3) inst1 (A,CLK,B);
  mod2 #(.GLOB_FOO(4)) inst2 (A,CLK,C);
endmodule

这显示

#top.inst1           3           5
#top.inst2           4           5