关于verilog中$signed疑惑
时间:10-02
整理:3721RD
点击:
$signed的作用是将无符号数强制转换成有符号数,但是verilog里面的数据都是二进制码流,用不用$signed存的数据都一样,那$signed应该什么时候使用呢?求大神解惑。比如:
dout1 <= $signed ( din + 1 );
dout2 <= $signed ( din ) + 1;
dout3 <= din + 1;
其中din = 4’b1010, 仿真结果:dout1 = dout2 = dout3 = 4'b1011;既然结果一样为什么还要用$signed,至于到底是有符号数还是无符号数应该读取数据的时候要考虑的。
求大神解惑,谢谢。
dout1 <= $signed ( din + 1 );
dout2 <= $signed ( din ) + 1;
dout3 <= din + 1;
其中din = 4’b1010, 仿真结果:dout1 = dout2 = dout3 = 4'b1011;既然结果一样为什么还要用$signed,至于到底是有符号数还是无符号数应该读取数据的时候要考虑的。
求大神解惑,谢谢。
求大神解惑
为了计算啊,-2+1=-1,要是不是有符号的肯定就算错了。
-2的补码是4‘b1110, -2 + 1, 按照上边三个计算的结果是一样的,输出都是4’b1111,它就是-1的补码。换句话说用不用$signed输出结果都是一样的。
好吧,首先,你犯了一个错误,就是两个数相加,其结果的位宽要比两个相加的数的最大位宽大1bit对吧,要不然数据肯定会出现截断错误,然后你在对每个数据进行遍历相加,就知道结果不同了,不要一点盖全。仿真要有覆盖率。比如-8+0=4'b1000+0000=5'b01000,这个数据等于?
-8的补码不是4‘b1000
请写出正确答案
4bit表示-8不超范围?
4bit的范围不是4'b1000~4'b0111?
基础不过关啊,4bit有符号数表示范围:-8~+7
翻了一下书,自己无知了,一直以为补码也有两个0.
所以要多多交流嘛
$signed影响的是不同位数的数做运算的时候的符号位扩展,比如8'b0000_0011 + 4'b1111,如果是有符号运算,低位数的操作数会向左边填充它的最高位数字直至填满8位变成8'b1111_1111再跟8'b0000_0011相加,保证填充后的运算结果符合预期。如果不加$signed描述,默认无符号运算左边填充全0
