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
- // 原操作数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
// 原操作数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
注意:这虽然说的是加法的溢出,但同样也适用于减法的溢出判断,只要我们使用补码的形式来保存数值即可。补码的来历,补码的优势
参考文献:verilog加法溢出判断(附代码) – 尚码园 (shangmayuan.com)