【发布时间】:2014-06-23 19:55:16
【问题描述】:
是否可以在 Verilog 中创建 parameter 数组?例如,如下所示:
parameter[TOTAL-1 : 0] PARAM_ARRAY = {1, 0, 0, 2}
如果不可能,有什么替代解决方案?
【问题讨论】:
是否可以在 Verilog 中创建 parameter 数组?例如,如下所示:
parameter[TOTAL-1 : 0] PARAM_ARRAY = {1, 0, 0, 2}
如果不可能,有什么替代解决方案?
【问题讨论】:
给定的示例是将解压缩的值分配给打包的参数数组。这在 Verilog 中是不允许的。
Verilog 仅支持基于简单向量的参数。它不支持解包数组。取代 Verilog 的 SystemVerilog 确实支持参数数组。几乎所有现代 Verilog 模拟器都是真正的 SystemVerilog 模拟器(至少对于商业模拟器而言;开源模拟器支持不完整)。要将文件读取为 SystemVerilog,请将 .v 的文件扩展名更改为 .sv。然后您可以将 unpacked 分配给二维参数数组:
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, 0, 0, 2};
Verilog 没有参数数组,也没有 C 风格的数组初始化,所以你基本上被卡住了。两种传统的解决方案是将所有内容组合成一个大(宽)参数(并使用“源”和“目标”中的循环来打包和解包宽参数,就像您通过数组传递数组一样模块端口),或者重新考虑您的问题以避免使用数组。
您可以在 SystemVerilog 中执行此操作,但您没有问过这个问题。
【讨论】: