在verilog中输入矩阵

时间:2014-06-13 11:20:13

标签: verilog hdl

我想在verilog中输入n * m(n和m是已定义的)矩阵(其中每个元素的长度为32位),但编译器会给出错误。有没有直接的方法呢?我不想写n * m个单独的输入元素。

这就是我尝试过的:input reg [31:0] matrix [0:9][0:12]

这里有什么不对吗?

2 个答案:

答案 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数组。

  • 要启用SystemVerilog,重新启动将文件扩展名从.v更改为.sv,现代模拟器将仅对此文件启用SystemVerilog。或者,您可以启用编译器选项(大多数工具为-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位字。