将单行二维数组作为输入传递给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中的模块的主要内容,如果未能解决你的问题,请参考以下文章