此文为 "How to use signed variable in System Verilog" 中文版
版权归作者monokent所有,转载请注明出处
示例 1
在Verilog语言中,有符号数signed以2进制补码形式表示。
下例中,我们声明一个变量为signed类型,并用sd表示有符号整数。
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为无符号数(unsigned),从而将其转化为一个正的值。
那如果我们将示例1中的c0赋值写成如下形式呢?
c0 <= a0 * 18'd2017
结果也是错误的,因为如果表达式中有一个无符号数,则所有的操作数都会被强行转换为无符号数。这样的话,如果a0为负数,则其会被转换为正数导致出错。
示例 3
右移一个有符号数
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