我是SystemVerilog的新手,我试图从另一个2D数组中分配一个值给2D数组,但每次我编译这个错误程序:
Error: (vlog-13069) ../src/daddattree/daddattree .sv(75): near "[":语法错误,unexpected '['.
代码如下:
module daddaTree import globals ::*; (
input wire signed [24:0]PP[8],
output wire [31:0]C,
output wire [31:0]S );
// layers of the reduction tree
wire [31:0]l3[8];
wire [31:0]l2[5];
wire [20]Tout_l3;
// zero paffing of the inputs partial products
assign l3[0] = 8'b00000000 & PP[0];
assign l3[1] = 7'b0000000 & PP[1] & 1'b0;
assign l3[2] = 6'b000000 & PP[2] & 2'b00;
assign l3[3] = 5'b00000 & PP[3] & 3'b000;
assign l3[4] = 4'b0000 & PP[4] & 4'b0000;
assign l3[5] = 3'b000 & PP[5] & 5'b00000;
assign l3[6] = 2'b00 & PP[6] & 6'b000000;
assign l3[7] = 1'b0 & PP[7] & 7'b0000000; // MSB for carry of the layer
// bit with no compression
// [4:0]l2[0:4] = '{l3{[4:0][0:4]}}; ERRORS HERE
// assign l2[5][1:4] = l3[5][2:5];
// assign l2[6][2:4] = l3[6][3:6];
// assign l2[7][3:4] = l3[7][6:7];
endmodule
我可以将整个raw of bit赋值为assign l3[0] = 8'b00000000 & PP[0];
,但是当我必须将数组的切片赋值给另一个切片时,编译器会给我上面的错误。
我的意思是如何分配例如:
l3 from column 0 to 4, from raw 0 to 4">
"l2从列0到4,从原始0到4">
以为例,l2的[0:4]列的[4:0]位应该有l3的[0:4]列的[4:0]位作为输入,它们是0,或者是从另一个模块接收到的PP值,因此是未知值。
我可以手动完成作业,直到某一点:
// bit without compression
assign l2[0][0] = l3[0][0]; // c0
assign l2[1][0] = l3[1][0]; // c1
assign l2[1][1] = l3[1][1];
assign l2[2][0] = l3[2][0]; // c2
assign l2[2][1] = l3[2][1];
assign l2[2][2] = l3[2][2];
assign l2[3][0] = l3[3][0]; // c3
assign l2[3][1] = l3[3][1];
assign l2[3][2] = l3[3][2];
assign l2[3][3] = l3[3][3];
assign l2[4][0] = l3[4][0]; // c4
assign l2[4][1] = l3[4][1];
assign l2[4][2] = l3[4][2];
assign l2[4][3] = l3[4][3];
assign l2[4][4] = l3[4][4];
assign l2[5][1] = l3[5][2]; // c5
assign l2[5][2] = l3[5][3];
assign l2[5][3] = l3[5][4];
assign l2[5][4] = l3[5][5];
但是在这种情况下也会出现错误
错误(抑制):../src/daddata tree/daddaTree.sv(95): (vlog-2698)索引5到数组维度1 'l2'越界
请有人告诉我如何分配它?
感谢[4:0]l2[0:4] = '{l3{[4:0][0:4]}}
——它应该是什么意思?难怪会有语法错误。我猜,你想要这样的东西:赋值l2[0:4][4:0] = l3[0:4][4:0]这是不可能的,因为你取了一个低维的切片。
对于索引越界,l2声明为wire [31:0]l2[5];
,其中外索引为[5],即[0:4]。所以,当你试图使用索引5时,它是越界的,因为最大值是4.
for(genvar i = 0; i <= 4; i++) begin: L1
for (genvar j = 0; j < i; j++) begin: L2
assign l2[i][j] = l3[i][j];
end
end
或者像这样:
for(genvar i = 0; i <= 4; i++) begin: L1
assign l2[i][i:0] = l3[i][i:0];
end
你必须算出确切的数字。