Verilog 有符号数无符号数混用
2015-04-04 21:13
495 查看
a,b,da,dm,mul都定义成有符号类型,下面这几行代码综合后仿真可以得到正确的运算结果。
下面这几行代码当输入为负数时,结果错误,为什么呢?
因为6’sb0是有符号数,而6’b0是无符号数,而在 6’b0 :a+b; 这个表达式中左边是无符号,右边是有符号数,则右边也会转换成无符号数。
例如:当我们在testbench里面赋 a=-2; b=3;因为输入端口是有符号类型,所以输入的二进制是 11110 (-2,即2的补码表示),00011,
而这个表达式里 6’b0 :a*b;,因为左边是无符号类型,所以a b都变成了无符号类型,此时 11110 被理解成无符号数30, 00011是3,所以结果是90,而不是-6.
所以,要注意,“在一个表达式中混用signed 和unsigned 操作数时必须非常小心,只要有一个操作数时是无效的,那么在开始任何操作前,所有其他的操作数都被转换成了unsigned”——《Verilog HDL入门,54页》
assign da= (reset==1) ? 6'sb0 :a+b; assign dm= (reset==1) ? 6'sb0 :a-b; assign mul= (reset==1) ? 11'sb0 :a*b;
下面这几行代码当输入为负数时,结果错误,为什么呢?
assign da= (reset==1) ? 6'b0 :a+b; assign dm= (reset==1) ? 6'b0 :a-b; assign mul= (reset==1) ? 11'b0 :a*b;
因为6’sb0是有符号数,而6’b0是无符号数,而在 6’b0 :a+b; 这个表达式中左边是无符号,右边是有符号数,则右边也会转换成无符号数。
例如:当我们在testbench里面赋 a=-2; b=3;因为输入端口是有符号类型,所以输入的二进制是 11110 (-2,即2的补码表示),00011,
而这个表达式里 6’b0 :a*b;,因为左边是无符号类型,所以a b都变成了无符号类型,此时 11110 被理解成无符号数30, 00011是3,所以结果是90,而不是-6.
所以,要注意,“在一个表达式中混用signed 和unsigned 操作数时必须非常小心,只要有一个操作数时是无效的,那么在开始任何操作前,所有其他的操作数都被转换成了unsigned”——《Verilog HDL入门,54页》
相关文章推荐
- verilog有符号数的计算
- 使用有符号数,Verilog
- verilog中提高可读性的简写形式的符号
- 使用有符号数,Verilog
- verilog中求一个有符号数值的绝对值
- Verilog|数据类型中的有符号和无符…
- Verilog HDL无符号数和有符号数运算
- Verilog使用有符号数
- verilog的位宽与有符号问题
- [转载]采用加法器数乘法器实现17位有符号数相乘(Verilog)
- verilog中有符号整数说明及除法实现
- 【verilog】fdisplay中如何保存有符号形式
- verilog中的有符号数运算
- (原创)如何进行有符号小数乘法运算?(Verilog)
- verilog数值计算-有符号数和无符号数
- verilog之赋值和逻辑操作符号
- 通过matlab对verilog中无符号数、有符号数进行转化
- (原创)采用加法器数乘法器实现17位有符号数相乘(Verilog)
- Verilog 有符号数运算
- 通过matlab对verilog中无符号数、有符号数进行转化