我正在基于现有的 RISC ISA 在 verilog 中设计一个 16 位 ALU。ISA 说当操作无符号时设置进位标志,当操作有符号时设置溢出。有趣的是,ISA 实现ADD
和SUB
指令同时对有符号和无符号数字进行操作。由于有符号与无符号只是一个解释问题,我最初的想法是做如下的事情。溢出与进位的想法只是解释问题,因此对两者使用相同的功能。
module ALU();
input wire [15:0]x;
input wire [15:0]y;
input wire [8:0]opcode;
output reg [15:0] result;
output reg CFlag; // Carry
output reg FFlag; // Overflow
if(opcode == ADD) begin
result = x + y;
// x and y have the same sign, result has a different sign.
CFlag = FFlag = (x[15] ~^ y[15]) & res[15] ^ x[15];
end
endmodule
但是这个边缘情况(以 4 位显示)呢?
x = -1
y = 1
1111 + 0001 = 0000
在这种情况下,2s 恭维的答案是正确的,不需要设置标志。但是在无符号解释中答案是不正确的,应该设置进位标志。我一直认为进位和溢出是一样的,只是解释不同,但现在我不确定了。现代 ALU 将如何处理这种极端情况?