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}}
我在 (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}}