2016-03-08 71 views
3

我收到一個錯誤,提示'索引在信號中不受支持'。從我所看到的錯誤位於非阻塞賦值的左側。爲什麼下面的代碼給出了一個錯誤,有沒有辦法解決它?Verilog:信號不支持變量索引

... 
parameter width = 32; 
parameter size = 3; 

input clk, reset; 
input [width*size-1:0] A; 
input [width*size-1:0] B; 
output [width*size-1:0] result; 

reg signed [width*size-1:0] partials; 
reg signed [width-1:0] temp; 
reg signed [width-1:0] currenta; 
reg signed [width-1:0] currentb; 
wire signed [width-1:0] temp1wire; 
... 
integer k = 0; 
always @ (posedge clk) 
begin 
    currenta[width-1:0] <= A[width*k +: width]; 
    k = k+1 
    currentb[width-1:0] <= B[width*k +: width]; 
    partials[width*k +: width] <= temp1wire; 
end 
Add Add1(clk, temp1wire, currenta, currentb); 
... 

此代碼是一個連續塊,做矢量相加,並保存在partials[width*k +: width]結果的一部分。

+1

在什麼情況下會出現posedge?提供這些細節。 – vim

+2

在哪裏/如何定義寬度? – dwikle

+0

'posedge'是一個關鍵字。你的意思是'posedge clock'嗎? – Greg

回答

1

我發現this在賽靈思論壇:

「XST正常工作與索引部分選擇運算符‘+:’如果是在(LHS),並且起始指標是一個常量,你的情況使用一個變量作爲LHS的起始指標,而且它的右邊(RHS) XST不喜歡,儘管它是合法的。「

1

k在到達size-1後需要夾緊或纏繞。可以使用mod運算符(%)完成包裝。例如:k = (k+1)%size%可能不是最佳合成(檢查你的合成器),因此if語句是一個功能替代if(k==SIZE-1) k = 0; else k=k+1;


建議:
人們普遍重新開始保持參數爲大寫字母,這樣你可以很容易地識別參數形成信號名稱。在順序塊中放置阻塞分配是合法的,但大多數設計規則建議將組合邏輯與順序分配分開。我寧願寫類似下面的代碼:

// $clog is IEEE1364-2005 § 17.11, some synthesizers support it, others don't 
reg [$clog2(SIZE):0] k=0, next_k; 
always @* begin 
    if (k==SIZE-1) begin 
    next_k = 0; // wrap around 
    // next_k = k; // clamp 
    end 
    else begin 
    next_k = k+1; 
    end 
end 
always @ (posedge clk) 
begin 
    currenta[WIDTH-1:0] <= A[WIDTH*k +: WIDTH]; 
    currentb[WIDTH-1:0] <= A[WIDTH*next_k +: WIDTH]; 
    partials[WIDTH*next_k +: WIDTH] <= temp1wire; 
    k <= next_k; 
end