我有一个模块参数,它是预定义结构的数组。我将此数组的默认大小设置为1个元素。我们的想法是在实例化时用适当的大小覆盖它。
我在下面显示的方式不会覆盖大小。它只覆盖第一个值。我可以看到为什么它会这样做,因为size字段没有参数化。有没有比传递大小参数更好的方法?
感谢您的帮助。
module reg_slave
#(parameter
reg_pkg::defval_pair [0:0] REG_DEFVAL = '0 //param decl with size=1
)();
endmodule : reg_slave
module top();
localparam reg_pkg::defval_pair [1:0] REG_DEFVAL = '{
{3,'h32},
{0,'h1}
}; //param of same type and size = 2
reg_slave #(
.REG_DEFVAL(REG_DEFVAL) //trying to override the size.
)
reg_slave_inst ();
endmodule : top
package reg_pkg;
typedef struct packed { int ADDR; bit [31:0] VAL;} defval_pair;
endpackage : reg_pkg
答案 0 :(得分:2)
您需要一个额外的大小参数:
module reg_slave
#(parameter
int SIZE=1,
reg_pkg::defval_pair [SIZE-1:0] REG_DEFVAL = '0 //param decl with size=1
)();
endmodule : reg_slave
在REG_DEFVAL
中分配top
时遇到一些错误。 REG_DEFVAL
是一个打包数组,因此删除单个数组。 defval_pair
是packed struct
,因此条目需要投射作业:
module top();
localparam int SIZE=2;
localparam reg_pkg::defval_pair [SIZE-1:0] REG_DEFVAL = { // no single quite
reg_pkg::defval_pair'{3,'h32}, // cast as defval_pair
reg_pkg::defval_pair'{0,'h1} // cast as defval_pair
}; //param of same type and size = 2
reg_slave #( .SIZE(SIZE), // override size
.REG_DEFVAL(REG_DEFVAL)
)
reg_slave_inst ();
endmodule : top
UPDATE :传递N size数组参数而不传递SIZE参数。
注意:这很可能不是可合成的。 SystemVeilog对此功能的支持可能因模拟器而异。
module reg_slave
#(parameter
reg_pkg::defval_pair REG_DEFVAL [] = '{ reg_pkg::defval_pair'{0,'h0} } //param decl with size=1
)();
endmodule : reg_slave
module top();
localparam reg_pkg::defval_pair REG_DEFVAL [] = '{ // with single quite
reg_pkg::defval_pair'{3,'h32}, // cast as defval_pair
reg_pkg::defval_pair'{0,'h1} // cast as defval_pair
}; //param of same type and size = 2
reg_slave #(
.REG_DEFVAL(REG_DEFVAL)
)
reg_slave_inst ();
endmodule : top
答案 1 :(得分:2)
使用类型参数。但是,您仍需要一个额外的参数传递给实例。优点是您可以更改参数的类型。
module reg_slave
#(parameter
type T = int,
T REG_DEFVAL = '0 //param decl with size=1
)();
endmodule : reg_slave
module top();
localparam reg_pkg::defval_pair [1:0] REG_DEFVAL = '{
{3,'h32},
{0,'h1}
}; //param of same type and size = 2
reg_slave #(
.T(reg_pkg::defval_pair[1:0]),
.REG_DEFVAL(REG_DEFVAL) //trying to override the size.
)
reg_slave_inst ();
endmodule : top