blob: 463f12777f3c1d623762e432a80672858ccb70a8 [file] [log] [blame]
Tim Edwards9f385692020-09-22 17:20:06 -04001/*--------------------------------------------------------------*/
2/* caravel, a project harness for the Google/SkyWater sky130 */
3/* fabrication process and open source PDK */
4/* */
5/* Copyright 2020 efabless, Inc. */
6/* Written by Tim Edwards, December 2019 */
7/* and Mohamed Shalan, August 2020 */
8/* This file is open source hardware released under the */
9/* Apache 2.0 license. See file LICENSE. */
10/* */
11/*--------------------------------------------------------------*/
12
13`timescale 1 ns / 1 ps
14
15`define USE_OPENRAM
16`define USE_PG_PIN
17`define functional
Tim Edwardsdcf18eb2020-09-25 17:08:59 -040018`define UNIT_DELAY #1
Tim Edwards9f385692020-09-22 17:20:06 -040019
Tim Edwardsa239c562020-10-08 21:36:44 -040020`define MPRJ_IO_PADS 37
21`define MPRJ_PWR_PADS 4 /* vdda1, vccd1, vdda2, vccd2 */
Tim Edwards9f385692020-09-22 17:20:06 -040022
23`include "pads.v"
24
Tim Edwards53bee222020-10-11 14:52:01 -040025/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
Tim Edwards9f385692020-09-22 17:20:06 -040026
Tim Edwards53bee222020-10-11 14:52:01 -040027`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
28// `include "libs.ref/sky130_fd_io/verilog/power_pads_lib.v"
29
30`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
31`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
32`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
33`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwards9f385692020-09-22 17:20:06 -040034
35`include "mgmt_soc.v"
Tim Edwards19ddfd02020-10-04 22:09:54 -040036`include "housekeeping_spi.v"
Tim Edwards9f385692020-09-22 17:20:06 -040037`include "digital_pll.v"
Tim Edwards66322fd2020-10-10 14:02:11 -040038`include "caravel_clocking.v"
Tim Edwards9f385692020-09-22 17:20:06 -040039`include "mgmt_core.v"
40`include "mprj_io.v"
41`include "chip_io.v"
Tim Edwardsb5d5b272020-10-02 22:27:50 -040042`include "user_id_programming.v"
43`include "gpio_control_block.v"
Tim Edwards66322fd2020-10-10 14:02:11 -040044`include "clock_div.v"
Tim Edwardse8fb9ff2020-10-05 16:30:24 -040045`include "simple_por.v"
Tim Edwards9f385692020-09-22 17:20:06 -040046
Tim Edwards65f571d2020-10-06 14:59:26 -040047/*------------------------------*/
48/* Include user project here */
49/*------------------------------*/
50`include "user_proj_example.v"
51
Tim Edwards9f385692020-09-22 17:20:06 -040052`ifdef USE_OPENRAM
53 `include "sram_1rw1r_32_8192_8_sky130.v"
54`endif
55
56module caravel (
Tim Edwardsa239c562020-10-08 21:36:44 -040057 inout vddio, // Common 3.3V padframe/ESD power
58 inout vssio, // Common padframe/ESD ground
59 inout vdda, // Management 3.3V power
60 inout vssa, // Common analog ground
61 inout vccd, // Management/Common 1.8V power
62 inout vssd, // Common digital ground
63 inout vdda1, // User area 1 3.3V power
64 inout vdda2, // User area 2 3.3V power
65 inout vssa1, // User area 1 analog ground
66 inout vssa2, // User area 2 analog ground
67 inout vccd1, // User area 1 1.8V power
68 inout vccd2, // User area 2 1.8V power
69 inout vssd1, // User area 1 digital ground
70 inout vssd2, // User area 2 digital ground
71
Tim Edwardsb5d5b272020-10-02 22:27:50 -040072 inout gpio, // Used for external LDO control
Tim Edwards9f385692020-09-22 17:20:06 -040073 inout [`MPRJ_IO_PADS-1:0] mprj_io,
74 input clock, // CMOS core clock input, not a crystal
Tim Edwardsb5d5b272020-10-02 22:27:50 -040075 input resetb,
76
77 // Note that only two pins are available on the flash so dual and
78 // quad flash modes are not available.
79
Tim Edwards9f385692020-09-22 17:20:06 -040080 output flash_csb,
81 output flash_clk,
82 output flash_io0,
Tim Edwardsb5d5b272020-10-02 22:27:50 -040083 output flash_io1
Tim Edwards9f385692020-09-22 17:20:06 -040084);
85
Tim Edwardsb5d5b272020-10-02 22:27:50 -040086 //------------------------------------------------------------
87 // This value is uniquely defined for each user project.
88 //------------------------------------------------------------
89 parameter USER_PROJECT_ID = 32'h0;
Tim Edwards9f385692020-09-22 17:20:06 -040090
Tim Edwardsb5d5b272020-10-02 22:27:50 -040091 // These pins are overlaid on mprj_io space. They have the function
92 // below when the management processor is in reset, or in the default
93 // configuration. They are assigned to uses in the user space by the
94 // configuration program running off of the SPI flash. Note that even
95 // when the user has taken control of these pins, they can be restored
96 // to the original use by setting the resetb pin low. The SPI pins and
97 // UART pins can be connected directly to an FTDI chip as long as the
98 // FTDI chip sets these lines to high impedence (input function) at
99 // all times except when holding the chip in reset.
100
101 // JTAG = mprj_io[0] (inout)
102 // SDO = mprj_io[1] (output)
103 // SDI = mprj_io[2] (input)
104 // CSB = mprj_io[3] (input)
105 // SCK = mprj_io[4] (input)
106 // ser_rx = mprj_io[5] (input)
107 // ser_tx = mprj_io[6] (output)
108 // irq = mprj_io[7] (input)
109
110 // These pins are reserved for any project that wants to incorporate
111 // its own processor and flash controller. While a user project can
112 // technically use any available I/O pins for the purpose, these
113 // four pins connect to a pass-through mode from the SPI slave (pins
114 // 1-4 above) so that any SPI flash connected to these specific pins
115 // can be accessed through the SPI slave even when the processor is in
116 // reset.
117
Tim Edwards19ddfd02020-10-04 22:09:54 -0400118 // user_flash_csb = mprj_io[8]
119 // user_flash_sck = mprj_io[9]
120 // user_flash_io0 = mprj_io[10]
121 // user_flash_io1 = mprj_io[11]
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400122
123 // One-bit GPIO dedicated to management SoC (outside of user control)
124 wire gpio_out_core;
125 wire gpio_in_core;
126 wire gpio_mode0_core;
127 wire gpio_mode1_core;
128 wire gpio_outenb_core;
129 wire gpio_inenb_core;
130
131 // Mega-Project Control (pad-facing)
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400132 wire mprj_io_loader_resetn;
133 wire mprj_io_loader_clock;
134 wire mprj_io_loader_data;
135
Tim Edwards9f385692020-09-22 17:20:06 -0400136 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
137 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
138 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards19ddfd02020-10-04 22:09:54 -0400139 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwards9f385692020-09-22 17:20:06 -0400140 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400141 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
142 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
143 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwards9f385692020-09-22 17:20:06 -0400144 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
145 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
146 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
147 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
148 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
149 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
150
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400151 // Mega-Project Control (user-facing)
Tim Edwards19ddfd02020-10-04 22:09:54 -0400152 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400153 wire [`MPRJ_IO_PADS-1:0] user_io_in;
154 wire [`MPRJ_IO_PADS-1:0] user_io_out;
155
156 /* Padframe control signals */
157 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
158 wire mgmt_serial_clock;
159 wire mgmt_serial_resetn;
160
Tim Edwards19ddfd02020-10-04 22:09:54 -0400161 // Mega-Project Control management I/O
162 // There are two types of GPIO connections:
163 // (1) Full Bidirectional: Management connects to in, out, and oeb
164 // Uses: JTAG and SDO
165 // (2) Selectable bidirectional: Management connects to in and out,
166 // which are tied together. oeb is grounded (oeb from the
167 // configuration is used)
168
169 // SDI = mprj_io[2] (input)
170 // CSB = mprj_io[3] (input)
171 // SCK = mprj_io[4] (input)
172 // ser_rx = mprj_io[5] (input)
173 // ser_tx = mprj_io[6] (output)
174 // irq = mprj_io[7] (input)
175
176 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
177 wire jtag_out, sdo_out;
178 wire jtag_outenb, sdo_outenb;
179
180 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
181 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
182 wire [1:0] mgmt_io_nc2; /* no-connects */
183
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400184 // Power-on-reset signal. The reset pad generates the sense-inverted
185 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
186 // derived.
187
Tim Edwards9f385692020-09-22 17:20:06 -0400188 wire porb_h;
189 wire porb_l;
Tim Edwards9f385692020-09-22 17:20:06 -0400190
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400191 wire rstb_h;
192 wire rstb_l;
193
Tim Edwards19ddfd02020-10-04 22:09:54 -0400194 // To be considered: Master hold signal on all user pads (?)
195 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
196 // and setting enh to porb_h.
Tim Edwardsa239c562020-10-08 21:36:44 -0400197 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards19ddfd02020-10-04 22:09:54 -0400198 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
199
Tim Edwards9f385692020-09-22 17:20:06 -0400200 chip_io padframe(
201 // Package Pins
Tim Edwardsa239c562020-10-08 21:36:44 -0400202 .vddio(vddio),
203 .vssio(vssio),
204 .vdda(vdda),
205 .vssa(vssa),
206 .vccd(vccd),
207 .vssd(vssd),
208 .vdda1(vdda1),
209 .vdda2(vdda2),
210 .vssa1(vssa1),
211 .vssa2(vssa2),
212 .vccd1(vccd1),
213 .vccd2(vccd2),
214 .vssd1(vssd1),
215 .vssd2(vssd2),
216
Tim Edwards9f385692020-09-22 17:20:06 -0400217 .gpio(gpio),
218 .mprj_io(mprj_io),
219 .clock(clock),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400220 .resetb(resetb),
Tim Edwards9f385692020-09-22 17:20:06 -0400221 .flash_csb(flash_csb),
222 .flash_clk(flash_clk),
223 .flash_io0(flash_io0),
224 .flash_io1(flash_io1),
Tim Edwards9f385692020-09-22 17:20:06 -0400225 // SoC Core Interface
Tim Edwards9f385692020-09-22 17:20:06 -0400226 .porb_h(porb_h),
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400227 .resetb_core_h(rstb_h),
Tim Edwards9f385692020-09-22 17:20:06 -0400228 .clock_core(clock_core),
229 .gpio_out_core(gpio_out_core),
230 .gpio_in_core(gpio_in_core),
231 .gpio_mode0_core(gpio_mode0_core),
232 .gpio_mode1_core(gpio_mode1_core),
233 .gpio_outenb_core(gpio_outenb_core),
234 .gpio_inenb_core(gpio_inenb_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400235 .flash_csb_core(flash_csb_core),
236 .flash_clk_core(flash_clk_core),
237 .flash_csb_oeb_core(flash_csb_oeb_core),
238 .flash_clk_oeb_core(flash_clk_oeb_core),
239 .flash_io0_oeb_core(flash_io0_oeb_core),
240 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400241 .flash_csb_ieb_core(flash_csb_ieb_core),
242 .flash_clk_ieb_core(flash_clk_ieb_core),
243 .flash_io0_ieb_core(flash_io0_ieb_core),
244 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400245 .flash_io0_do_core(flash_io0_do_core),
246 .flash_io1_do_core(flash_io1_do_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400247 .flash_io0_di_core(flash_io0_di_core),
248 .flash_io1_di_core(flash_io1_di_core),
Tim Edwards19ddfd02020-10-04 22:09:54 -0400249 .por(~porb_l),
Tim Edwards9f385692020-09-22 17:20:06 -0400250 .mprj_io_in(mprj_io_in),
251 .mprj_io_out(mprj_io_out),
Tim Edwards19ddfd02020-10-04 22:09:54 -0400252 .mprj_io_oeb(mprj_io_oeb),
Tim Edwards9f385692020-09-22 17:20:06 -0400253 .mprj_io_hldh_n(mprj_io_hldh_n),
254 .mprj_io_enh(mprj_io_enh),
255 .mprj_io_inp_dis(mprj_io_inp_dis),
256 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400257 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
258 .mprj_io_slow_sel(mprj_io_slow_sel),
259 .mprj_io_holdover(mprj_io_holdover),
Tim Edwards9f385692020-09-22 17:20:06 -0400260 .mprj_io_analog_en(mprj_io_analog_en),
261 .mprj_io_analog_sel(mprj_io_analog_sel),
262 .mprj_io_analog_pol(mprj_io_analog_pol),
263 .mprj_io_dm(mprj_io_dm)
264 );
265
266 // SoC core
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400267 wire caravel_clk;
268 wire caravel_rstn;
Tim Edwards9f385692020-09-22 17:20:06 -0400269
270 wire [7:0] spi_ro_config_core;
271
272 // LA signals
273 wire [127:0] la_output_core; // From CPU to MPRJ
274 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
275 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
276 wire [127:0] la_output_mprj; // From MPRJ to CPU
277 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
278
279 // WB MI A (Mega Project)
280 wire mprj_cyc_o_core;
281 wire mprj_stb_o_core;
282 wire mprj_we_o_core;
283 wire [3:0] mprj_sel_o_core;
284 wire [31:0] mprj_adr_o_core;
285 wire [31:0] mprj_dat_o_core;
286 wire mprj_ack_i_core;
287 wire [31:0] mprj_dat_i_core;
288
289 // WB MI B (xbar)
290 wire xbar_cyc_o_core;
291 wire xbar_stb_o_core;
292 wire xbar_we_o_core;
293 wire [3:0] xbar_sel_o_core;
294 wire [31:0] xbar_adr_o_core;
295 wire [31:0] xbar_dat_o_core;
296 wire xbar_ack_i_core;
297 wire [31:0] xbar_dat_i_core;
298
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400299 // Mask revision
300 wire [31:0] mask_rev;
301
Tim Edwardsa239c562020-10-08 21:36:44 -0400302 mgmt_core #(
303 .MPRJ_IO_PADS(`MPRJ_IO_PADS),
304 .MPRJ_PWR_PADS(`MPRJ_PWR_PADS)
305 ) soc (
Tim Edwards9f385692020-09-22 17:20:06 -0400306 `ifdef LVS
Tim Edwardsa239c562020-10-08 21:36:44 -0400307 .vdd(vccd),
308 .vss(vssa),
Tim Edwards9f385692020-09-22 17:20:06 -0400309 `endif
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400310 // GPIO (1 pin)
Tim Edwards9f385692020-09-22 17:20:06 -0400311 .gpio_out_pad(gpio_out_core),
312 .gpio_in_pad(gpio_in_core),
313 .gpio_mode0_pad(gpio_mode0_core),
314 .gpio_mode1_pad(gpio_mode1_core),
315 .gpio_outenb_pad(gpio_outenb_core),
316 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400317 // Primary SPI flash controller
Tim Edwards9f385692020-09-22 17:20:06 -0400318 .flash_csb(flash_csb_core),
319 .flash_clk(flash_clk_core),
320 .flash_csb_oeb(flash_csb_oeb_core),
321 .flash_clk_oeb(flash_clk_oeb_core),
322 .flash_io0_oeb(flash_io0_oeb_core),
323 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400324 .flash_csb_ieb(flash_csb_ieb_core),
325 .flash_clk_ieb(flash_clk_ieb_core),
326 .flash_io0_ieb(flash_io0_ieb_core),
327 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400328 .flash_io0_do(flash_io0_do_core),
329 .flash_io1_do(flash_io1_do_core),
Tim Edwards9f385692020-09-22 17:20:06 -0400330 .flash_io0_di(flash_io0_di_core),
331 .flash_io1_di(flash_io1_di_core),
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400332 // Master Reset
333 .resetb(rstb_l),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400334 .porb(porb_l),
335 // Clocks and reset
Tim Edwards9f385692020-09-22 17:20:06 -0400336 .clock(clock_core),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400337 .core_clk(caravel_clk),
338 .core_rstn(caravel_rstn),
Tim Edwards9f385692020-09-22 17:20:06 -0400339 // Logic Analyzer
340 .la_input(la_data_out_mprj),
341 .la_output(la_output_core),
342 .la_oen(la_oen),
343 // Mega Project IO Control
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400344 .mprj_io_loader_resetn(mprj_io_loader_resetn),
345 .mprj_io_loader_clock(mprj_io_loader_clock),
346 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards19ddfd02020-10-04 22:09:54 -0400347 .mgmt_in_data(mgmt_io_in),
Tim Edwards22a74352020-10-06 10:05:11 -0400348 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
349 .sdo_out(sdo_out),
350 .sdo_outenb(sdo_outenb),
351 .jtag_out(jtag_out),
352 .jtag_outenb(jtag_outenb),
Tim Edwards9f385692020-09-22 17:20:06 -0400353 // Mega Project Slave ports (WB MI A)
354 .mprj_cyc_o(mprj_cyc_o_core),
355 .mprj_stb_o(mprj_stb_o_core),
356 .mprj_we_o(mprj_we_o_core),
357 .mprj_sel_o(mprj_sel_o_core),
358 .mprj_adr_o(mprj_adr_o_core),
359 .mprj_dat_o(mprj_dat_o_core),
360 .mprj_ack_i(mprj_ack_i_core),
361 .mprj_dat_i(mprj_dat_i_core),
362 // Xbar Switch (WB MI B)
363 .xbar_cyc_o(xbar_cyc_o_core),
364 .xbar_stb_o(xbar_stb_o_core),
365 .xbar_we_o (xbar_we_o_core),
366 .xbar_sel_o(xbar_sel_o_core),
367 .xbar_adr_o(xbar_adr_o_core),
368 .xbar_dat_o(xbar_dat_o_core),
369 .xbar_ack_i(xbar_ack_i_core),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400370 .xbar_dat_i(xbar_dat_i_core),
371 // mask data
372 .mask_rev(mask_rev)
Tim Edwards9f385692020-09-22 17:20:06 -0400373 );
374
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400375 sky130_fd_sc_hd__ebufn_8 la_buf [127:0] (
Tim Edwards9f385692020-09-22 17:20:06 -0400376 .Z(la_data_in_mprj),
377 .A(la_output_core),
Tim Edwardsdcf18eb2020-09-25 17:08:59 -0400378 .TE_B(la_oen)
Tim Edwards9f385692020-09-22 17:20:06 -0400379 );
380
Tim Edwards65f571d2020-10-06 14:59:26 -0400381 /*--------------------------------------*/
382 /* User project is instantiated here */
383 /*--------------------------------------*/
384
Tim Edwardsa239c562020-10-08 21:36:44 -0400385 user_proj_example #(
386 .IO_PADS(`MPRJ_IO_PADS),
387 .PWR_PADS(`MPRJ_PWR_PADS)
388 ) mprj (
389 `ifdef LVS
390 vdda1, // User area 1 3.3V power
391 vdda2, // User area 2 3.3V power
392 vssa1, // User area 1 analog ground
393 vssa2, // User area 2 analog ground
394 vccd1, // User area 1 1.8V power
395 vccd2, // User area 2 1.8V power
396 vssa1, // User area 1 digital ground
397 vssa2, // User area 2 digital ground
398 `endif
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400399 .wb_clk_i(caravel_clk),
400 .wb_rst_i(!caravel_rstn),
Tim Edwards9f385692020-09-22 17:20:06 -0400401 // MGMT SoC Wishbone Slave
402 .wbs_cyc_i(mprj_cyc_o_core),
403 .wbs_stb_i(mprj_stb_o_core),
404 .wbs_we_i(mprj_we_o_core),
405 .wbs_sel_i(mprj_sel_o_core),
406 .wbs_adr_i(mprj_adr_o_core),
407 .wbs_dat_i(mprj_dat_o_core),
408 .wbs_ack_o(mprj_ack_i_core),
409 .wbs_dat_o(mprj_dat_i_core),
410 // Logic Analyzer
411 .la_data_in(la_data_in_mprj),
412 .la_data_out(la_data_out_mprj),
413 .la_oen (la_oen),
414 // IO Pads
Tim Edwards65f571d2020-10-06 14:59:26 -0400415 .io_in (user_io_in),
Tim Edwards21010312020-10-11 17:00:44 -0400416 .io_out(user_io_out),
417 .io_oeb(user_io_oeb)
Tim Edwards9f385692020-09-22 17:20:06 -0400418 );
419
Tim Edwards65f571d2020-10-06 14:59:26 -0400420 /*--------------------------------------*/
421 /* End user project instantiation */
422 /*--------------------------------------*/
423
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400424 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
425
Tim Edwards68338d52020-10-05 11:02:12 -0400426 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400427
Tim Edwards68338d52020-10-05 11:02:12 -0400428 // Each control block sits next to an I/O pad in the user area.
429 // It gets input through a serial chain from the previous control
430 // block and passes it to the next control block. Due to the nature
431 // of the shift register, bits are presented in reverse, as the first
432 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards19ddfd02020-10-04 22:09:54 -0400433
Tim Edwards46f50252020-10-05 15:17:34 -0400434 // There are two types of block; the first two are configured to be
435 // full bidirectional under control of the management Soc (JTAG and
436 // SDO). The rest are configured to be default (input).
437
Tim Edwards68338d52020-10-05 11:02:12 -0400438 gpio_control_block #(
Tim Edwards46f50252020-10-05 15:17:34 -0400439 .DM_INIT(3'b110), // Mode = output, strong up/down
440 .OENB_INIT(1'b0) // Enable output signaling from wire
441 ) gpio_control_bidir [1:0] (
Tim Edwards19ddfd02020-10-04 22:09:54 -0400442
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400443 // Management Soc-facing signals
444
Tim Edwardsc1b18952020-10-03 11:26:39 -0400445 .resetn(mprj_io_loader_resetn),
446 .serial_clock(mprj_io_loader_clock),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400447
Tim Edwards46f50252020-10-05 15:17:34 -0400448 .mgmt_gpio_in(mgmt_io_in[1:0]),
449 .mgmt_gpio_out({sdo_out, jtag_out}),
450 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400451
452 // Serial data chain for pad configuration
Tim Edwards46f50252020-10-05 15:17:34 -0400453 .serial_data_in(gpio_serial_link_shifted[1:0]),
454 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400455
456 // User-facing signals
Tim Edwards46f50252020-10-05 15:17:34 -0400457 .user_gpio_out(user_io_out[1:0]),
458 .user_gpio_oeb(user_io_oeb[1:0]),
459 .user_gpio_in(user_io_in[1:0]),
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400460
461 // Pad-facing signals (Pad GPIOv2)
Tim Edwards46f50252020-10-05 15:17:34 -0400462 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
463 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
464 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
465 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
466 .pad_gpio_holdover(mprj_io_holdover[1:0]),
467 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
468 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
469 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
470 .pad_gpio_dm(mprj_io_dm[5:0]),
471 .pad_gpio_outenb(mprj_io_oeb[1:0]),
472 .pad_gpio_out(mprj_io_out[1:0]),
473 .pad_gpio_in(mprj_io_in[1:0])
474 );
475
476 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
477
478 // Management Soc-facing signals
479
480 .resetn(mprj_io_loader_resetn),
481 .serial_clock(mprj_io_loader_clock),
482
483 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
484 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
485 .mgmt_gpio_oeb(1'b1),
486
487 // Serial data chain for pad configuration
488 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
489 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
490
491 // User-facing signals
492 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
493 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
494 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
495
496 // Pad-facing signals (Pad GPIOv2)
497 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
498 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
499 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
500 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
501 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
502 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
503 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
504 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
505 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
506 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
507 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
508 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400509 );
510
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400511 sky130_fd_sc_hvl__lsbufhv2lv porb_level (
Tim Edwards9f385692020-09-22 17:20:06 -0400512 `ifdef LVS
Tim Edwardsa239c562020-10-08 21:36:44 -0400513 .vpwr(vddio),
514 .vpb(vddio),
515 .lvpwr(vccd),
516 .vnb(vssio),
517 .vgnd(vssio),
Tim Edwards9f385692020-09-22 17:20:06 -0400518 `endif
519 .A(porb_h),
520 .X(porb_l)
521 );
522
Tim Edwardsb5d5b272020-10-02 22:27:50 -0400523 user_id_programming #(
524 .USER_PROJECT_ID(USER_PROJECT_ID)
525 ) user_id_value (
526 .mask_rev(mask_rev)
527 );
528
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400529 // Power-on-reset circuit
530 simple_por por (
Tim Edwardsa239c562020-10-08 21:36:44 -0400531 .vdd3v3(vddio),
532 .vss(vssio),
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400533 .porb_h(porb_h)
534 );
535
536 // XRES (chip input pin reset) reset level converter
537 sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
538 `ifdef LVS
Tim Edwardsa239c562020-10-08 21:36:44 -0400539 .vpwr(vddio),
540 .vpb(vddio),
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400541 .lvpwr(vdd1v8),
Tim Edwardsa239c562020-10-08 21:36:44 -0400542 .vnb(vssio),
543 .vgnd(vssio),
Tim Edwardse8fb9ff2020-10-05 16:30:24 -0400544 `endif
545 .A(rstb_h),
546 .X(rstb_l)
547 );
548
Tim Edwards9f385692020-09-22 17:20:06 -0400549endmodule