verilog中可变大小的参数数组

verilog中可变大小的参数数组,verilog,system-verilog,modelsim,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),

在(系统)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\u 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}
parameter NUM_DEST = 4,
parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1] = '{NUM_DEST{1}}
我得到一个运行时模拟错误:

# ** 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中使用可变大小的参数数组?

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


您可以尝试使用如下问题中的参数化类型:

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

parameter NUM_DEST = 4,
parameter [N_ADDR_WIDTH-1:0] DEST [0:NUM_DEST-1]
modelsim 10.3d=正确

modelsim 10.1e=错误

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

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

我得到这个错误(也写在问题中)
#**致命:(vsim-120)非法Concat。元素数与类型不匹配。
oops,很抱歉我错过了。我猜你同时也改变了数量?