Given two binary signed or unsigned integers (A and B) and their sum
or difference (sum), returns the carry-in which happened at each bit
position during the addition or subtraction. You can use this on any
matching subset of bits of A, B, and sum.
Figuring out the carry-ins has uses for sub-word bit-parallel computations, such as determining if a vector byte addition overflowed into the adjacent byte, but the main use is to get the carry-in into the most-significant bit of a sum. Comparing the final carry-in with the final carry-out allows us to determine if a signed overflow occured, and to compute other arithmetic predicates (e.g.: less-than, greater-than-or-equal, etc...)
`default_nettype none
module CarryIn_Binary
#(
parameter WORD_WIDTH = 0
)
(
input wire [WORD_WIDTH-1:0] A,
input wire [WORD_WIDTH-1:0] B,
input wire [WORD_WIDTH-1:0] sum,
output reg [WORD_WIDTH-1:0] carryin
);
initial begin
carryin = {WORD_WIDTH{1'b0}};
end
Re-add the two integers without carries, which is merely XOR, then compare
that carry-less sum with the input sum (this is also an XOR). If the sums
differ, then a carry-in was present at that bit position during the input
sum.
always @(*) begin
carryin = A ^ B ^ sum;
end
endmodule