blob: 4363c007a5c47b77c1a424f792b75f79eb54f6c6 [file] [log] [blame]
Tim Edwardscd64af52020-08-07 11:11:58 -04001// Tunable ring oscillator---synthesizable (physical) version.
2//
3// NOTE: This netlist cannot be simulated correctly due to lack
4// of accurate timing in the digital cell verilog models.
5
6module delay_stage(in, trim, out);
7 input in;
8 input [1:0] trim;
9 output out;
10
11 wire d0, d1, d2;
12
Tim Edwardsef8312e2020-09-22 17:20:06 -040013 sky130_fd_sc_hd__clkbuf_2 delaybuf0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040014 .A(in),
15 .X(ts)
16 );
17
Tim Edwardsef8312e2020-09-22 17:20:06 -040018 sky130_fd_sc_hd__clkbuf_1 delaybuf1 (
Tim Edwardscd64af52020-08-07 11:11:58 -040019 .A(ts),
20 .X(d0)
21 );
22
Tim Edwardsef8312e2020-09-22 17:20:06 -040023 sky130_fd_sc_hd__einvp_2 delayen1 (
Tim Edwardscd64af52020-08-07 11:11:58 -040024 .A(d0),
25 .TE(trim[1]),
26 .Z(d1)
27 );
28
Tim Edwardsef8312e2020-09-22 17:20:06 -040029 sky130_fd_sc_hd__einvn_4 delayenb1 (
Tim Edwardscd64af52020-08-07 11:11:58 -040030 .A(ts),
31 .TEB(trim[1]),
32 .Z(d1)
33 );
34
Tim Edwardsef8312e2020-09-22 17:20:06 -040035 sky130_fd_sc_hd__clkinv_1 delayint0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040036 .A(d1),
37 .Y(d2)
38 );
39
Tim Edwardsef8312e2020-09-22 17:20:06 -040040 sky130_fd_sc_hd__einvp_2 delayen0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040041 .A(d2),
42 .TE(trim[0]),
43 .Z(out)
44 );
45
Tim Edwardsef8312e2020-09-22 17:20:06 -040046 sky130_fd_sc_hd__einvn_8 delayenb0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040047 .A(ts),
48 .TEB(trim[0]),
49 .Z(out)
50 );
51
52endmodule
53
54module start_stage(in, trim, reset, out);
55 input in;
56 input [1:0] trim;
57 input reset;
58 output out;
59
60 wire d0, d1, d2, ctrl0, one;
61
Tim Edwardsef8312e2020-09-22 17:20:06 -040062 sky130_fd_sc_hd__clkbuf_1 delaybuf0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040063 .A(in),
64 .X(d0)
65 );
66
Tim Edwardsef8312e2020-09-22 17:20:06 -040067 sky130_fd_sc_hd__einvp_2 delayen1 (
Tim Edwardscd64af52020-08-07 11:11:58 -040068 .A(d0),
69 .TE(trim[1]),
70 .Z(d1)
71 );
72
Tim Edwardsef8312e2020-09-22 17:20:06 -040073 sky130_fd_sc_hd__einvn_4 delayenb1 (
Tim Edwardscd64af52020-08-07 11:11:58 -040074 .A(in),
75 .TEB(trim[1]),
76 .Z(d1)
77 );
78
Tim Edwardsef8312e2020-09-22 17:20:06 -040079 sky130_fd_sc_hd__clkinv_1 delayint0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040080 .A(d1),
81 .Y(d2)
82 );
83
Tim Edwardsef8312e2020-09-22 17:20:06 -040084 sky130_fd_sc_hd__einvp_2 delayen0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040085 .A(d2),
86 .TE(trim[0]),
87 .Z(out)
88 );
89
Tim Edwardsef8312e2020-09-22 17:20:06 -040090 sky130_fd_sc_hd__einvn_8 delayenb0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040091 .A(in),
92 .TEB(ctrl0),
93 .Z(out)
94 );
95
Tim Edwardsef8312e2020-09-22 17:20:06 -040096 sky130_fd_sc_hd__einvp_1 reseten0 (
Tim Edwardscd64af52020-08-07 11:11:58 -040097 .A(one),
98 .TE(reset),
99 .Z(out)
100 );
101
Tim Edwardsef8312e2020-09-22 17:20:06 -0400102 sky130_fd_sc_hd__or2_2 ctrlen0 (
Tim Edwardscd64af52020-08-07 11:11:58 -0400103 .A(reset),
104 .B(trim[0]),
105 .X(ctrl0)
106 );
107
Tim Edwardsef8312e2020-09-22 17:20:06 -0400108 sky130_fd_sc_hd__conb_1 const1 (
Tim Edwardscd64af52020-08-07 11:11:58 -0400109 .HI(one),
110 .LO()
111 );
112
113endmodule
114
115// Ring oscillator with 13 stages, each with two trim bits delay
116// (see above). Trim is not binary: For trim[1:0], lower bit
117// trim[0] is primary trim and must be applied first; upper
118// bit trim[1] is secondary trim and should only be applied
119// after the primary trim is applied, or it has no effect.
120//
121// Total effective number of inverter stages in this oscillator
122// ranges from 13 at trim 0 to 65 at trim 24. The intention is
123// to cover a range greater than 2x so that the midrange can be
124// reached over all PVT conditions.
125//
126// Frequency of this ring oscillator under SPICE simulations at
127// nominal PVT is maximum 214 MHz (trim 0), minimum 90 MHz (trim 24).
128
129module ring_osc2x13(reset, trim, clockp);
130 input reset;
131 input [25:0] trim;
132 output[1:0] clockp;
133
134 wire [12:0] d;
135 wire [1:0] clockp;
136 wire [1:0] c;
137
138 // Main oscillator loop stages
139
140 genvar i;
141 generate
142 for (i = 0; i < 12; i = i + 1) begin : dstage
143 delay_stage id (
144 .in(d[i]),
145 .trim({trim[i+13], trim[i]}),
146 .out(d[i+1])
147 );
148 end
149 endgenerate
150
151 // Reset/startup stage
152
153 start_stage iss (
154 .in(d[12]),
155 .trim({trim[25], trim[12]}),
156 .reset(reset),
157 .out(d[0])
158 );
159
160 // Buffered outputs a 0 and 90 degrees phase (approximately)
161
Tim Edwardsef8312e2020-09-22 17:20:06 -0400162 sky130_fd_sc_hd__clkinv_2 ibufp00 (
Tim Edwardscd64af52020-08-07 11:11:58 -0400163 .A(d[0]),
164 .Y(c[0])
165 );
Tim Edwardsef8312e2020-09-22 17:20:06 -0400166 sky130_fd_sc_hd__clkinv_8 ibufp01 (
Tim Edwardscd64af52020-08-07 11:11:58 -0400167 .A(c[0]),
168 .Y(clockp[0])
169 );
Tim Edwardsef8312e2020-09-22 17:20:06 -0400170 sky130_fd_sc_hd__clkinv_2 ibufp10 (
Tim Edwardscd64af52020-08-07 11:11:58 -0400171 .A(d[6]),
172 .Y(c[1])
173 );
Tim Edwardsef8312e2020-09-22 17:20:06 -0400174 sky130_fd_sc_hd__clkinv_8 ibufp11 (
Tim Edwardscd64af52020-08-07 11:11:58 -0400175 .A(c[1]),
176 .Y(clockp[1])
177 );
178
179endmodule