将数组减少为元素之和

时间:2014-01-21 16:38:41

标签: verilog

我正在尝试将矢量减少为所有元素的总和。在verilog中有一个简单的方法吗?

与systemverilog .sum方法类似。

由于

3 个答案:

答案 0 :(得分:2)

Verilog没有像SV那样的内置数组方法。因此,for循环可用于执行所需的功能。例如:

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

答案 1 :(得分:1)

在批评这里提供的其他答案时,有一些评论要做。

第一个重要的事情是为累积的总和提供空间。 RTL中的以下语句不会这样做:

sum = sum + array[i]

因为在表达式右侧(RHS)创建的每个唯一网都被分配回称为“sum”的相同信号,导致其中哪个唯一网络实际上是驱动程序的模糊性(称为多重驾驶员危险)。为了解决这个问题,这个陈述也会产生一个组合循环问题,因为sum是组合使用来驱动自己 - 不好。如果可以将不同的东西用作负载并且在循环的每次连续迭代中作为驱动程序,那将会是好事。

回到论证,在上述情况下,大多数模拟器工具将信号驱动到一个未知值(因为:它应该选择哪个驱动程序?所以假设它们都没有,或者它们都是正确的 - 未知!!)。那就是如果它设法完全通过编译器(这不太可能,并且它至少在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]

答案 2 :(得分: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];