module full_adder(a, b, cin, s, cout); input a, b, cin; output s, cout; assign s = a^b^cin; assign cout = (a&b) | (b&cin) | (a&cin); endmodule // 8-bit carry-save adder module csa(x, y, z, s, c); input [7:0] x, y, z; output [7:0] s; output [8:1] c; full_adder fa0(x[0], y[0], z[0], s[0], c[1]); full_adder fa1(x[1], y[1], z[1], s[1], c[2]); full_adder fa2(x[2], y[2], z[2], s[2], c[3]); full_adder fa3(x[3], y[3], z[3], s[3], c[4]); full_adder fa4(x[4], y[4], z[4], s[4], c[5]); full_adder fa5(x[5], y[5], z[5], s[5], c[6]); full_adder fa6(x[6], y[6], z[6], s[6], c[7]); full_adder fa7(x[7], y[7], z[7], s[7], c[8]); endmodule // 6-input Wallace tree module wallace(p0, p1, p2, p3, p4, p5, s, c); input [7:0] p0, p1, p2, p3, p4, p5; output [8:0] s; output [9:1] c; wire [7:0] s1, s2, s3, s4; wire [8:1] c1, c2, c3, c4; csa csa1(p2, p1, p0, s1, c1); csa csa2(p5, p4, p3, s2, c2); csa csa3(s2, {c1[7:1], 1'b0}, s1, s3, c3); csa csa4({c2[7:1], 1'b0}, {c3[7:1], 1'b0}, s3, s4, c4); full_adder fa1(c1[8], c2[8], c3[8], s_msb, c_msb); assign s = {s_msb, s4}; assign c = {c_msb, c4}; endmodule