// Half Adder primitive
module half_adder (
input a, b,
output reg sum, carry
);
always @ (*) begin
sum=a^b;
carry=a&&b;
end
endmodule
// Full Adder using 2 Half Adders
module full_adder_struct (
input a, b, cin,
output sum, cout
);
wire w1,w2,w3,w4;
half_adder ha1(
.a(a),
.b(b),
.sum(w1),
.carry(w2)
);
half_adder ha2(
.a(w1),
.b(cin),
.sum(w3),
.carry(w4)
);
assign sum=w3;
assign cout=w4|w2;
endmodule