module carry_lookahead_adder(a,b,carryin,sum,carryout); input [15:0] a, b; /* add these together */ input carryin; output [15:0] sum; /* result */ output carryout; wire [16:1] carry; /* intermediate carries */ assign carryout = carry[16]; /* for simplicity */ /* build the carry-lookahead units */ carry_block b0(a[3:0],b[3:0],carryin,carry[4:1]); carry_block b1(a[7:4],b[7:4],carry[4],carry[8:5]); carry_block b2(a[11:8],b[11:8],carry[8],carry[12:9]); carry_block b3(a[15:12],b[15:12],carry[12],carry[16:13]); /* build the sum */ sum a0(a[0],b[0],carryin,sum[0]); sum a1(a[1],b[1],carry[1],sum[1]); sum a2(a[2],b[2],carry[2],sum[2]); sum a3(a[3],b[3],carry[3],sum[3]); sum a4(a[4],b[4],carry[4],sum[4]); sum a5(a[5],b[5],carry[5],sum[5]); sum a6(a[6],b[6],carry[6],sum[6]); sum a7(a[7],b[7],carry[7],sum[7]); sum a8(a[8],b[8],carry[8],sum[8]); sum a9(a[9],b[9],carry[9],sum[9]); sum a10(a[10],b[10],carry[10],sum[10]); sum a11(a[11],b[11],carry[11],sum[11]); sum a12(a[12],b[12],carry[12],sum[12]); sum a13(a[13],b[13],carry[13],sum[13]); sum a14(a[14],b[14],carry[14],sum[14]); sum a15(a[15],b[15],carry[15],sum[15]); endmodule