Report
Report
Assignment 2
Roll No. 153079029
Q–1 Using ngspice based circuit simulation, estimate the delay of a half
adder and a full adder, when loaded with 4 inverters. Also evaluate the
delay of a mux loaded with 4 inverters to be used in a carry select adder.
(The full adder should not optimize carry generation at the cost of
delaying the sum output). Use the model files provided with the previous
assignment.
Netlist:
Half Adder Carry Delay
.include model.txt
X1 2 3 gnd 8 inverter
X2 3 4 gnd 8 inverter m=4
Vdd 8 0 3.3v
v1 g3 0 3.3v
v2 g4 0 PULSE(0 3.3 0.1n 0.1n 0.1n 10n 20n)
Cl 4 0 0.1pF
.MEAS tran delay_carry TRIG v(g4) VAL=1.65 RISE=1 TARG v(3)
VAL=1.65 RISE=1
.tran 0 60n
.control
run
plot v(g3) v(g4)
plot v(3)
.endc
.end
Input Waveform
Delay Results
Vdd 8 0 3.3v
X1 g4 g6 0 8 inverter
X2 g3 g5 0 8 inverter
X3 s d 0 8 inverter m=4
Cl d 0 0.5pF
v1 g4 0 0V
v2 g3 0 PULSE(0 3.3 0.1n 0.1n 0.1n 10n 20n)
.MEAS tran sum_delay TRIG v(g3) VAL=1.65 RISE=1 TARG v(s)
VAL=1.65 RISE=1
.tran 0 60n
.control
run
plot v(g4) v(g3)
plot v(s)
.endc
.end
Input Waveform
First input in green is kept at 0v.
Second input in red is a pulse waveform.
Output waveform
Delay Results
vsupply vs 0 3.3
*v1 cin 0 dc 0v
v2 a 0 dc 3.3
v3 b 0 0
*v2 a 0 pulse(0 3.3 2n 2n 2n 5n 10n)
*v3 b 0 pulse(3.3 0 2n 2n 2n 5n 10n)
v1 cin 0 pwl(0 0 0.1us 3.3 1us 3.3 1.1us 0)
*v2 a 0 pwl(0 0 0.1ms 3.3 1ms 3.3 1.1ms 0)
*v3 b 0 pwl(0 0 0.1ms 3.3 1ms 3.3 1.1ms 0)
.tran 0 5us
.control
run
MEAS TRAN carry_delay TRIG v(cin) val=1.65 rise=1 TARG
v(cout) val=1.65 rise=1
MEAS TRAN sum_delay TRIG v(cin) val=1.65 rise=1 TARG v(sum)
val=1.65 fall=1
plot v(a) v(b) v(cin)
plot v(cin) v(cout)
plot v(cin) v(sum)
.endc
.end
Input Waveforms
.include model.txt
Vdd 8 0 3.3V
X2 g6 g5 0 8 inv
X1 b e 0 8 inv
X3 e out 0 8 inv m=4
Cl out 0 .5pF
Vg3 g3 0 3.3v
Vg4 g4 0 0
Vg6 g6 0 PULSE(0 3.3 1n 1n 1n 20n 40n)
.MEAS tran MUX_delay TRIG v(g6) VAL=1.65 Rise=1 TARG v(e)
VAL=1.65 fall=1
.tran 0 60n
.control
run
plot v(g3) V(g4)
plot V(g6) v(e)
.endc
.end
Input Waveforms
Wallace:
// Half Adder
module HA
(A,B,S,Cout);
input A,B;
output S,Cout;
assign S=A ^ B ;
assign Cout=A & B;
endmodule
// Full Adder
module FA
(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
// Wallace Multiplier
always@(A,B)
begin
for ( i=0; i<=7; i=i+1)
for ( j = 0; j <= 7; j = j + 1)
p[i][j] <= A[j] & B[i];
end
module bit_2_adder(a,b,ci,s,co);
input [1:0] a,b;
input ci;
output [1:0] s;
output co;
wire [1:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
assign s=ci?S1:S0;
assign co=ci?C1[1]:C0[1];
endmodule
// 3 bit adder
module bit_3_adder(a,b,ci,s,co);
input [2:0] a,b;
input ci;
output [2:0] s;
output co;
wire [2:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
assign s=ci?S1:S0;
assign co=ci?C1[2]:C0[2];
endmodule
// 4 bit adder
module bit_4_adder(a,b,ci,s,co);
input [3:0] a,b;
input ci;
output [3:0] s;
output co;
wire [3:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
assign s=ci?S1:S0;
assign co=ci?C1[3]:C0[3];
endmodule
// 5 bit adder
module bit_5_adder(a,b,ci,s,co);
input [4:0] a,b;
input ci;
output [4:0] s;
output co;
wire [4:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA05(a[4],b[4],C0[3],S0[4],C0[4]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
FA FA15(a[4],b[4],C1[3],S1[4],C1[4]);
endmodule
// first stage
HA ha_0 (.A(p[0][1]), .B( p[1][0]), .S(s[0]), .Cout(c[0]));
FA fa_1 (.A(p[0][2]), .B( p[1][1]), .Cin( p[2][0] ), .S(s[1]), .Cout(c[1]) );
FA fa_2 (.A(p[1][2]), .B( p[2][1]), .Cin(p[3][0]), .S(s[2]), .Cout(c[2]));
FA fa_3 (.A(p[2][2]), .B( p[3][1]), .Cin( p[4][0] ), .S(s[3]), .Cout(c[3]) );
FA fa_4 (.A(p[0][5]), .B( p[1][4]), .Cin(p[2][3]), .S(s[4]), .Cout(c[4]));
FA fa_5 (.A(p[3][2]), .B( p[4][1]), .Cin( p[5][0] ), .S(s[5]), .Cout(c[5]) );
FA fa_6 (.A(p[1][5]), .B( p[2][4]), .Cin(p[3][3]),.S(s[6]), .Cout(c[6]));
FA fa_7 (.A(p[4][2]), .B( p[5][1]), .Cin( p[6][0] ), .S(s[7]), .Cout(c[7]) );
FA fa_8 (.A(p[2][5]), .B( p[3][4]),.Cin(p[4][3]), .S(s[8]), .Cout(c[8]));
FA fa_9 (.A(p[5][2]), .B( p[6][1]), .Cin( p[7][0] ), .S(s[9]), .Cout(c[9]) );
FA fa_10 (.A(p[2][6]), .B( p[3][5]), .Cin( p[4][4] ), .S(s[10]),
.Cout(c[10]));
FA fa_11 (.A(p[5][3]), .B( p[6][2]), .Cin( p[7][1] ), .S(s[11]),
.Cout(c[11]));
FA fa_12 (.A(p[2][7]), .B( p[3][6]), .Cin(p[4][5] ), .S(s[12]),
.Cout(c[12]));
FA fa_13 (.A(p[5][4]), .B( p[6][3]), .Cin( p[7][2] ), .S(s[13]),
.Cout(c[13]));
HA ha_14 (.A(p[3][7]), .B( p[4][6]), .S(s[14]), .Cout(c[14]));
FA fa_15 (.A(p[5][5]), .B(p[6][4]), .Cin( p[7][3] ), .S(s[15]),
.Cout(c[15]));
FA fa_16 (.A(p[5][6]), .B( p[6][5]), .Cin( p[7][4] ), .S(s[16]),
.Cout(c[16]));
FA fa_17 (.A(p[5][7]), .B( p[6][6]), .Cin( p[7][5] ), .S(s[17]),
.Cout(c[17]));
//2nd stage
// 4th stage
always@(posedge clock)
begin
product <=
{c[61],s[61],s[60],s[59],s[58],s[57],s[56],s[55],s[54],s[53],s[52],s[51],s[
42],s[32],s[18],s[0],p[0][0] };
end
endmodule
Simulation Result:
module HA
(A,B,S,Cout);
input A,B;
output S,Cout;
assign S=A ^ B ;
assign Cout=A & B;// Half Adder
endmodule
// Full Adder
module FA
(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
// DADA Multiplier
always@(A,B)
begin
for ( i=0; i<=7; i=i+1)
for ( j = 0; j <= 7; j = j + 1)
p[i][j] <= A[j] & B[i];
end
module bit_2_adder(a,b,ci,s,co);
input [1:0] a,b;
input ci;
output [1:0] s;
output co;
wire [1:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
assign s=ci?S1:S0;
assign co=ci?C1[1]:C0[1];
endmodule
// 3 bit adder
module bit_3_adder(a,b,ci,s,co);
input [2:0] a,b;
input ci;
output [2:0] s;
output co;
wire [2:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
assign s=ci?S1:S0;
assign co=ci?C1[2]:C0[2];
endmodule
// 4 bit adder
module bit_4_adder(a,b,ci,s,co);
input [3:0] a,b;
input ci;
output [3:0] s;
output co;
wire [3:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
assign s=ci?S1:S0;
assign co=ci?C1[3]:C0[3];
endmodule
// 5 bit adder
module bit_5_adder(a,b,ci,s,co);
input [4:0] a,b;
input ci;
output [4:0] s;
output co;
wire [4:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA05(a[4],b[4],C0[3],S0[4],C0[4]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
FA FA15(a[4],b[4],C1[3],S1[4],C1[4]);
// first stage
HA ha_0 (.A(p[5][1]), .B( p[6][0]), .S(s[0]), .Cout(c[0]));
FA fa_1 (.A(p[3][4]), .B( p[4][3]), .Cin( p[5][2] ), .S(s[1]),
.Cout(c[1]) );
HA ha_2 (.A(p[6][1]), .B( p[7][0]), .S(s[2]), .Cout(c[2]));
FA fa_3 (.A(p[3][5]), .B( p[4][4]), .Cin( p[5][3] ), .S(s[3]),
.Cout(c[3]) );
HA ha_4 (.A(p[6][2]), .B( p[7][1]), .S(s[4]), .Cout(c[4]));
FA fa_5 (.A(p[5][4]), .B( p[6][3]), .Cin( p[7][2] ), .S(s[5]),
.Cout(c[5]) );
//2nd stage
HA ha_6 (.A(p[3][1]), .B( p[4][0]), .S(s[6]), .Cout(c[6]));
FA fa_7 (.A(p[1][4]), .B( p[2][3]), .Cin( p[3][2] ), .S(s[7]),
.Cout(c[7]) );
HA ha_8 (.A(p[4][1]), .B( p[5][0]), .S(s[8]), .Cout(c[8]));
FA fa_9 (.A(p[0][6]), .B( p[1][5]), .Cin( p[2][4] ), .S(s[9]),
.Cout(c[9]) );
FA fa_10 (.A(p[3][3]), .B( p[4][2]), .Cin( p[5][1] ), .S(s[10]),
.Cout(c[10]));
FA fa_11 (.A(c[0]), .B( p[0][7]), .Cin( p[1][6] ), .S(s[11]),
.Cout(c[11]));
FA fa_12 (.A(p[2][5]), .B( s[1]), .Cin( s[2] ), .S(s[12]), .Cout(c[12]));
FA fa_13 (.A(c[1]), .B( c[2]), .Cin( p[1][7] ), .S(s[13]), .Cout(c[13]));
FA fa_14 (.A(p[2][6]), .B( s[3]), .Cin( s[4] ), .S(s[14]), .Cout(c[14]));
FA fa_15 (.A(c[3]), .B( c[4]), .Cin( p[2][7] ), .S(s[15]), .Cout(c[15]));
FA fa_16 (.A(p[3][6]), .B( p[4][5]), .Cin( s[5] ), .S(s[16]),
.Cout(c[16]));
FA fa_17 (.A(c[5]), .B( p[3][7]), .Cin( p[4][6] ), .S(s[17]),
.Cout(c[17]));
FA fa_18 (.A(p[5][5]), .B( p[6][4]), .Cin( p[7][3] ), .S(s[18]),
.Cout(c[18]));
FA fa_19 (.A(p[5][6]), .B( p[6][5]), .Cin( p[7][4] ), .S(s[19]),
.Cout(c[19]));
// 3rd stage
HA ha_20 (.A(p[2][1]), .B( p[3][0]), .S(s[20]), .Cout(c[20]));
FA fa_21 (.A(p[1][3]), .B( p[2][2]), .Cin( p[3][1] ), .S(s[21]),
.Cout(c[21]));
FA fa_22 (.A(p[0][5]), .B( s[7]), .Cin( s[8] ), .S(s[22]), .Cout(c[22]));
FA fa_23 (.A(c[8]), .B(s[9]), .Cin( s[10] ), .S(s[23]), .Cout(c[23]));
FA fa_24 (.A(c[10]), .B(s[11]), .Cin(s[12]), .S(s[24]), .Cout(c[24]));
FA fa_25 (.A(c[12]), .B(s[13]), .Cin(s[14]), .S(s[25]), .Cout(c[25]));
FA fa_26 (.A(c[14]), .B(s[15]), .Cin(s[16]), .S(s[26]), .Cout(c[26]));
FA fa_27 (.A(c[16]), .B(s[17]), .Cin(s[18] ), .S(s[27]), .Cout(c[27]));
FA fa_28 (.A(c[18]), .B( p[4][7]), .Cin(s[19]), .S(s[28]),
.Cout(c[28]));
FA fa_29 (.A(p[5][7]), .B( p[6][6]), .Cin( p[7][5] ), .S(s[29]),
.Cout(c[29]));
// 4th satge
HA ha_30 (.A(p[1][1]), .B( p[2][0]), .S(s[30]), .Cout(c[30]));
FA fa_31 (.A(p[0][3]), .B(p[1][2]), .Cin(s[20]), .S(s[31]),
.Cout(c[31]));
FA fa_32 (.A(c[20]), .B(p[0][4]), .Cin(s[21]), .S(s[32]), .Cout(c[32]));
FA fa_33 (.A(c[21]), .B(c[6]), .Cin(s[22]), .S(s[33]), .Cout(c[33]));
FA fa_34 (.A(c[22]), .B(c[7]), .Cin(s[23]), .S(s[34]), .Cout(c[34]));
FA fa_35 (.A(c[23]), .B(c[9]), .Cin(s[24]), .S(s[35]), .Cout(c[35]));
FA fa_36 (.A(c[24]), .B(c[11]), .Cin(s[25]), .S(s[36]), .Cout(c[36]));
FA fa_37 (.A(c[25]), .B(c[13]), .Cin(s[26]), .S(s[37]), .Cout(c[37]));
FA fa_38 (.A(c[26]), .B(c[15]), .Cin(s[27]), .S(s[38]), .Cout(c[38]));
FA fa_39 (.A(c[27]), .B(c[17]), .Cin(s[28]), .S(s[39]), .Cout(c[39]));
FA fa_40 (.A(c[28]), .B(c[19]), .Cin(s[29]), .S(s[40]), .Cout(c[40]));
FA fa_41 (.A(c[29]), .B(p[6][7]), .Cin(p[7][6]), .S(s[41]),
.Cout(c[41]));
always@(posedge clock)
begin
product <=
{c[55],s[55],s[54],s[53],s[52],s[51],s[50],s[49],s[48],s[47],s[46],s[45]
,s[44],s[43],s[42],p[0][0]};
end
endmodule
Simulation Result:
Input = 8 & 10, Output=80
Q–3 Now back annotate the delays of half adders
and full adders from the circuit simulation done
earlier.
Ans: Verilog Program with Delay
Wallace:
// Half Adder
module HA
(A,B,S,Cout);
output S,Cout;
input A,B;
assign #0.2955 Cout=A & B;
assign #0.79 S=A ^ B ;
endmodule
// Full Adder
module FA
(A,B,Cin,S,Cout);
output S,Cout;
input A,B,Cin ;
assign #3.67603 Cout=(A & B) | (B & Cin) | (A & Cin);
assign #3.652009 S=A ^ B ^ Cin ;
endmodule
// Wallace Multiplier
always@(A,B)
begin
for ( i=0; i<=7; i=i+1)
for ( j = 0; j <= 7; j = j + 1)
p[i][j] <= A[j] & B[i];
end
module bit_2_adder(a,b,ci,s,co);
input [1:0] a,b;
input ci;
output [1:0] s;
output co;
wire [1:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
assign s=ci?S1:S0;
assign co=ci?C1[1]:C0[1];
endmodule
// 3 bit adder
module bit_3_adder(a,b,ci,s,co);
input [2:0] a,b;
input ci;
output [2:0] s;
output co;
wire [2:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
assign s=ci?S1:S0;
assign co=ci?C1[2]:C0[2];
endmodule
// 4 bit adder
module bit_4_adder(a,b,ci,s,co);
input [3:0] a,b;
input ci;
output [3:0] s;
output co;
wire [3:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
assign s=ci?S1:S0;
assign co=ci?C1[3]:C0[3];
endmodule
// 5 bit adder
module bit_5_adder(a,b,ci,s,co);
input [4:0] a,b;
input ci;
output [4:0] s;
output co;
wire [4:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA05(a[4],b[4],C0[3],S0[4],C0[4]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
FA FA15(a[4],b[4],C1[3],S1[4],C1[4]);
// first stage
HA ha_0 (.A(p[0][1]), .B( p[1][0]), .S(s[0]), .Cout(c[0]));
FA fa_1 (.A(p[0][2]), .B( p[1][1]), .Cin( p[2][0] ), .S(s[1]),
.Cout(c[1]) );
FA fa_2 (.A(p[1][2]), .B( p[2][1]), .Cin(p[3][0]), .S(s[2]),
.Cout(c[2]));
FA fa_3 (.A(p[2][2]), .B( p[3][1]), .Cin( p[4][0] ), .S(s[3]),
.Cout(c[3]) );
FA fa_4 (.A(p[0][5]), .B( p[1][4]), .Cin(p[2][3]), .S(s[4]),
.Cout(c[4]));
FA fa_5 (.A(p[3][2]), .B( p[4][1]), .Cin( p[5][0] ), .S(s[5]),
.Cout(c[5]) );
FA fa_6 (.A(p[1][5]), .B( p[2][4]), .Cin(p[3][3]),.S(s[6]), .Cout(c[6]));
FA fa_7 (.A(p[4][2]), .B( p[5][1]), .Cin( p[6][0] ), .S(s[7]),
.Cout(c[7]) );
FA fa_8 (.A(p[2][5]), .B( p[3][4]),.Cin(p[4][3]), .S(s[8]), .Cout(c[8]));
FA fa_9 (.A(p[5][2]), .B( p[6][1]), .Cin( p[7][0] ), .S(s[9]),
.Cout(c[9]) );
FA fa_10 (.A(p[2][6]), .B( p[3][5]), .Cin( p[4][4] ), .S(s[10]),
.Cout(c[10]));
FA fa_11 (.A(p[5][3]), .B( p[6][2]), .Cin( p[7][1] ), .S(s[11]),
.Cout(c[11]));
FA fa_12 (.A(p[2][7]), .B( p[3][6]), .Cin(p[4][5] ), .S(s[12]),
.Cout(c[12]));
FA fa_13 (.A(p[5][4]), .B( p[6][3]), .Cin( p[7][2] ), .S(s[13]),
.Cout(c[13]));
HA ha_14 (.A(p[3][7]), .B( p[4][6]), .S(s[14]), .Cout(c[14]));
FA fa_15 (.A(p[5][5]), .B(p[6][4]), .Cin( p[7][3] ), .S(s[15]),
.Cout(c[15]));
FA fa_16 (.A(p[5][6]), .B( p[6][5]), .Cin( p[7][4] ), .S(s[16]),
.Cout(c[16]));
FA fa_17 (.A(p[5][7]), .B( p[6][6]), .Cin( p[7][5] ), .S(s[17]),
.Cout(c[17]));
//2nd stage
// 3rd stage
// 4th stage
HA ha_42 (.A(c[32]), .B( s[33]), .S(s[42]), .Cout(c[42]));
FA fa_43 (.A(c[33]), .B(c[20]), .Cin(s[21]), .S(s[43]), .Cout(c[43]));
FA fa_44 (.A(c[34]), .B(c[22]), .Cin(s[35]), .S(s[44]), .Cout(c[44]));
FA fa_45 (.A(c[35]), .B(c[24]), .Cin(s[36]), .S(s[45]), .Cout(c[45]));
FA fa_46 (.A(c[36]), .B(c[26]), .Cin(s[37]), .S(s[46]), .Cout(c[46]));
HA ha_47 (.A(c[37]), .B(s[38]), .S(s[47]), .Cout(c[47]));
HA ha_48 (.A(c[38]), .B(s[39]), .S(s[48]), .Cout(c[48]));
HA ha_49 (.A(c[39]), .B(s[40]), .S(s[49]), .Cout(c[49]));
HA ha_50 (.A(c[40]), .B(s[31]), .S(s[50]), .Cout(c[50]));
Simulation result:
module HA
(A,B,S,Cout);
input A,B;
output S,Cout;
assign #0.2170285 S=A ^ B ; //delay of sum for half adder
assign #0.1881537 Cout=A & B; // delay of carry for half
adder
endmodule
// Full Adder
module FA
(A,B,Cin,S,Cout);
input A,B,Cin ;
output S,Cout;
assign #3.684794 S=A ^ B ^ Cin ; //delay of sum for full adder
assign #3.708672 Cout=(A & B) | (B & Cin) | (A & Cin); ////delay of
sum for full adder
endmodule
// 2 bit adder
// DADA Multiplier
always@(A,B)
begin
for ( i=0; i<=7; i=i+1)
for ( j = 0; j <= 7; j = j + 1)
p[i][j] <= A[j] & B[i];
end
module bit_2_adder(a,b,ci,s,co);
input [1:0] a,b;
input ci;
output [1:0] s;
output co;
wire [1:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
assign s=ci?S1:S0;
assign co=ci?C1[1]:C0[1];
endmodule
// 3 bit adder
module bit_3_adder(a,b,ci,s,co);
input [2:0] a,b;
input ci;
output [2:0] s;
output co;
wire [2:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
assign s=ci?S1:S0;
assign co=ci?C1[2]:C0[2];
endmodule
// 4 bit adder
module bit_4_adder(a,b,ci,s,co);
input [3:0] a,b;
input ci;
output [3:0] s;
output co;
wire [3:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
assign s=ci?S1:S0;
assign co=ci?C1[3]:C0[3];
endmodule
// 5 bit adder
module bit_5_adder(a,b,ci,s,co);
input [4:0] a,b;
input ci;
output [4:0] s;
output co;
wire [4:0] S1,S0,C0,C1;
FA FA01(a[0],b[0],1'b0,S0[0],C0[0]);
FA FA02(a[1],b[1],C0[0],S0[1],C0[1]);
FA FA03(a[2],b[2],C0[1],S0[2],C0[2]);
FA FA04(a[3],b[3],C0[2],S0[3],C0[3]);
FA FA05(a[4],b[4],C0[3],S0[4],C0[4]);
FA FA11(a[0],b[0],1'b1,S1[0],C1[0]);
FA FA12(a[1],b[1],C1[0],S1[1],C1[1]);
FA FA13(a[2],b[2],C1[1],S1[2],C1[2]);
FA FA14(a[3],b[3],C1[2],S1[3],C1[3]);
FA FA15(a[4],b[4],C1[3],S1[4],C1[4]);
endmodule
// first stage
HA ha_0 (.A(p[5][1]), .B( p[6][0]), .S(s[0]), .Cout(c[0]));
FA fa_1 (.A(p[3][4]), .B( p[4][3]), .Cin( p[5][2] ), .S(s[1]),
.Cout(c[1]) );
HA ha_2 (.A(p[6][1]), .B( p[7][0]), .S(s[2]), .Cout(c[2]));
FA fa_3 (.A(p[3][5]), .B( p[4][4]), .Cin( p[5][3] ), .S(s[3]),
.Cout(c[3]) );
HA ha_4 (.A(p[6][2]), .B( p[7][1]), .S(s[4]), .Cout(c[4]));
FA fa_5 (.A(p[5][4]), .B( p[6][3]), .Cin( p[7][2] ), .S(s[5]),
.Cout(c[5]) );
//2nd stage
HA ha_6 (.A(p[3][1]), .B( p[4][0]), .S(s[6]), .Cout(c[6]));
FA fa_7 (.A(p[1][4]), .B( p[2][3]), .Cin( p[3][2] ), .S(s[7]),
.Cout(c[7]) );
HA ha_8 (.A(p[4][1]), .B( p[5][0]), .S(s[8]), .Cout(c[8]));
FA fa_9 (.A(p[0][6]), .B( p[1][5]), .Cin( p[2][4] ), .S(s[9]),
.Cout(c[9]) );
FA fa_10 (.A(p[3][3]), .B( p[4][2]), .Cin( p[5][1] ), .S(s[10]),
.Cout(c[10]));
FA fa_11 (.A(c[0]), .B( p[0][7]), .Cin( p[1][6] ), .S(s[11]),
.Cout(c[11]));
FA fa_12 (.A(p[2][5]), .B( s[1]), .Cin( s[2] ), .S(s[12]), .Cout(c[12]));
FA fa_13 (.A(c[1]), .B( c[2]), .Cin( p[1][7] ), .S(s[13]), .Cout(c[13]));
FA fa_14 (.A(p[2][6]), .B( s[3]), .Cin( s[4] ), .S(s[14]), .Cout(c[14]));
FA fa_15 (.A(c[3]), .B( c[4]), .Cin( p[2][7] ), .S(s[15]), .Cout(c[15]));
FA fa_16 (.A(p[3][6]), .B( p[4][5]), .Cin( s[5] ), .S(s[16]),
.Cout(c[16]));
FA fa_17 (.A(c[5]), .B( p[3][7]), .Cin( p[4][6] ), .S(s[17]),
.Cout(c[17]));
FA fa_18 (.A(p[5][5]), .B( p[6][4]), .Cin( p[7][3] ), .S(s[18]),
.Cout(c[18]));
FA fa_19 (.A(p[5][6]), .B( p[6][5]), .Cin( p[7][4] ), .S(s[19]),
.Cout(c[19]));
// 3rd stage
HA ha_20 (.A(p[2][1]), .B( p[3][0]), .S(s[20]), .Cout(c[20]));
FA fa_21 (.A(p[1][3]), .B( p[2][2]), .Cin( p[3][1] ), .S(s[21]),
.Cout(c[21]));
FA fa_22 (.A(p[0][5]), .B( s[7]), .Cin( s[8] ), .S(s[22]), .Cout(c[22]));
FA fa_23 (.A(c[8]), .B(s[9]), .Cin( s[10] ), .S(s[23]), .Cout(c[23]));
FA fa_24 (.A(c[10]), .B(s[11]), .Cin(s[12]), .S(s[24]), .Cout(c[24]));
FA fa_25 (.A(c[12]), .B(s[13]), .Cin(s[14]), .S(s[25]), .Cout(c[25]));
FA fa_26 (.A(c[14]), .B(s[15]), .Cin(s[16]), .S(s[26]), .Cout(c[26]));
FA fa_27 (.A(c[16]), .B(s[17]), .Cin(s[18] ), .S(s[27]), .Cout(c[27]));
FA fa_28 (.A(c[18]), .B( p[4][7]), .Cin(s[19]), .S(s[28]),
.Cout(c[28]));
FA fa_29 (.A(p[5][7]), .B( p[6][6]), .Cin( p[7][5] ), .S(s[29]),
.Cout(c[29]));
// 4th satge
HA ha_30 (.A(p[1][1]), .B( p[2][0]), .S(s[30]), .Cout(c[30]));
FA fa_31 (.A(p[0][3]), .B(p[1][2]), .Cin(s[20]), .S(s[31]),
.Cout(c[31]));
FA fa_32 (.A(c[20]), .B(p[0][4]), .Cin(s[21]), .S(s[32]), .Cout(c[32]));
FA fa_33 (.A(c[21]), .B(c[6]), .Cin(s[22]), .S(s[33]), .Cout(c[33]));
FA fa_34 (.A(c[22]), .B(c[7]), .Cin(s[23]), .S(s[34]), .Cout(c[34]));
FA fa_35 (.A(c[23]), .B(c[9]), .Cin(s[24]), .S(s[35]), .Cout(c[35]));
FA fa_36 (.A(c[24]), .B(c[11]), .Cin(s[25]), .S(s[36]), .Cout(c[36]));
FA fa_37 (.A(c[25]), .B(c[13]), .Cin(s[26]), .S(s[37]), .Cout(c[37]));
FA fa_38 (.A(c[26]), .B(c[15]), .Cin(s[27]), .S(s[38]), .Cout(c[38]));
FA fa_39 (.A(c[27]), .B(c[17]), .Cin(s[28]), .S(s[39]), .Cout(c[39]));
FA fa_40 (.A(c[28]), .B(c[19]), .Cin(s[29]), .S(s[40]), .Cout(c[40]));
FA fa_41 (.A(c[29]), .B(p[6][7]), .Cin(p[7][6]), .S(s[41]),
.Cout(c[41]));
bit_3_adder
add42({c[30],p[0][2],p[0][1]},{s[31],s[30],p[1][0]},{1'b0},{s[44],s[4
3],s[42]},{c[44]});
bit_3_adder
add43({c[33],c[32],c[31]},{s[34],s[33],s[32]},{c[44]},{s[47],s[46],s[
45]},{c[47]});
bit_4_adder
add44({c[37],c[36],c[35],c[34]},{s[38],s[37],s[36],s[35]},{c[47]},{s[
51],s[50],s[49],s[48]},{c[51]});
bit_4_adder
add45({c[41],c[40],c[39],c[38]},{p[7][7],s[41],s[40],s[39]},{c[51]},{
s[55],s[54],s[53],s[52]},{c[55]});
always@(posedge clock)
begin
product <=
{c[55],s[55],s[54],s[53],s[52],s[51],s[50],s[49],s[48],s[47],s[46],s[45]
,s[44],s[43],s[42],p[0][0]};
end
endmodule
Simulation Result: