Module 如何在两个verilog模块之间传递数组结构

Module 如何在两个verilog模块之间传递数组结构,module,parameter-passing,verilog,Module,Parameter Passing,Verilog,我试图在两个模块之间传递一个数组结构作为reg[0:31]指令EM[0:31] 我将其编码如下: 第一单元: module module1(instructionmem); output reg [0:31]instructionmem[0:31]; ------------------ ----lines of code--- --------------- endmo

我试图在两个模块之间传递一个数组结构作为reg[0:31]指令EM[0:31]

我将其编码如下:

第一单元:

       module module1(instructionmem);
            output reg [0:31]instructionmem[0:31];
            ------------------
            ----lines of code---

            ---------------
       endmodule 
第二单元:

         module module2(instructionmem);
           input [0:31]instructionmem[0:31];
           --------------------------------
           -----line of code---------------
           -------------------------------
           endmodule
试验台:

     module test_bench();
     wire [0:31]instructionmem[0:31];

     module1 m1(instructionmem);
     module2 m2(instructionmem);
     endmodule

我得到了这个实现的错误。那么我们如何发送这样的数组结构呢?

这在Verilog中是不可能的。(见第12.3.3节,Verilog 2005标准文件语法12-4,IEEE标准1364-2005。)

相反,您应该“展平”数组并将其作为简单向量传递,例如:

module module1(instructionmem);
  output [32*32-1:0] instructionmem;
  reg [31:0] instructionmem_array [31:0];

  genvar i;
  generate for (i = 0; i < 32; i = i+1) begin:instmem
    assign instructionmem[32*i +: 32] = instructionmem_array[i]; 
  end endgenerate
endmodule

module module2(instructionmem);
  input [32*32-1:0] instructionmem;
  reg [31:0] instructionmem_array [31:0];

  integer i;
  always @*
    for (i = 0; i < 32; i = i+1)
      instructionmem_array[i] = instructionmem[32*i +: 32];
endmodule

module test_bench(instructionmem);
  output [32*32-1:0] instructionmem;
  module1 m1(instructionmem);
  module2 m2(instructionmem);
endmodule
模块1(指令EM);
输出[32*32-1:0]指令EM;
reg[31:0]指令内存数组[31:0];
genvar i;
为(i=0;i<32;i=i+1)生成开始:instmem
分配指令mem[32*i+:32]=指令mem_数组[i];
结束生成
端模
模块2(指令EM);
输入[32*32-1:0]指令EM;
reg[31:0]指令内存数组[31:0];
整数i;
总是@*
对于(i=0;i<32;i=i+1)
指令内存数组[i]=指令内存[32*i+:32];
端模
模块测试台(说明书EM);
输出[32*32-1:0]指令EM;
模块1 m1(指令EM);
模块2 m2(说明EM);
端模

您是否尝试定义为
output/input reg/wire[31:0]指令mem[0:31],即切换宽度定义的顺序。是的,我尝试过,但也不起作用。我相信这仅在SystemVerilog中受支持,您是否有时通过使用.sv文件扩展名或使用-sv标志运行来启用SystemVerilog模式