此文為 "How to use signed variable in System Verilog" 中文版
版權歸作者monokent所有,轉載請注明出處
示例 1
在Verilog語言中,有符號數(shù)signed以2進制補碼形式表示。
下例中,我們聲明一個變量為signed類型,并用sd表示有符號整數(shù)。
logic signed [35:0] c0, c1;
logic signed [17:0] a0, a1;
always@(*) begin
c0 <= a0 * 18'sd2017;
c1 <= a1 * -18'sd2016;
end
其中, sd 表示 signed decimal.
示例 2
在示例1中,如果我們寫
c1 <= a1 * -18'd2016;
結果會出錯,因為Verilog視 -18'd2016為無符號數(shù)(unsigned),從而將其轉化為一個正的值。
那如果我們將示例1中的c0賦值寫成如下形式呢?
c0 <= a0 * 18'd2017
結果也是錯誤的,因為如果表達式中有一個無符號數(shù),則所有的操作數(shù)都會被強行轉換為無符號數(shù)。這樣的話,如果a0為負數(shù),則其會被轉換為正數(shù)導致出錯。
示例 3
右移一個有符號數(shù)
assign c0_normal = c0 >>> 17;
">>>" 是專門針對signed信號的右移符號
示例 4
下面各表達式的結果是多少?
integer a;
a = -18 / 3; // -6
a = -6'd18 / 3; // 23
a = -6'sd18 / 3 // -6
a = -5'sd18 / 3 // (14/3)=4