verilog中的可变大小参数数组

时间:2015-05-26 19:38:55

标签: verilog system-verilog modelsim

在(系统)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}

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

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

2 个答案:

答案 0 :(得分:2)

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

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

modelsim 10.3d =正确

modelsim 10.3d = correct

modelsim 10.1e =错误

modelsim 10.1e = wrong

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

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

答案 1 :(得分:0)

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

您可以尝试使用参数化类型,例如:Override size of a parameter that is an array of a struct in systemverilog