verilog中的可变大小参数数组

variable-sized parameter array in verilog

我在 (system)verilog 中使用参数数组模拟设计时观察到奇怪的行为。

这是我的模块界面:

module src_multi
#(
    parameter NUM_DEST = 4,                  
    parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1] //problematic line
)
(
    ...
);

以及该模块在测试台中的实例化:

src_multi
#(
    .NUM_DEST(3),
    .DEST('{13,12,8})
)
src_src1_outbun
(
      ...
);

这个想法基本上是我希望 DEST 是一个数字数组,条目数应该取决于 NUM_DEST。但是,当DEST如上图声明但未初始化时:

parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1]

modelsim 总是从 DEST 读取值 0,就好像它全是零。

如果我初始化数组如下:

parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1] = '{0,1,2,3}

我收到运行时模拟错误:

# ** Fatal: (vsim-120) Illegal Concat. Number of elements doesn't match with the type.

这是因为在我的实例化中,我希望数组的大小为 3。所以我尝试用大小 3 初始化它(如下所示),并且效果很好!

parameter NUM_DEST = 3,
parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1] = '{0,1,2}

但这迫使我只能为该数组使用一种大小,但我希望它具有可变大小。

如何在 (system)verilog 中使用可变大小的参数数组?

我原以为最后一个会起作用,当您尝试用不同大小的数组覆盖它时会出现什么样的错误?

您可以尝试使用像这个问题中的参数化类型:Override size of a parameter that is an array of a struct in systemverilog

原来这是一个 modelsim 错误。此输入在两个不同的 modelsim 版本上产生不同的结果:

parameter NUM_DEST = 4,
parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1]

modelsim 10.3d = 正确

modelsim 10.1e = 错误

要在所有情况下修复它,我们可以使用参数化的输入数 NUM_DEST 初始化数组,如下所示:

parameter NUM_DEST = 4,
parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1] = '{NUM_DEST{1}}