verilog 中模块数组的 defparam

defparam for array of modules in verilog

我正在尝试使用我自己定义的寄存器数组来实现参数化专用内存。

my_register:

module my_register(clk,
                   data_in,
                   write_enable,
                   equal);

parameter WORD_SIZE = 4;

input                           clk;
input       [WORD_SIZE - 1 : 0] data_in;
input                           write_enable;
output                          equal;

reg [WORD_SIZE - 1 : 0] register;

always @(posedge clk) begin
     if (write_enable)
         register = data_in;
end

assign equal = data_in ^ register;
endmodule

在我的顶层模块中:

module my_memory(clk,
                 data_in,
                 write_enable, 
                 matches);

parameter MY_WORD_SIZE = 8;

input                                           clk;
input  [WORD_SIZE - 1 : 0]                      data_in;
input  [(2'b1 << MEMORY_ADDRESS_WIDTH) - 1 : 0] write_enable;
output [(2'b1 << MEMORY_ADDRESS_WIDTH) - 1 : 0] matches;

my_register memory [(2'b1 << MEMORY_ADDRESS_WIDTH) - 1 : 0] (clk, data_in, write_enable, matches);
endmodule

但问题是我无法在顶层模块中覆盖 my_register 的参数 WORD_SIZE

我试过了:

defparam memory.WORD_SIZE = MY_WORD_SIZE;

但这不起作用并给出错误:

WORD_SIZE is not declared under prefix memory

有没有办法覆盖自定义模块数组的参数?

提前致谢

您不能使用 defparam 在一条语句中覆盖一组实例。您必须为每个实例重复 defparam。但是在 Verilog-2001 或 SystemVerilog 中不需要使用 defparam 语句。您可以通过实例化语句内联传递参数。

module my_memory #(parameter MY_WORD_SIZE = 8) ( 
input                                           clk,
input  [WORD_SIZE - 1 : 0]                      data_in,
input  [(2'b1 << MEMORY_ADDRESS_WIDTH) - 1 : 0] write_enable,
output [(2'b1 << MEMORY_ADDRESS_WIDTH) - 1 : 0] matches
);

my_register #(.WORD_SIZE(MY_WORD_SIZE))
     memory [(2'b1 << MEMORY_ADDRESS_WIDTH) - 1 : 0] (clk, data_in, write_enable, matches);
endmodule