在Verilog中如何使用signed信号(有符号数)

此文为 "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

你可能感兴趣的:(在Verilog中如何使用signed信号(有符号数))