在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]);
...
..

.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

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

最新更新