我想在verilog中输入n * m(n和m是已定义的)矩阵(其中每个元素的长度为32位),但编译器会给出错误。有没有直接的方法呢?我不想写n * m个单独的输入元素。
这就是我尝试过的:input reg [31:0] matrix [0:9][0:12]
这里有什么不对吗?
答案 0 :(得分:2)
Verilog不支持通过端口传递多维数组。该功能已在SystemVerilog中添加。
在EDAplayground中,ModelSim在启用SystemVerilog的情况下运行。即使您删除-sv
命令选项,仍会启用SystemVerilog,因为测试平台和设计具有.sv
文件扩展名。可以使用-vlog01compat
编译选项在ModelSim中禁用SystemVerilog。将此选项添加到Morgan的示例将生成以下错误:(or run here)
**警告:(vlog-2644)冲突语义,“-vlog01compat”开关禁用SystemVerilog支持。
- 编译模块dut
**错误:design.sv(4):'Port'不能声明为数组:矩阵 - 编译模块tb
**错误:testbench.sv(6):( vlog-2110)非法引用内存“data”。
**错误:testbench.sv(6):( vlog-2110)非法引用内存“data”。
**警告:testbench.sv(18):( vlog-2644)冲突语义,“-vlog01compat”开关禁用SystemVerilog支持。
要传递矩阵,您需要启用SystemVerilog或将矩阵打包成1-Dimenion数组。
-sv
)以强制在所有Verilog文件上启用SystemVerilog。强制启用的主要问题是Verilog变量名称可能与SystemVerilog关键字不冲突。将矩阵转换为简单数组:
parameter DWIDTH=32, XWIDTH=10, YWIDTH=13;
reg [DWIDTH-1:0] matrix [0:XWIDTH-1][0:YWIDTH-1];
reg [DWIDTH*XWIDTH*YWIDTH-1:0] flat;
integer x,y;
always @* begin
for (x=0; x<XWIDTH; x=x+1)
for (y=0; y<YWIDTH; y=y+1)
flat[(x*XWIDTH+y)*DWIDTH +: DWIDTH] = matrix[x][y];
end
reg [DWIDTH-1:0] matrix_rebuild [0:XWIDTH-1][0:YWIDTH-1];
integer xr,yr;
always @* begin
for (xr=0; xr<XWIDTH; xr=xr+1)
for (yr=0; yr<YWIDTH; yr=yr+1)
matrix_rebuild[xr][yr] = flat[(xr*XWIDTH+yr)*DWIDTH +: DWIDTH];
end
答案 1 :(得分:1)
输入不能为reg
,更改为wire
或仅保留为:
input [31:0] matrix [0:9][0:12]
我在EDAplaygorund上放了一个示例,显示了在modelsim 10.1d中工作的2D端口:
这将输入 4160 位宽,你确定这是你想要的吗?
我建议使用时间多路复用,以更快的时钟运行并一次接收一个样本。当时钟合成必须平衡许多电线时,如果您的过程有任何合理的快速时钟,您可能很难关闭时序。我会尝试使时钟快130倍,并在每个时钟周期加载32位字。