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
我正在尝试使用我自己定义的寄存器数组来实现参数化专用内存。
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