2014-01-21 61 views
2

我试图将矢量减少为它所有元素的总和。有没有一种简单的方法在Verilog中做到这一点?将数组减至元素的总和

与systemverilog .sum方法类似。

谢谢

+1

你可以给一个有问题的向量的例子。 – Morgan

回答

2

Verilog没有任何像SV这样的内置数组方法。因此,可以使用for-loop来执行所需的功能。例如:

parameter N = 64; 
integer i; 
reg [7:0] array [0:N-1] 
reg [N+6:0] sum; // enough bits to handle overflow 

always @* 
begin 
    sum = {(N+7){1'b0}}; // all zero 
    for(i = 0; i < N; i=i+1) 
    sum = sum + array[i]; 
end 
0

我对这个问题的解决方案组合:

//example array 
parameter cells = 8; 
reg [7:0]array[cells-1:0] = {1,2,3,4,5,1,1,1}; 

//############################################### 

genvar i; 
wire [7:0] summation_steps [cells-2 : 0];//container for all sumation steps 
generate 
    assign summation_steps[0] = array[0] + array[1];//for less cost starts witch first sum (not array[0]) 
    for(i=0; i<cells-2; i=i+1) begin 
     assign summation_steps[i+1] = summation_steps[i] + array[i+2]; 
    end 
endgenerate 
wire [7:0] result; 
assign result = summation_steps[cells-2]; 
0

在批评送到这里其他的答案,也有一些意见作出。

第一个重要的事情是提供积累的空间。语句,如以下,RTL,不会那样做:

sum = sum + array[i]

因为每个表达式的右手边(RHS)创造了独特的网都被分配回同一称为“总和”的信号,导致在哪个独特的网络实际上是驾驶员(被称为多驾驶员危险)中含糊不清。为了解决这个问题,这个陈述也产生了一个组合式的循环问题,因为总和被联合使用来驱动自己 - 这不太好。什么是好的是,如果不同的东西可以用作负载,并作为循环的每个连续迭代司机....

回到说法虽然,在上述情况下,信号将被驱动到大多数模拟器工具的未知值(因为:它应该选择哪个驱动程序?所以假设它们都不是正确的,或者它们全都是正确的 - 未知的!)。这就是说,如果它能够完全通过编译器(这不太可能,而且至少在Cadence IEV中)。

正确的做法是设置以下内容。假设你是总结字节:

parameter NUM_BYTES = 4; 
reg [7:0] array_of_bytes [NUM_BYTES-1:0]; 
reg [8+$clog2(NUM_BYTES):0] sum [NUM_BYTES-1:1]; 

always @* begin 
    for (int i=1; i<NUM_BYTES; i+=1) begin 
     if (i == 1) begin 
      sum[i] = array_of_bytes[i] + array_of_bytes[i-1]; 
     end 
     else begin 
      sum[i] = sum[i-1] + array_of_bytes[i]; 
     end 
    end 
end 

// The accumulated value is indexed at sum[NUM_BYTES-1]