@@ -9,21 +9,19 @@ But it's still fast enough for most debug chores.
99
1010/*
1111 8-step sequencer using an inverted ring counter,
12- aka Johnson counter. 4 DFF, 8 AND,
12+ aka Johnson counter. 4 DFF, 4 AND,
1313 using raw cells from iHP CMOS PDK
1414
1515 In this version, reset forces all outputs to 1 instead of 0
1616 to flush the shift register very fast.
1717
18- area : 10.8864 + 4×54.432 + 8 ×14.5152 = 344.736
18+ area : 10.8864 + 4×54.432 + 4 ×14.5152 = 286.68
1919*/
20-
2120module Johnson8 (
22- input wire CLK,
23- input wire RESET,
24- output wire [3 :0 ] DFF4,
25- output wire [7 :0 ] Decoded8);
26-
21+ input wire CLK,
22+ input wire RESET,
23+ output wire [3 :0 ] Latch
24+ );
2725 // invert & Boost Reset
2826 wire rstN;
2927 (* keep * ) sg13g2_inv_4 boost0(.Y(rstN), .A(RESET));
@@ -34,17 +32,12 @@ module Johnson8(
3432 (* keep * ) sg13g2_dfrbp_2 DFF_J2(.Q(J4P[1 ]), .Q_N(J4N[1 ]), .D(J4P[0 ]), .RESET_B(RESET), .CLK(CLK));
3533 (* keep * ) sg13g2_dfrbp_2 DFF_J3(.Q(J4P[2 ]), .Q_N(J4N[2 ]), .D(J4P[1 ]), .RESET_B(RESET), .CLK(CLK));
3634 (* keep * ) sg13g2_dfrbp_2 DFF_J4(.Q(J4P[3 ]), .Q_N(J4N[3 ]), .D(J4P[2 ]), .RESET_B(RESET), .CLK(CLK));
37- assign DFF4 = J4P;
3835
3936 // The decoder
40- (* keep * ) sg13g2_a21o_2 dec0(.X (Decoded8[0 ]), .A1(J4N[3 ]), .A2(J4N[0 ]), .B1(rstN));
41- (* keep * ) sg13g2_a21o_2 dec1(.X (Decoded8[1 ]), .A1(J4P[0 ]), .A2(J4N[1 ]), .B1(rstN));
42- (* keep * ) sg13g2_a21o_2 dec2(.X (Decoded8[2 ]), .A1(J4P[1 ]), .A2(J4N[2 ]), .B1(rstN));
43- (* keep * ) sg13g2_a21o_2 dec3(.X (Decoded8[3 ]), .A1(J4P[2 ]), .A2(J4N[3 ]), .B1(rstN));
44- (* keep * ) sg13g2_a21o_2 dec4(.X (Decoded8[4 ]), .A1(J4P[3 ]), .A2(J4P[0 ]), .B1(rstN));
45- (* keep * ) sg13g2_a21o_2 dec5(.X (Decoded8[5 ]), .A1(J4N[0 ]), .A2(J4P[1 ]), .B1(rstN));
46- (* keep * ) sg13g2_a21o_2 dec6(.X (Decoded8[6 ]), .A1(J4N[1 ]), .A2(J4P[2 ]), .B1(rstN));
47- (* keep * ) sg13g2_a21o_2 dec7(.X (Decoded8[7 ]), .A1(J4N[2 ]), .A2(J4P[3 ]), .B1(rstN));
37+ (* keep * ) sg13g2_a21o_2 dec0(.X (Latch[0 ]), .A1(J4N[3 ]), .A2(J4N[0 ]), .B1(rstN));
38+ (* keep * ) sg13g2_a21o_2 dec2(.X (Latch[1 ]), .A1(J4P[1 ]), .A2(J4N[2 ]), .B1(rstN));
39+ (* keep * ) sg13g2_a21o_2 dec4(.X (Latch[2 ]), .A1(J4P[3 ]), .A2(J4P[0 ]), .B1(rstN));
40+ (* keep * ) sg13g2_a21o_2 dec6(.X (Latch[3 ]), .A1(J4N[1 ]), .A2(J4P[2 ]), .B1(rstN));
4841endmodule
4942
5043
@@ -113,14 +106,44 @@ module SC_RSFF_out(
113106 input wire SET,
114107 output wire Dout,
115108 output wire DoutN,
116- output wire Q,
117- output wire Q_N);
109+ output wire Q);
118110 // The scan chain:
119111 (* keep * ) sg13g2_a21oi_1 rssc_neg(.Y(Q_N), .A1(EN), .A2(D ), .B1(Q ));
120112 (* keep * ) sg13g2_a21oi_1 rssc_pos(.Y(Q ), .A1(EN), .A2(D_N), .B1(Q_N));
121113 // The data latch:
114+ wire Q_N;
122115 (* keep * ) sg13g2_a21oi_1 rsdo_neg(.Y(DoutN), .A1(GET), .A2(Q ), .B1(Dout ));
123116 (* keep * ) sg13g2_a21oi_1 rsdo_pos(.Y(Dout ), .A1(GET), .A2(Q_N), .B1(DoutN));
124117endmodule
125118
126119// Note : SC_RFF_inout is possible. But not required here yet so I skip.
120+
121+ module SC_Quad_In (
122+ input wire GET,
123+ input wire [2 :0 ] Din,
124+
125+ input wire [3 :0 ] Latch,
126+ input wire [1 :0 ] SCin,
127+ output wire [1 :0 ] SCout
128+ );
129+ wire tp1, tp2, tp3, tn1, tn2, tn3;
130+ SC_RSFF tmp (.D(SCin[0 ]), .D_N(SCin[1 ]), .EN(Latch[3 ]), .Q(tp1), .Q_N(tn1));
131+ SC_RSFF_in in2 (.D(tp1), .D_N(tn1), .EN(Latch[2 ]), .Q(tp2), .Q_N(tn2), .Din(Din[2 ]), .GET(GET));
132+ SC_RSFF_in in1 (.D(tp2), .D_N(tn2), .EN(Latch[1 ]), .Q(tp3), .Q_N(tn3), .Din(Din[1 ]), .GET(GET));
133+ SC_RSFF_in in0 (.D(tp3), .D_N(tn3), .EN(Latch[0 ]), .Q(SCout[0 ]), .Q_N(SCout[1 ]), .Din(Din[0 ]), .GET(GET));
134+ endmodule
135+
136+ module SC_Quad_Out (
137+ input wire SET,
138+ output wire [2 :0 ] Dout,
139+
140+ input wire [3 :0 ] Latch,
141+ input wire [1 :0 ] SCin,
142+ output wire [1 :0 ] SCout
143+ );
144+ wire tp1, tp2, tp3, tn1, tn2, tn3;
145+ SC_RSFF tmp (.D(SCin[0 ]), .D_N(SCin[1 ]), .EN(Latch[3 ]), .Q(tp1), .Q_N(tn1));
146+ SC_RSFF_out out2 (.D(tp1), .D_N(tn1), .EN(Latch[2 ]), .Q(tp2), .Q_N(tn2), .Dout(Dout[2 ]), .SET(SET));
147+ SC_RSFF_out out1 (.D(tp2), .D_N(tn2), .EN(Latch[1 ]), .Q(tp3), .Q_N(tn3), .Dout(Dout[1 ]), .SET(SET));
148+ SC_RSFF_out out0 (.D(tp3), .D_N(tn3), .EN(Latch[0 ]), .Q(SCout[0 ]), .Q_N(SCout[1 ]), .Dout(Dout[0 ]), .SET(SET));
149+ endmodule
0 commit comments