【问题标题】:How to pass array structure between two verilog modules如何在两个verilog模块之间传递数组结构
【发布时间】:2013-05-04 01:26:17
【问题描述】:

我正在尝试在两个模块之间将数组结构作为 reg [0:31]instructionmem[0:31] 传递。

我编码如下:

模块 1:

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

            ---------------
       endmodule 

模块 2:

         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

我收到此实施的错误。那么我们如何发送这样的数组结构呢?

【问题讨论】:

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

标签: module parameter-passing verilog


【解决方案1】:

这在 Verilog 中是不可能的。 (参见第 12.3.3 节,Verilog 2005 标准文档的语法 12-4,IEEE Std. 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

【讨论】:

    猜你喜欢
    • 2020-03-18
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多