我正在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中的中間結果的數據類型是否有文檔?這是很難搜索,因爲我還不知道適當的術語。
偉大的回答,正是我一直在我尋找更多。這是一個邏輯設計類,所以我不認爲將a和b聲明爲帶符號的向量會飛(需要顯示我理解二進制補碼的工作方式),但這對於將來的分配很有用。有趣的論文,這可能會使我的未來自己從一些痛苦的調試中解脫出來。謝謝! –
「a + b」的寬度實際上取決於上下文。如果將其分配給比max(sizeof(b),sizeof(b))'寬1位的表達式,則將以更大的尺寸評估表達式。 IEEE 1364明確列出了這個例子,但似乎並沒有將上下文規則嚴格描述爲自我確定的情況。 –