首页 > 解决方案 > 为什么没有为二进制减法设置溢出标志?

问题描述

我有基本的二进制数学问题。例如;

reg [31:0] a = 32'hFFFF_FFFF; 
reg [31:0] b = 32'hFFFF_FFFF; 
reg [31:0] c = 0;

我知道 c = a - b 将导致零并且不会设置溢出标志。

我的理解是 ALU 使用 2 的减数补码(运算符右侧)并将其添加到被减数(运算符左侧)。

所以存储在 reg b 中的值的 2s 补码是 32'h1。现在,如果我将它添加到 reg a,我将得到 32 个零和一个 1,这是溢出。那为什么不设置溢出标志呢?

即使我将 reg c 的宽度更改为 33,c[32] 也不会设置为 1。我知道当减去两个相等的数字时,没有溢出,但是当我做 2s 补码数学时会溢出。

让我帮助我消除脑海中的这种困惑。感谢您的时间。

标签: binaryverilogcpualu

解决方案


a, b, 和c都是 32 位无符号变量,并且您正在执行 32 位算术。LRM 表示算术运算的结果宽度是其最大操作数的宽度。所以溢出或第 33 位被截断。即使扩展c到 33 位,这一事实仍然成立。


推荐阅读