icarus verilog 中的多维数组端口支持

Posted

技术标签:

【中文标题】icarus verilog 中的多维数组端口支持【英文标题】:multi dimensional array ports support in icarus verilog 【发布时间】:2020-04-24 23:02:49 【问题描述】:

我正在尝试在我的 systemverilog 代码中使用多维数组作为端口。顶部模块是一个 3 维数组,而子模块是一个 2 维数组。一个简化的测试台和设计如下:

  module TB();

      wire  [3:0]d_inAll  [0:99][0:9];
      wire  [3:0]d_outAll [0:99][0:9];

      genvar iX;
      for (iX=0; iX<100; iX=iX+1)begin
           someDesign DUT_i(.d_in(d_inAll[iX]) , .d_out(d_outAll[iX]));
      end

   endmodule

设计是

module someDesign(input wire [3:0] d_in[0:9],
                  output wire[3:0] d_out [0:9]);

  genvar i;
  for (i=0; i<10; i=i+1)begin
    assign d_out[i] = d_in[i];
  end

endmodule 

我尝试使用 icarus verilog 编译此代码,但失败并出现以下错误。

../elaborate.cc:1439: failed assertion rval_net->pin_count() == prts[0]->pin_count()

这是编译器的错误还是某些功能尚不支持?有没有其他方法可以解决这个问题?我知道我可以扁平化数组,但是,我不想使用它,因为它会使设计更容易出现功能错误。

【问题讨论】:

【参考方案1】:

这是一个错误,因此不受支持。它似乎支持一维未压缩数组端口,因此您可以将数组维度之一移动到压缩侧。

module TB();

      wire  [0:9][3:0]d_inAll  [0:99];
      wire  [0:9][3:0]d_outAll [0:99];

      genvar iX;
  for (iX=0; iX<100; iX=iX+1)begin : fiX
           someDesign DUT_i(.d_in(d_inAll[iX]) , .d_out(d_outAll[iX]));
      end

   endmodule

module someDesign(input wire [0:9][3:0] d_in,
                  output wire[0:9][3:0] d_out);

  genvar i;
  for (i=0; i<10; i=i+1)begin
    assign d_out[i] = d_in[i];
  end
endmodule

【讨论】:

以上是关于icarus verilog 中的多维数组端口支持的主要内容,如果未能解决你的问题,请参考以下文章

Icarus Verilog:多位数组解析错误

如何在icarus verilog中包含文件?

如何使用 Icarus Verilog 在 Verilog 中转换 VHDL 代码?

Icarus Verilog和GTKwave使用简析

编译动态内存模块时 Icarus Verilog 崩溃

为啥不遵守icarus verilog指定的时间?