是否可以在verilog中创建参数数组?例如,类似以下内容:
parameter[TOTAL-1 : 0] PARAM_ARRAY = {1, 0, 0, 2}
如果不可能,那可能是替代解决方案?
提前致谢
答案 0 :(得分:9)
给出的示例是将解压缩的值分配给压缩参数数组。 Verilog不允许这样做。
Verilog仅支持简单的基于矢量的参数。它不支持解压缩的数组。 SystemVerilog取代了Verilog,它支持参数数组。几乎所有现代Verilog仿真器都是SystemVerilog仿真器(至少对于商业仿真器而言;开源仿真器具有不完全的支持)。要将文件读取为SystemVerilog,请将.v的文件扩展名更改为.sv。然后,您可以将解压缩分配给2维参数数组:
parameter [7:0] PARAM_ARRAY [TOTAL-1 : 0] = {8'd1, 8'd0, 8'd0, 8'd2};
也允许使用类型名称。例如,使用integer
创建一个32x4数组:
parameter integer PARAM_ARRAY [TOTAL-1 : 0] = {1, 0, 0, 2};
记录在:
作为纯Verilog解决方案,您需要创建一个长向量:
parameter [8*TOTAL-1:0] PARAM_ARRAY = {8'd1, 8'd0, 8'd0, 8'd2};
然后使用切片作为硬编码PARAM_ARRAY[7:0]
或使用+:
:PARAM_ARRAY[8*index +: 8]
进行访问。请注意,+:
需要Verilog-2001或更高版本(甚至大多数开源模拟器都支持)。 Indexing vectors and arrays with +:
答案 1 :(得分:1)
Verilog没有参数数组,并且它没有C风格的数组初始化,所以你基本上卡住了。两种传统的解决方案是将所有内容组合成一个大(宽)参数(并使用'source'和'destination'中的循环来打包和解包宽参数,就像你通过一个数组传递一个数组一样模块端口),或者重新考虑你的问题以避免使用数组。
您可以在SystemVerilog中执行此操作,但您没有问过这个问题。