reg1_i[31]、reg2_i[31]分别两个数的符号位,result[31]表示运算结果的符号位,overflow是溢出位。
- 当 reg1_i[31] = reg2_i[31] = 0(两数同为正)且 result[31] = 1(结果为负)时,产生负溢出;
- 当 reg1_i[31] = reg2_i[31] = 1(两数同为负)且 result[31] = 0(结果为正)时,产生正溢出。
代码:
// 原操作数1:reg1_i // 原操作数2:reg2_i // 相加后的结果:result // 溢出标志位:overflow,为0代表未溢出,为1代表溢出 if ((reg1_i[31] == 0 && reg2_i[31] == 0 && result[31] == 1) || (reg1_i[31] == 1 && reg2_i[31] == 1 && result[31] == 0)) begin overflow = 1; end else begin overflow = 0; end
注意:这虽然说的是加法的溢出,但同样也适用于减法的溢出判断,只要我们使用补码的形式来保存数值即可。补码的来历,补码的优势