通过systemverilog中的模块传递二维数组的一维数组切片

Pass a slice of 1D array of 2D array through module in systemverilog

我有一个名为 module2 的模块,它具有用于输入和输出的 2D 解压缩数组。我想将每一列输入和输出传递给模块 module1。我尝试用以下方式编写代码。但它在 .xin(xin[0:7][i]).
中显示语法错误 通过模块传递数组切片的正确语法是什么?

module module2 #(parameter n=20) (input signed [n-1:0] xin [0:7][0:7],
                            output signed [n-1:0] xout [0:7][0:7]);

genvar i;
generate
for (i=0;i<=7;i=i+1) begin:block1
module1 #(.n(n)) l1(.xin(xin[0:7][i]),.xout(xout[0:7][i]));
endgenerate
endmodule

module module1 #(parameter n=10) (input signed [n-1:0] xin [0:7],
                                  output signed [n-1:0] xout [0:7]);
...
..

SystemVerilog 只允许引用一组相邻位的部分选择(切片)。您将不得不添加一些组合逻辑来改造通过端口传递的数组。

for (genvar i=0;i<=7;i++) begin:block1
 logic signed [n-1:0] _xin[0:7], _xout[0:7];
 always_comb foreach(_xin[j]) __xin[j] = xin[j][i];
 always_comb foreach(_xout[j])  xout[j][i] = _xout[j];
 module1 #(.n(n)) l1(.xin(_xin),.xout(_xout));
end

.xin(xin[0:7][i]) 不是数组索引的合法语法。你可以做 .xin(xin[i][0:7]).xin(xin[i]).

您可以扩展数组以从特定的第二个索引中获取所有第一个索引的 [0:7]

.xin({xin_rotate[0][i],xin_rotate[1][i],xin_rotate[2][i],xin_rotate[3][i],
      xin_rotate[4][i],xin_rotate[5][i],xin_rotate[6][i],xin_rotate[7][i]})

或者创建另一个数组用于旋转:

always_comb begin
  foreach(xin[idx0,idx1]) begin
    xin_rotate[idx1][idx0] = xin[idx0][idx1];
  end
  foreach(xout[idx0,idx1]) begin // rotate back
    xout[idx0][idx1] = xout_rotate[idx1][idx0];
  end
end
for (i=0;i<=7;i=i+1) begin : block1
  module1 #(.n(n)) l1(.xin(xin_rotate[i]),.xout(xout_rotate[i]));
end : block1