常识:
- signed&unsigned只在operation下才有意义;无论对signed or unsigned赋值,都是对binary code的传递。数据在模块间相互传递时,均按照下面赋值规律。(warning: unsigned [3:0] a = signed [3:0] b,在这种情况下,若后续进行任何涉及到拓宽的运算,error)
- signed运算结果用signed储存,防止后续出错;unsigned用unsigned储存。
- operands中同时有signed&unsigned,operation为unsigned。
- unsigned用原码,扩展用‘0’填补;signed用two's compliment。扩展用‘最高位’填补。
1.赋值操作(扩展和截断)
扩展:
(signed&unsigned) [7:0] a = (signed&unsigned) [4:0] b
均以rhs b的符号决定扩展方式。
截断:
signed&unsigned都是直接高位截断。
2.加减运算
本质都可以认为是补码运算,只是unsigned+unsigned可能出现位数不够情况,因此正确答案不能用two's compliment表达。
unsigned [3:0] + unsigned [3:0]
拓展一位补‘0’,再进行正常运算,结果的unsigned情况为正确答案,因为可能位数不够。如果做减法时,求补码,可直接当成signed运算,结果用two