Verilog 将数组缩减为元素之和

Verilog 将数组缩减为元素之和,verilog,Verilog,我试图把一个向量化为它所有元素的和。在verilog中有没有一种简单的方法可以做到这一点 类似于systemverilog.sum方法 谢谢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 = {(

我试图把一个向量化为它所有元素的和。在verilog中有没有一种简单的方法可以做到这一点

类似于systemverilog.sum方法


谢谢

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
参数N=64;
整数i;
reg[7:0]数组[0:N-1]
注册[N+6:0]和;//足够的位来处理溢出
总是@*
开始
总和={(N+7){1'b0}};//全零
对于(i=0;i
我针对此问题的组合解决方案:

//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];
//示例数组
参数单元格=8;
reg[7:0]数组[cells-1:0]={1,2,3,4,5,1,1,1};
//###############################################
genvar i;
导线[7:0]求和步数[cells-2:0]//所有步骤的容器
生成
分配求和步骤[0]=数组[0]+数组[1]//对于成本较低的第一个和(不是数组[0])

对于(i=0;i,在评论此处提供的其他答案时,有一些评论要发表

第一件重要的事情是为累积的总和提供空间。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]
参数NUM_BYTES=4;
reg[7:0]字节数组[NUM_bytes-1:0];
reg[8+$clog2(NUM_字节):0]和[NUM_字节-1:1];
总是开始

对于(int i=1;我可以给出一个有关向量的示例。我确认此方法在Xilinx KCU116的硬件中有效,