2011-11-04 91 views
3

我正在Verilog中創建一個帶符號的比較器。這裏是代碼:算術運算結果的大小Verilog

module signedComparator(a0, a1, a2, b0, b1, b2, G, E, L); 
input a0, a1, a2, b0, b1, b2; 
output reg G, E, L; 

[email protected](a0 or a1 or a2 or b0 or b1 or b2) 
begin 

    if(a2 == 0 && b2 == 0) //both a and b >= 0 
    begin 
     L <= {a1,a0} < {b1,b0}; 
     G <= {a1,a0} > {b1,b0}; 
     E <= {a1,a0} == {b1,b0}; 
    end 
    else if(a2 == 1 && b2 == 0) //a negative, b >= 0 
    begin 
     L <= 1; 
     G <= 0; 
     E <= 0; 
    end 
    else if(a2 == 0 && b2 == 1) //a >= 0, b negative 
    begin 
     L <= 0; 
     G <= 1; 
     E <= 0; 
    end 
    else //both a and b negative 
    begin 
     L <= (~{a1,a0} + 1) > (~{b1,b0} + 1); 
     G <= (~{a1,a0} + 1) < (~{b1,b0} + 1); 
     E <= (~{a1,a0} + 1) == (~{b1,b0} + 1); 
    end 

end 
endmodule 

我想知道,當添加向量時,中間結果的長度是多少?我擔心最後一個案例(L <= (~{a1,a0} + 1) > (~{b1,b0} + 1);)。當加1到〜{a1,a0}時,是比較結果長度的三位,還是{1,1} + 1 = {0,0}? Verilog中的中間結果的數據類型是否有文檔?這是很難搜索,因爲我還不知道適當的術語。

回答

5

我假設這是用於綜合,並有一些關於你的代碼的評論。您似乎將單個位用作模塊的輸入,然後使用級聯來製作向量。您可以通過將端口聲明爲有符號向量並直接進行比較來避免這種情況。

input signed [2:0] a,b; 
... 
if(a == b) 
... 
else if(a > b) 
... 
else 
... 

另外,您正在使用非阻塞賦值來模擬組合邏輯。這些將在您發佈的代碼中起作用,但實際上不應以這種方式使用。他們通過時鐘控制過程更好地模擬同步邏輯。有一個good paper總結了一個很好的合成編碼風格。

我想知道,添加向量時,中間結果的長度是多少?

該規範有一個表,因爲它取決於操作數和上下文。

  • 一個整數:未施膠的常數是至少32位
  • {A,B}:的sizeof(A)+的sizeof(b)中
  • 〜{A}:的sizeof(A)
  • a + b:max(sizeof(a),sizeof(b))

因此,您的比較操作數都將是(至少)32位。您可以通過在值前面使用刻度明確指定一個常量大小。

4'b1 // 0001 Binary 1 
4'd1 // 0001 Decimal 1 
4'd8 // 1000 Decimal 8 
1'b1 // 1 Binary 1 
'b1 // The same as 1, tick here only specifies dec/oct/bin format 

是否有文件某處的 中間結果的Verilog的數據類型是什麼?

到目前爲止,我已經找到了這樣的細節最好的資源是規範本身,IEEE 1364

+0

偉大的回答,正是我一直在我尋找更多。這是一個邏輯設計類,所以我不認爲將a和b聲明爲帶符號的向量會飛(需要顯示我理解二進制補碼的工作方式),但這對於將來的分配很有用。有趣的論文,這可能會使我的未來自己從一些痛苦的調試中解脫出來。謝謝! –

+0

「a + b」的寬度實際上取決於上下文。如果將其分配給比max(sizeof(b),sizeof(b))'寬1位的表達式,則將以更大的尺寸評估表達式。 IEEE 1364明確列出了這個例子,但似乎並沒有將上下文規則嚴格描述爲自我確定的情況。 –