总述:
- 当所有操作数和结果数据位宽一样时,有符号数和无符号数所产生的运算电路是一样的。
- 当所有操作数和结果数据位宽不一样时,无符号数进行0扩展,而有符号数进行符号扩展。
注:在verilog中支持无符号数和有符号数混合使用,当表达式右侧所有数均为符号数时,才进行符号位扩展,否则全部0扩展。
具体实现:
法一:
reg[7:0]a,b;
reg[3:0]c;
reg[7:0]sum1,sum2,sum3,sum4;
……
sum1 = a + b; //当位宽一样时,无符号和有符号产生的电路是一样的。
sum2 = a + c; //当位宽不一样时reg类型被看成无符号数,进行0扩展。
sum3 = a + {4’b0,c}; // 此处手动补0。
sum4 = a + {4{c[3]},c}; //此处手动补符号位。
法二:
reg signed [7:0]a,b;
reg signed [3:0]c;
reg[3:0] d;
regsigend [7:0]sum1,sum2,sum3;
……
sum1 = a + b; // 同法一。
sum2 = a + c; //因为右侧所有数都为有符号数,所以c自动进行符号位扩展。
sum3 = a + c + d; // 因为右侧不是所有数都为有符号数,所以都进行0扩展。
法三(避免使用此方法):
verilog中有两个系统函数$signed()和$unsigned(),将括号内的表达式分别转换成signed 和 unsigned数据类型。
eg:sum = a + c + $signed(c); //此时右侧均为有符号数。
没有回复内容