关于signed、有符号数、算数左移、算数右移、$signed()、$unsigned()的理解。
1、signed可以和reg和wire联合使用,用于定义有符号数。在代码中使用负的十进制数赋值给有符号数,在电路中是按该数值的补码形式存储的。如下:
wire signed a;
assign a = -8'd1;
使用display显示a的二进制=11111111,十进制= -1,如下:
$display("signed a =%b=%d",a,a); //signed a =11111111= -1
2、使用signed定义的类型,做加法或乘法时,对操作数扩位处理时高位补符号位;即负数补1,正数补0;不使用signed的无符号类型,高位默认补0。
reg signed [7:0]a,b;
wire signed [8:0]sum1;
reg [7:0] c,d;
wire [8:0]sum2;
initial
begin
a = -8'd1;
b = 8'd2;
c = 8'b1000_0001;
d = 8'b0000_0010;
end
assign sum1 = a+b;
assign sum2 = a+b;
其中有符号计算时,在电路中a=1111_1111,b=0000_0010;sum1比a和b多1bit,在加法结构中a扩位为1_1111_1111,b扩位为0_0000_0010,相加为10_0000_0001,保留9bit后sum1=1