Arrays 通过systemverilog中的模块传递二维阵列的一维阵列切片

Arrays 通过systemverilog中的模块传递二维阵列的一维阵列切片,arrays,system-verilog,Arrays,System Verilog,我有一个名为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

我有一个名为
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]);
...
..
module2#(参数n=20)(输入符号[n-1:0]xin[0:7][0:7],
输出符号[n-1:0]xout[0:7][0:7]);
genvar i;
生成

对于(i=0;iSystemVerilog),仅允许部分选择(一个片)引用一组相邻位。您必须添加一些组合逻辑,以重组通过端口的阵列

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
for(genvar i=0;i
.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
始终\u开始
foreach(xin[idx0,idx1])开始
xin_旋转[idx1][idx0]=xin[idx0][idx1];
结束
foreach(xout[idx0,idx1])开始//向后旋转
xout[idx0][idx1]=xout_旋转[idx1][idx0];
结束
结束

对于(i=0;i)模块1的端口不应为
[n-1:0]sig[0:7]
而不是
[n-1:0]sig[0:7][0:7]
?是的。对不起,现在我已经更正了帖子。问题仍然有效。这段代码在VCS中运行得非常好。但是当我尝试在Design Vision环境中运行它时,它说不支持构造
“foreach”。我需要添加genvar或类似的东西来使其可合成吗?出于某种原因,一些合成器已经然而,要添加对
foreach
的支持,现在需要使用双for循环。如果可以,请提交一个功能请求,以便在将来的版本中添加它。