数组作为模块参数

问题描述 投票:1回答:1

如何将常量数组作为模块参数传递?

我想建立一个不同移位宽度的移位寄存器。可能的移位宽度应通过模块参数定义。我尝试了类似以下的操作,但这不起作用。

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中,这样通用的移位寄存器的宽度宽度是否可以构造?

verilog system-verilog hdl
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.