从2D数组SystemVerilog中给2D数组赋值



我是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循环,例如(基于手动代码):
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 

你必须算出确切的数字。

相关内容

  • 没有找到相关文章