将二维数组的一行作为输入传递给 verilog 中的模块
Passing a single row of a 2d array as an input to a module in verilog
我想知道是否有任何方法可以将二维值数组的一行作为输入传递给 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()
有人可以帮我解决这个问题吗?
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 中的模块。
假设我的数组是这样定义的:
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()
有人可以帮我解决这个问题吗?
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, ....);