Verilog中的参数数组

时间:2014-05-07 02:21:37

标签: verilog hdl

是否可以在verilog中创建参数数组?例如,类似以下内容:

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

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

提前致谢

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};

记录在:

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

作为纯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中执行此操作,但您没有问过这个问题。