求助$signed的用法
第一次:
wire[3:0] a,b,c;
assign a = 4'd5;
assign b = 4'b1110; //-2的补码
assign c = a + b;
仿真结果为4'b0011;
第二次:
wire [3:0] a1,b1;
wire signed [3:0] c1;
assign a1 = 4'd5;
assign b1 = 4'b1010; //-2的原码
assign c1 = $signed(a1) + $signed(b1);
仿真结果为4'1111;
目的是想弄清楚$signed的用法,理解$signed就是自动计算补码,不明白为什么用$signed来计算结果却不正确,求解,谢谢!
$signed表示强制转换成有符号数,你上面的两个数转换前后是不变的,因为位宽都是4bit。
谢谢回复,还是没明白,不知道是不是c1的位宽不够,我将它的位宽改为5之后结果是5'h1f
$signed(4'b1010)是-6
4楼正解 1010的补码是 0101+1 = 0110 = 6
明白了,顶LS
什么意思啊。我在IEEE std 1364-2005看的
regS=$signed(4'b1100);//regS=-4
想计算5-2,第一次手动计算,第二次加$signed来计算,如下:
第一次:
wire[3:0] a,b,c;
assign a = 4'd5;
assign b = 4'b1110; //-2的补码
assign c = a + b;
仿真结果为4'b0011;
a=5,b=14 c=a+b=19,因为c只有4bit,数据溢出,因此c=3
第二次:
wire [3:0] a1,b1;
wire signed [3:0] c1;
assign a1 = 4'd5;
assign b1 = 4'b1010; //-2的原码
assign c1 = $signed(a1) + $signed(b1);
仿真结果为4'1111;
$signed(a1)=5, $signed(b1) =-6 ,c1=-1,因此c1=4'b1111
-4,符号位作为最高位为1, 4的补码为100,因此-4的补码为4'b1100。
有需要关于有符号数的计算,应当利用Verilog 2001所提供的signed及$signed()机制
Verilog会自动进行符号的扩展。有号数与无号数的混合计算:不要在同一个verilog叙述中进行有号数与无号数的计算。应该要分成个别独立的叙述。在一个verilog叙述中只要有一个无号数的操作数,整个算式将被当成无号数进行计算
貌似有点懂了。
