blob: 6368ae458e0b140f1120014ec7667c6926852fa7 [file] [log] [blame]
Matt Venn08cd6eb2020-11-16 12:01:14 +01001`default_nettype none
Tim Edwards53d92182020-10-11 21:47:40 -04002/*----------------------------------------------------------------------*/
3/* Buffers protecting the management region from the user region. */
4/* This mainly consists of tristate buffers that are enabled by a */
5/* "logic 1" output connected to the user's VCCD domain. This ensures */
6/* that the buffer is disabled and the output high-impedence when the */
7/* user 1.8V supply is absent. */
8/*----------------------------------------------------------------------*/
9/* Because there is no tristate buffer with a non-inverted enable, a */
10/* tristate inverter with non-inverted enable is used in series with */
11/* another (normal) inverter. */
12/*----------------------------------------------------------------------*/
13/* For the sake of placement/routing, one conb (logic 1) cell is used */
14/* for every buffer. */
15/*----------------------------------------------------------------------*/
16
17module mgmt_protect (
Tim Edwards53d92182020-10-11 21:47:40 -040018 inout vccd,
19 inout vssd,
20 inout vccd1,
21 inout vssd1,
Tim Edwards32d05422020-10-19 19:43:52 -040022 inout vccd2,
23 inout vssd2,
Tim Edwards05ad4fc2020-10-19 22:12:33 -040024 inout vdda1,
25 inout vssa1,
26 inout vdda2,
27 inout vssa2,
Tim Edwards53d92182020-10-11 21:47:40 -040028
29 input caravel_clk,
Tim Edwards7a8cbb12020-10-12 11:32:11 -040030 input caravel_clk2,
Tim Edwards53d92182020-10-11 21:47:40 -040031 input caravel_rstn,
32 input mprj_cyc_o_core,
33 input mprj_stb_o_core,
34 input mprj_we_o_core,
35 input [3:0] mprj_sel_o_core,
36 input [31:0] mprj_adr_o_core,
37 input [31:0] mprj_dat_o_core,
Tim Edwards43e5c602020-11-19 15:59:50 -050038
39 // All signal in/out directions are the reverse of the signal
40 // names at the buffer intrface.
41
42 output [127:0] la_data_in_mprj,
43 input [127:0] la_data_out_mprj,
44 input [127:0] la_oen_mprj,
45
46 input [127:0] la_data_out_core,
47 output [127:0] la_data_in_core,
48 output [127:0] la_oen_core,
Tim Edwards53d92182020-10-11 21:47:40 -040049
50 output user_clock,
Tim Edwards7a8cbb12020-10-12 11:32:11 -040051 output user_clock2,
Tim Edwards53d92182020-10-11 21:47:40 -040052 output user_resetn,
Ahmed Ghazy69663c72020-11-18 20:15:53 +020053 output user_reset,
Tim Edwards53d92182020-10-11 21:47:40 -040054 output mprj_cyc_o_user,
55 output mprj_stb_o_user,
56 output mprj_we_o_user,
57 output [3:0] mprj_sel_o_user,
58 output [31:0] mprj_adr_o_user,
59 output [31:0] mprj_dat_o_user,
Tim Edwards05ad4fc2020-10-19 22:12:33 -040060 output user1_vcc_powergood,
61 output user2_vcc_powergood,
62 output user1_vdd_powergood,
63 output user2_vdd_powergood
Tim Edwards53d92182020-10-11 21:47:40 -040064);
65
Tim Edwards43e5c602020-11-19 15:59:50 -050066 wire [458:0] mprj_logic1;
67 wire mprj2_logic1;
Tim Edwards05ad4fc2020-10-19 22:12:33 -040068
69 wire mprj_vdd_logic1_h;
70 wire mprj2_vdd_logic1_h;
71 wire mprj_vdd_logic1;
72 wire mprj2_vdd_logic1;
73
74 wire user1_vcc_powergood;
75 wire user2_vcc_powergood;
76 wire user1_vdd_powergood;
77 wire user2_vdd_powergood;
Tim Edwards53d92182020-10-11 21:47:40 -040078
Tim Edwards4518c622020-11-19 17:44:25 -050079 wire [127:0] la_data_in_mprj_bar;
80
Tim Edwards43e5c602020-11-19 15:59:50 -050081 sky130_fd_sc_hd__conb_1 mprj_logic_high [458:0] (
Ahmed Ghazy69663c72020-11-18 20:15:53 +020082`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -040083 .VPWR(vccd1),
84 .VGND(vssd1),
85 .VPB(vccd1),
86 .VNB(vssd1),
Ahmed Ghazy69663c72020-11-18 20:15:53 +020087`endif
Tim Edwards53d92182020-10-11 21:47:40 -040088 .HI(mprj_logic1),
89 .LO()
90 );
91
Tim Edwards32d05422020-10-19 19:43:52 -040092 sky130_fd_sc_hd__conb_1 mprj2_logic_high (
Ahmed Ghazy69663c72020-11-18 20:15:53 +020093`ifdef USE_POWER_PINS
Tim Edwards32d05422020-10-19 19:43:52 -040094 .VPWR(vccd2),
95 .VGND(vssd2),
96 .VPB(vccd2),
97 .VNB(vssd2),
Ahmed Ghazy69663c72020-11-18 20:15:53 +020098`endif
Tim Edwards32d05422020-10-19 19:43:52 -040099 .HI(mprj2_logic1),
100 .LO()
101 );
102
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400103 // Logic high in the VDDA (3.3V) domains
104
105 sky130_fd_sc_hvl__conb_1 mprj_logic_high_hvl (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200106`ifdef USE_POWER_PINS
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400107 .VPWR(vdda1),
108 .VGND(vssa1),
109 .VPB(vdda1),
110 .VNB(vssa1),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200111`endif
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400112 .HI(mprj_vdd_logic1_h),
113 .LO()
114 );
115
116 sky130_fd_sc_hvl__conb_1 mprj2_logic_high_hvl (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200117`ifdef USE_POWER_PINS
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400118 .VPWR(vdda2),
119 .VGND(vssa2),
120 .VPB(vdda2),
121 .VNB(vssa2),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200122`endif
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400123 .HI(mprj2_vdd_logic1_h),
124 .LO()
125 );
126
127 // Level shift the logic high signals into the 1.8V domain
128
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200129 sky130_fd_sc_hvl__lsbufhv2lv_1 mprj_logic_high_lv (
130`ifdef USE_POWER_PINS
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400131 .VPWR(vdda1),
132 .VGND(vssd),
133 .LVPWR(vccd),
134 .VPB(vdda1),
135 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200136`endif
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400137 .X(mprj_vdd_logic1),
138 .A(mprj_vdd_logic1_h)
139 );
140
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200141 sky130_fd_sc_hvl__lsbufhv2lv_1 mprj2_logic_high_lv (
142`ifdef USE_POWER_PINS
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400143 .VPWR(vdda2),
144 .VGND(vssd),
145 .LVPWR(vccd),
146 .VPB(vdda2),
147 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200148`endif
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400149 .X(mprj2_vdd_logic1),
150 .A(mprj2_vdd_logic1_h)
151 );
Tim Edwards32d05422020-10-19 19:43:52 -0400152
Tim Edwards43e5c602020-11-19 15:59:50 -0500153 // Buffering from the user side to the management side.
154 // NOTE: This is intended to be better protected, by a full
155 // chain of an lv-to-hv buffer followed by an hv-to-lv buffer.
156 // This serves as a placeholder until that configuration is
157 // checked and characterized. The function below forces the
158 // data input to the management core to be a solid logic 0 when
159 // the user project is powered down.
160
Tim Edwards4518c622020-11-19 17:44:25 -0500161 sky130_fd_sc_hd__nand2_4 user_to_mprj_in_gates [127:0] (
162`ifdef USE_POWER_PINS
163 .VPWR(vccd),
164 .VGND(vssd),
165 .VPB(vccd),
166 .VNB(vssd),
167`endif
168 .Y(la_data_in_mprj_bar),
169 .A(la_data_out_core),
170 .B(mprj_logic1[457:330])
171 );
172
173 sky130_fd_sc_hd__inv_8 user_to_mprj_in_buffers [127:0] (
Tim Edwards43e5c602020-11-19 15:59:50 -0500174`ifdef USE_POWER_PINS
175 .VPWR(vccd),
176 .VGND(vssd),
177 .VPB(vccd),
178 .VNB(vssd),
179`endif
180 .Y(la_data_in_mprj),
Tim Edwards4518c622020-11-19 17:44:25 -0500181 .A(la_data_in_mprj_bar)
Tim Edwards43e5c602020-11-19 15:59:50 -0500182 );
183
184 // The remaining circuitry guards against the management
185 // SoC dumping current into the user project area when
186 // the user project area is powered down.
187
Tim Edwards53d92182020-10-11 21:47:40 -0400188 sky130_fd_sc_hd__einvp_8 mprj_rstn_buf (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200189`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400190 .VPWR(vccd),
191 .VGND(vssd),
192 .VPB(vccd),
193 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200194`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400195 .Z(user_resetn),
196 .A(~caravel_rstn),
197 .TE(mprj_logic1[0])
198 );
199
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200200 assign user_reset = ~user_resetn;
201
Tim Edwards53d92182020-10-11 21:47:40 -0400202 sky130_fd_sc_hd__einvp_8 mprj_clk_buf (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200203`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400204 .VPWR(vccd),
205 .VGND(vssd),
206 .VPB(vccd),
207 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200208`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400209 .Z(user_clock),
210 .A(~caravel_clk),
211 .TE(mprj_logic1[1])
212 );
213
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400214 sky130_fd_sc_hd__einvp_8 mprj_clk2_buf (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200215`ifdef USE_POWER_PINS
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400216 .VPWR(vccd),
217 .VGND(vssd),
218 .VPB(vccd),
219 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200220`endif
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400221 .Z(user_clock2),
222 .A(~caravel_clk2),
223 .TE(mprj_logic1[2])
224 );
225
Tim Edwards53d92182020-10-11 21:47:40 -0400226 sky130_fd_sc_hd__einvp_8 mprj_cyc_buf (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200227`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400228 .VPWR(vccd),
229 .VGND(vssd),
230 .VPB(vccd),
231 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200232`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400233 .Z(mprj_cyc_o_user),
234 .A(~mprj_cyc_o_core),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400235 .TE(mprj_logic1[3])
Tim Edwards53d92182020-10-11 21:47:40 -0400236 );
237
238 sky130_fd_sc_hd__einvp_8 mprj_stb_buf (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200239`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400240 .VPWR(vccd),
241 .VGND(vssd),
242 .VPB(vccd),
243 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200244`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400245 .Z(mprj_stb_o_user),
246 .A(~mprj_stb_o_core),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400247 .TE(mprj_logic1[4])
Tim Edwards53d92182020-10-11 21:47:40 -0400248 );
249
250 sky130_fd_sc_hd__einvp_8 mprj_we_buf (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200251`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400252 .VPWR(vccd),
253 .VGND(vssd),
254 .VPB(vccd),
255 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200256`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400257 .Z(mprj_we_o_user),
258 .A(~mprj_we_o_core),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400259 .TE(mprj_logic1[5])
Tim Edwards53d92182020-10-11 21:47:40 -0400260 );
261
262 sky130_fd_sc_hd__einvp_8 mprj_sel_buf [3:0] (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200263`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400264 .VPWR(vccd),
265 .VGND(vssd),
266 .VPB(vccd),
267 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200268`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400269 .Z(mprj_sel_o_user),
270 .A(~mprj_sel_o_core),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400271 .TE(mprj_logic1[9:6])
Tim Edwards53d92182020-10-11 21:47:40 -0400272 );
273
274 sky130_fd_sc_hd__einvp_8 mprj_adr_buf [31:0] (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200275`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400276 .VPWR(vccd),
277 .VGND(vssd),
278 .VPB(vccd),
279 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200280`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400281 .Z(mprj_adr_o_user),
282 .A(~mprj_adr_o_core),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400283 .TE(mprj_logic1[41:10])
Tim Edwards53d92182020-10-11 21:47:40 -0400284 );
285
286 sky130_fd_sc_hd__einvp_8 mprj_dat_buf [31:0] (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200287`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400288 .VPWR(vccd),
289 .VGND(vssd),
290 .VPB(vccd),
291 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200292`endif
Tim Edwards53d92182020-10-11 21:47:40 -0400293 .Z(mprj_dat_o_user),
294 .A(~mprj_dat_o_core),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400295 .TE(mprj_logic1[73:42])
Tim Edwards53d92182020-10-11 21:47:40 -0400296 );
297
Tim Edwards43e5c602020-11-19 15:59:50 -0500298 /* Project data out from the managment side to the user project */
299 /* area when the user project is powered down. */
Tim Edwards53d92182020-10-11 21:47:40 -0400300
301 sky130_fd_sc_hd__einvp_8 la_buf [127:0] (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200302`ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400303 .VPWR(vccd),
304 .VGND(vssd),
305 .VPB(vccd),
306 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200307`endif
Tim Edwards43e5c602020-11-19 15:59:50 -0500308 .Z(la_data_in_core),
309 .A(~la_data_out_mprj),
310 .TE(mprj_logic1[201:74])
Tim Edwards53d92182020-10-11 21:47:40 -0400311 );
312
Tim Edwards43e5c602020-11-19 15:59:50 -0500313 /* Project data out enable (bar) from the managment side to the */
314 /* user project area when the user project is powered down. */
315
316 sky130_fd_sc_hd__einvp_8 user_to_mprj_oen_buffers [127:0] (
317`ifdef USE_POWER_PINS
318 .VPWR(vccd),
319 .VGND(vssd),
320 .VPB(vccd),
321 .VNB(vssd),
322`endif
323 .Z(la_oen_core),
324 .A(~la_oen_mprj),
325 .TE(mprj_logic1[329:202])
326 );
327
Tim Edwards32d05422020-10-19 19:43:52 -0400328 /* The conb cell output is a resistive connection directly to */
329 /* the power supply, so when returning the user1_powergood */
330 /* signal, make sure that it is buffered properly. */
331
332 sky130_fd_sc_hd__buf_8 mprj_pwrgood (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200333`ifdef USE_POWER_PINS
Tim Edwards32d05422020-10-19 19:43:52 -0400334 .VPWR(vccd),
335 .VGND(vssd),
336 .VPB(vccd),
337 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200338`endif
Tim Edwards43e5c602020-11-19 15:59:50 -0500339 .A(mprj_logic1[458]),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400340 .X(user1_vcc_powergood)
Tim Edwards32d05422020-10-19 19:43:52 -0400341 );
342
343 sky130_fd_sc_hd__buf_8 mprj2_pwrgood (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200344`ifdef USE_POWER_PINS
Tim Edwards32d05422020-10-19 19:43:52 -0400345 .VPWR(vccd),
346 .VGND(vssd),
347 .VPB(vccd),
348 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200349`endif
Tim Edwards43e5c602020-11-19 15:59:50 -0500350 .A(mprj2_vdd_logic1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400351 .X(user2_vcc_powergood)
Tim Edwards32d05422020-10-19 19:43:52 -0400352 );
353
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400354 sky130_fd_sc_hd__buf_8 mprj_vdd_pwrgood (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200355`ifdef USE_POWER_PINS
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400356 .VPWR(vccd),
357 .VGND(vssd),
358 .VPB(vccd),
359 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200360`endif
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400361 .A(mprj_vdd_logic1),
Tim Edwards581068f2020-11-19 12:45:25 -0500362 .X(user1_vdd_powergood)
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400363 );
364
365 sky130_fd_sc_hd__buf_8 mprj2_vdd_pwrgood (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200366`ifdef USE_POWER_PINS
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400367 .VPWR(vccd),
368 .VGND(vssd),
369 .VPB(vccd),
370 .VNB(vssd),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200371`endif
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400372 .A(mprj2_vdd_logic1),
373 .X(user2_vdd_powergood)
374 );
Tim Edwards53d92182020-10-11 21:47:40 -0400375endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500376`default_nettype wire