//# Binary Carry-In Calculator // 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](./Arithmetic_Predicates_Binary.html) (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