Skip to content

Commit 54091eb

Browse files
authored
Update ScanChain.v
1 parent fd4b643 commit 54091eb

1 file changed

Lines changed: 42 additions & 19 deletions

File tree

src/ScanChain.v

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
2120
module 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));
4841
endmodule
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));
124117
endmodule
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

Comments
 (0)