在(系统)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中使用可变大小的参数数组?
答案 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.1e =错误
要在所有情况下修复它,我们可以使用参数化的输入数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