将单行二维数组作为输入传递给verilog中的模块

Posted

技术标签:

【中文标题】将单行二维数组作为输入传递给verilog中的模块【英文标题】:Passing a single row of a 2d array as an input to a module in verilog 【发布时间】:2020-06-01 14:30:18 【问题描述】:

我想知道是否有任何方法可以将二维数组的单行作为输入传递给 Verilog 中的模块。

假设我的数组是这样定义的:

   reg[15:0] arr[0:9][0:63];
   ...
   ...
   mod1 m(..., arr[5], ....);

mod1 的定义为:

module mod1 (..., input[15:0] arr[0:63],...);
...
...
endmodule

我使用 icarus verilog 作为我的编译器。当我使用-g2012 标志编译时,它会抛出以下错误:

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

有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

iverilog 的 SystemVerilog 支持有限。启用-g2012 标志后,它可以跨端口传递多维数组。您正在使用的版本和 EDAplayground 上可用的版本,无法自动将多维结构转换为另一个多维结构。这是一个工具限制,而不是 IEEE1800 LRM 中的限制。

对于我可用的版本(从 2014 年开始),我必须创建一个中间翻译。

reg[15:0] arr[0:9][0:63];
reg[15:0] arr5[0:63];
...
always @* begin // should be always_comb; 2014 version does not support it
  foreach(arr5[idx])
    arr5[idx] = arr[5][idx];
end
...
mod1 m(..., arr5, ....);

【讨论】:

以上是关于将单行二维数组作为输入传递给verilog中的模块的主要内容,如果未能解决你的问题,请参考以下文章

Verilog里数组是怎么在例化中传递到下一模块的?

verilog模块端口为二维数组如何调用?

如何将 C# 中的二维数组传递给 C++ DLL?

无法将二维数组传递给 C++ 中的辅助函数

将二维字符串数组传递给函数时出错 (C++)

如何将二维数组作为 multiprocessing.Array 传递给 multiprocessing.Pool?