module opo(p1, g1, p2, g2, p3, g3); input p1, g1, p2, g2; output p3, g3; assign p3 = p1 & p2; assign g3 = g1 | (p1 & g2); endmodule module kogge_stone(a, b, c0, s, c8); input [7:0] a, b; input c0; output [7:0] s; output c8; wire [7:0] p, g, psum; wire c1, c2, c3, c4, c5, c6, c7; // form the propagate, generate and psum signals from the input operands or(p[0], a[0], b[0]); or(p[1], a[1], b[1]); or(p[2], a[2], b[2]); or(p[3], a[3], b[3]); or(p[4], a[4], b[4]); or(p[5], a[5], b[5]); or(p[6], a[6], b[6]); or(p[7], a[7], b[7]); and(g[0], a[0], b[0]); and(g[1], a[1], b[1]); and(g[2], a[2], b[2]); and(g[3], a[3], b[3]); and(g[4], a[4], b[4]); and(g[5], a[5], b[5]); and(g[6], a[6], b[6]); and(g[7], a[7], b[7]); xor(psum[0], a[0], b[0]); xor(psum[1], a[1], b[1]); xor(psum[2], a[2], b[2]); xor(psum[3], a[3], b[3]); xor(psum[4], a[4], b[4]); xor(psum[5], a[5], b[5]); xor(psum[6], a[6], b[6]); xor(psum[7], a[7], b[7]); // first level of operator o opo opo01(p[7], g[7], p[6], g[6], p76, g76); opo opo02(p[6], g[6], p[5], g[5], p65, g65); opo opo03(p[5], g[5], p[4], g[4], p54, g54); opo opo04(p[4], g[4], p[3], g[3], p43, g43); opo opo05(p[3], g[3], p[2], g[2], p32, g32); opo opo06(p[2], g[2], p[1], g[1], p21, g21); opo opo07(p[1], g[1], p[0], g[0], p10, g10); // second level of operator o opo opo08(p76, g76, p54, g54, p74, g74); opo opo09(p65, g65, p43, g43, p63, g63); opo opo10(p54, g54, p32, g32, p52, g52); opo opo11(p43, g43, p21, g21, p41, g41); opo opo12(p32, g32, p10, g10, p30, g30); opo opo13(p21, g21, p[0], g[0], p20, g20); // third level of operator o opo opo14(p74, g74, p30, g30, p70, g70); opo opo15(p63, g63, p20, g20, p60, g60); opo opo16(p52, g52, p10, g10, p50, g50); opo opo17(p41, g41, p[0], g[0], p40, g40); // form the carry signals assign c1 = g[0] | (p[0] & c0); assign c2 = g10 | (p10 & c0); assign c3 = g20 | (p20 & c0); assign c4 = g30 | (p30 & c0); assign c5 = g40 | (p40 & c0); assign c6 = g50 | (p50 & c0); assign c7 = g60 | (p60 & c0); assign c8 = g70 | (p70 & c0); // form the sum signals xor(s[0], psum[0], c0); xor(s[1], psum[1], c1); xor(s[2], psum[2], c2); xor(s[3], psum[3], c3); xor(s[4], psum[4], c4); xor(s[5], psum[5], c5); xor(s[6], psum[6], c6); xor(s[7], psum[7], c7); endmodule