如何将常量数组作为模块参数传递?
我想建立一个移位寄存器宽度不同的移位宽度。可能的移位宽度应通过模块参数定义。我尝试了类似下面的内容,但这不起作用。
module ShiftReg
#(
SHIFT_WIDTH = '{1, 2, 4, 8},
WIDTH = $clog2($size(SHIFT_WIDTH))
)
(
...
input logic [WIDTH-1:0] shift_rate_i,
...
);
...
endmodule
这会导致以下错误消息:
** Error: shift_reg.sv(3): Illegal concatenation of an unsized constant.
SystemVerilog中是否可以使用不同宽度的移位寄存器的通用结构?
答案 0 :(得分:1)
并非每个模拟器都支持阵列参数。对于那些,需要使用数组标识符(例如:[]
,[SIZE]
)和条目的位宽来定义数组; int SHIFT_WIDTH [] = '{1, 2, 4, 8}
应该有用。
我在EDAplaygroud上尝试了不同的组合。任何模拟器都不接受排队的数组([$]
)。 VCS支持[]
个排列参数,但在参数定义中它不接受$size()
或.size()
。固定的数组大小适用于VCS和Riviera-PRO。声明大小是一个额外的步骤,但它可以工作。
module ShiftReg
#(
SIZE = 4,
int SHIFT_WIDTH [SIZE] = '{1, 2, 4, 8},
WIDTH = $clog2(SIZE)
//WIDTH = $clog2($size(SHIFT_WIDTH)) // <-- this also works if SHIFT_WIDTH is a fixed size
)
(
...
input logic [WIDTH-1:0] shift_rate_i,
...
);
...
endmodule