Verilog多维数组切片实例化模块报错的解决问询
解决iVerilog中二维数组切片连接模块端口的报错问题
问题根源
你遇到的报错是由于iVerilog的-g2012模式暂不支持将二维数组的切片(如a[i])直接连接到模块端口,这属于工具自身的功能局限性,并非代码违反Verilog-2012语法标准。
解决方法
以下两种方案均可绕过该限制,同时保持模块动态生成的能力,无需硬编码实例:
方案1:将二维数组展开为一维数组传递
把端口定义为一维数组,通过索引范围选择的方式拆分出对应组的元素,传递给子模块:
`include "src/elementwise_multiplication.v" module parallel_elementwise_multiplication_dynamic #(parameter N = 8, parameter M = 2) ( input wire [N-1:0] a [0:M*N-1], input wire [N-1:0] b [0:M*N-1], output wire [2*N-1:0] result [0:M*N-1] ); genvar i; generate for (i = 0; i < M; i = i + 1) begin : instantiate_multiplication localparam start_idx = i * N; elementwise_multiplication #(N) inst ( .a(a[start_idx +: N]), .b(b[start_idx +: N]), .result(result[start_idx +: N]) ); end endgenerate endmodule
方案2:使用临时一维数组中转
在generate块内定义临时一维数组,先将二维数组切片的元素逐个赋值给临时数组,再连接到子模块端口:
`include "src/elementwise_multiplication.v" module parallel_elementwise_multiplication_dynamic #(parameter N = 8, parameter M = 2) ( input wire [N-1:0] a [0:M-1][0:N-1], input wire [N-1:0] b [0:M-1][0:N-1], output wire [2*N-1:0] result [0:M-1][0:N-1] ); genvar i, j; generate for (i = 0; i < M; i = i + 1) begin : instantiate_multiplication wire [N-1:0] temp_a [0:N-1]; wire [N-1:0] temp_b [0:N-1]; wire [2*N-1:0] temp_result [0:N-1]; // 中转二维数组切片与临时数组 for (j = 0; j < N; j = j + 1) begin : assign_temp assign temp_a[j] = a[i][j]; assign temp_b[j] = b[i][j]; assign result[i][j] = temp_result[j]; end elementwise_multiplication #(N) inst ( .a(temp_a), .b(temp_b), .result(temp_result) ); end endgenerate endmodule
内容的提问来源于stack exchange,提问作者katanta
相关产品推荐
相关产品推荐

