在verilog中重新定义参数

时间:2017-05-17 05:21:05

标签: verilog system-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 twise。

我也查看了语言参考手册。但由于有很多细节,因此无法找到答案。

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

1 个答案:

答案 0 :(得分:2)

您已在模块GLOB_FOO内重新声明 mod2,而不是重新初始化它。这意味着您有两个参数,一个在编译单元范围内,值为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