关于hdl:Verilog中的参数数组

Parameter array in Verilog

是否可以在verilog中创建参数数组? 例如,如下所示:

1
parameter[TOTAL-1 : 0] PARAM_ARRAY = {1, 0, 0, 2}

如果不可能,替代解决方案是什么?

提前致谢


给定的示例将未打包的值分配给打包的参数数组。 Verilog不允许这样做。

Verilog仅支持基于简单矢量的参数。它不支持解压缩的数组。替代了Verilog的SystemVerilog确实支持参数数组。几乎所有现代Verilog模拟器实际上都是SystemVerilog模拟器(至少对于商业模拟器而言;开源模拟器没有完全支持)。要将文件读取为SystemVerilog,请将.v的文件扩展名更改为.sv。然后,您可以将解压缩后的数据分配给二维参数数组:

1
parameter [7:0] PARAM_ARRAY [TOTAL-1 : 0]   = {8'd1, 8'd0, 8'd0, 8'd2};

类型名称也被允许。例如,使用integer创建一个32x4数组:

1
parameter integer PARAM_ARRAY [TOTAL-1 : 0]   = {1, 0, 0, 2};

记录在:

  • IEEE Std 1364-2001 3.11参数
  • IEEE Std 1364-2005 4.10参数
  • (SystemVerilog)IEEE Std 1800-2012 6.20常量

作为纯Verilog解决方案,您将需要创建一个长向量:

1
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或更高版本(甚至大多数开源模拟器都支持)。用+索引向量和数组:


Verilog没有参数数组,也没有C样式的数组初始化,因此您基本上陷入了困境。两种传统的解决方案是将所有内容组合为一个大的(宽)参数(并使用"源"和"目标"中的循环来打包和拆包宽参数,就像您通过一个数组传递一个数组一样)。模块端口),或者重新考虑您的问题以避免使用阵列。

您可以在SystemVerilog中完成此操作,但是您没有对此提出疑问。