2014-01-21 62 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]