Half Adder

module half_adder(
    input A, B,
    output Sum, Carry
);

assign Sum = A ^ B;
assign Carry = A & B;

endmodule

Test Bench

module half_adder_tb;

reg A, B;
wire Sum, Carry;

half_adder uut (.A(A), .B(B), .Sum(Sum), .Carry(Carry));

initial begin
    $monitor("A=%b B=%b | Sum=%b Carry=%b", A, B, Sum, Carry);

    A=0; B=0; #10;
    A=0; B=1; #10;
    A=1; B=0; #10;
    A=1; B=1; #10;

    $finish;
end

endmodule

Full Adder

module full_adder(
    input A, B, Cin,
    output Sum, Carry
);

assign Sum = A ^ B ^ Cin;
assign Carry = (A & B) | (B & Cin) | (A & Cin);

endmodule

Test Bench

module full_adder_tb;

reg A, B, Cin;
wire Sum, Carry;

full_adder uut (.A(A), .B(B), .Cin(Cin), .Sum(Sum), .Carry(Carry));

initial begin
    $monitor("A=%b B=%b Cin=%b | Sum=%b Carry=%b", A, B, Cin, Sum, Carry);

    A=0; B=0; Cin=0; #10;
    A=0; B=0; Cin=1; #10;
    A=0; B=1; Cin=0; #10;
    A=0; B=1; Cin=1; #10;
    A=1; B=0; Cin=0; #10;
    A=1; B=0; Cin=1; #10;
    A=1; B=1; Cin=0; #10;
    A=1; B=1; Cin=1; #10;

    $finish;
end

endmodule

Full Adder using Half Adder

module full_adder_using_ha(
    input A, B, Cin,
    output Sum, Carry
);

wire s1, c1, c2;

// First Half Adder
half_adder ha1 (.A(A), .B(B), .Sum(s1), .Carry(c1));

// Second Half Adder
half_adder ha2 (.A(s1), .B(Cin), .Sum(Sum), .Carry(c2));

// Final Carry
assign Carry = c1 | c2;

endmodule

Test Bench

module fa_using_ha_tb;

reg A, B, Cin;
wire Sum, Carry;

full_adder_using_ha uut (
    .A(A), .B(B), .Cin(Cin),
    .Sum(Sum), .Carry(Carry)
);

initial begin
    $monitor("A=%b B=%b Cin=%b | Sum=%b Carry=%b", A, B, Cin, Sum, Carry);

    A=0; B=0; Cin=0; #10;
    A=0; B=0; Cin=1; #10;
    A=0; B=1; Cin=0; #10;
    A=0; B=1; Cin=1; #10;
    A=1; B=0; Cin=0; #10;
    A=1; B=0; Cin=1; #10;
    A=1; B=1; Cin=0; #10;
    A=1; B=1; Cin=1; #10;

    $finish;
end

endmodule