2014-06-13 391 views
1

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

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

这里有什么问题?

+0

约2D阵列的任何想法??我正在使用ModelSim来模拟我的代码。 – user3185902

+0

看起来像它在[EDAplayground](http://www.edaplayground.com/x/SD)编译与我的答案更新。 – Morgan

回答

2

Verilog不支持通过端口传递多维数组。该功能已添加到SystemVerilog中。

在EDAplayground中,ModelSim在启用SystemVerilog的情况下运行。即使您删除了-sv命令选项,SystemVerilog仍将启用,因为测试台和设计文件扩展名为.sv。 SystemVerilog可以在ModelSim中使用-vlog01compat编译选项禁用。添加此选项以摩根的实施例将产生以下错误:(or run here

** Warning: (vlog-2644) Conflicting semantics, "-vlog01compat" switch disables SystemVerilog support.
-- Compiling module dut
** Error: design.sv(4): 'Port' must not be declared to be an array: matrix.
-- Compiling module tb
** Error: testbench.sv(6): (vlog-2110) Illegal reference to memory "data".
** Error: testbench.sv(6): (vlog-2110) Illegal reference to memory "data".
** Warning: testbench.sv(18): (vlog-2644) Conflicting semantics, "-vlog01compat" switch disables SystemVerilog support.

要传递需要启用的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

输入不能reg,更改为wire或见好就收为:

input [31:0] matrix [0:9][0:12] 

我已经穿上EDAplaygorund的例子显示了2D端口的ModelSim 10.1d工作:


这将有一个输入为位宽,你确定这是你想要的吗?

我会建议时间多路复用,使用更快的时钟运行并一次只接受一个样本。当钟控合成必须平衡多条线路时,以及任何相当快速的时钟,您可能很难关闭时序。我会尝试让时钟快130倍,并在每个时钟周期加载32位字。

+0

我需要输入至少这些模块的许多位,我试图做。有没有更好的方法来接受这样的大量投入? – user3185902

+0

这听起来比我想要做的更好...仍然只是用于查询有没有方法来输入2D数组? – user3185902

+0

我无法看到它在规范中提到它,当然它在那里。还在edaplayground上添加了编译链接。我刚刚删除了输入端口中的'reg'声明。 – Morgan