blob: 79830be9fefbe098c9f033eb112094bb2ceb6b1e [file] [log] [blame]
Tim Edwardsef8312e2020-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 Edwardsc5265b82020-09-25 17:08:59 -040018`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040019
Tim Edwards9eda80d2020-10-08 21:36:44 -040020`define MPRJ_IO_PADS 37
21`define MPRJ_PWR_PADS 4 /* vdda1, vccd1, vdda2, vccd2 */
Tim Edwardsef8312e2020-09-22 17:20:06 -040022
23`include "pads.v"
24
25/* To be removed when sky130_fd_io is available */
26// `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/s8iom0s8.v"
27// `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/power_pads_lib.v"
28// `include "/ef/tech/SW/sky130A/libs.ref/verilog/sky130_fd_sc_hd/sky130_fd_sc_hd.v"
29// `include "/ef/tech/SW/sky130A/libs.ref/verilog/sky130_fd_sc_hvl/sky130_fd_sc_hvl.v"
30
31/* Local only, please remove */
32// `include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
33// `include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_io/verilog/power_pads_lib.v"
34`include "/home/tim/projects/efabless/tech/SW/EFS8A/libs.ref/s8iom0s8/verilog/s8iom0s8.v"
Tim Edwardsc5265b82020-09-25 17:08:59 -040035// `include "/home/tim/projects/efabless/tech/SW/EFS8A/libs.ref/s8iom0s8/verilog/power_pads_lib.v"
36`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
37`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
38`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
39`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040040
41`include "mgmt_soc.v"
Tim Edwards44bab472020-10-04 22:09:54 -040042`include "housekeeping_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040043`include "digital_pll.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040044`include "caravel_clocking.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040045`include "mgmt_core.v"
46`include "mprj_io.v"
47`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040048`include "user_id_programming.v"
49`include "gpio_control_block.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040050`include "clock_div.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040051`include "simple_por.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040052
Tim Edwards05537512020-10-06 14:59:26 -040053/*------------------------------*/
54/* Include user project here */
55/*------------------------------*/
56`include "user_proj_example.v"
57
Tim Edwardsef8312e2020-09-22 17:20:06 -040058`ifdef USE_OPENRAM
59 `include "sram_1rw1r_32_8192_8_sky130.v"
60`endif
61
62module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040063 inout vddio, // Common 3.3V padframe/ESD power
64 inout vssio, // Common padframe/ESD ground
65 inout vdda, // Management 3.3V power
66 inout vssa, // Common analog ground
67 inout vccd, // Management/Common 1.8V power
68 inout vssd, // Common digital ground
69 inout vdda1, // User area 1 3.3V power
70 inout vdda2, // User area 2 3.3V power
71 inout vssa1, // User area 1 analog ground
72 inout vssa2, // User area 2 analog ground
73 inout vccd1, // User area 1 1.8V power
74 inout vccd2, // User area 2 1.8V power
75 inout vssd1, // User area 1 digital ground
76 inout vssd2, // User area 2 digital ground
77
Tim Edwards04ba17f2020-10-02 22:27:50 -040078 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040079 inout [`MPRJ_IO_PADS-1:0] mprj_io,
80 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040081 input resetb,
82
83 // Note that only two pins are available on the flash so dual and
84 // quad flash modes are not available.
85
Tim Edwardsef8312e2020-09-22 17:20:06 -040086 output flash_csb,
87 output flash_clk,
88 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040089 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040090);
91
Tim Edwards04ba17f2020-10-02 22:27:50 -040092 //------------------------------------------------------------
93 // This value is uniquely defined for each user project.
94 //------------------------------------------------------------
95 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040096
Tim Edwards04ba17f2020-10-02 22:27:50 -040097 // These pins are overlaid on mprj_io space. They have the function
98 // below when the management processor is in reset, or in the default
99 // configuration. They are assigned to uses in the user space by the
100 // configuration program running off of the SPI flash. Note that even
101 // when the user has taken control of these pins, they can be restored
102 // to the original use by setting the resetb pin low. The SPI pins and
103 // UART pins can be connected directly to an FTDI chip as long as the
104 // FTDI chip sets these lines to high impedence (input function) at
105 // all times except when holding the chip in reset.
106
107 // JTAG = mprj_io[0] (inout)
108 // SDO = mprj_io[1] (output)
109 // SDI = mprj_io[2] (input)
110 // CSB = mprj_io[3] (input)
111 // SCK = mprj_io[4] (input)
112 // ser_rx = mprj_io[5] (input)
113 // ser_tx = mprj_io[6] (output)
114 // irq = mprj_io[7] (input)
115
116 // These pins are reserved for any project that wants to incorporate
117 // its own processor and flash controller. While a user project can
118 // technically use any available I/O pins for the purpose, these
119 // four pins connect to a pass-through mode from the SPI slave (pins
120 // 1-4 above) so that any SPI flash connected to these specific pins
121 // can be accessed through the SPI slave even when the processor is in
122 // reset.
123
Tim Edwards44bab472020-10-04 22:09:54 -0400124 // user_flash_csb = mprj_io[8]
125 // user_flash_sck = mprj_io[9]
126 // user_flash_io0 = mprj_io[10]
127 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400128
129 // One-bit GPIO dedicated to management SoC (outside of user control)
130 wire gpio_out_core;
131 wire gpio_in_core;
132 wire gpio_mode0_core;
133 wire gpio_mode1_core;
134 wire gpio_outenb_core;
135 wire gpio_inenb_core;
136
137 // Mega-Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400138 wire mprj_io_loader_resetn;
139 wire mprj_io_loader_clock;
140 wire mprj_io_loader_data;
141
Tim Edwardsef8312e2020-09-22 17:20:06 -0400142 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
143 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
144 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400145 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400146 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400147 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
148 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
149 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400150 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
151 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
152 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
153 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
154 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
155 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
156
Tim Edwards04ba17f2020-10-02 22:27:50 -0400157 // Mega-Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400158 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400159 wire [`MPRJ_IO_PADS-1:0] user_io_in;
160 wire [`MPRJ_IO_PADS-1:0] user_io_out;
161
162 /* Padframe control signals */
163 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
164 wire mgmt_serial_clock;
165 wire mgmt_serial_resetn;
166
Tim Edwards44bab472020-10-04 22:09:54 -0400167 // Mega-Project Control management I/O
168 // There are two types of GPIO connections:
169 // (1) Full Bidirectional: Management connects to in, out, and oeb
170 // Uses: JTAG and SDO
171 // (2) Selectable bidirectional: Management connects to in and out,
172 // which are tied together. oeb is grounded (oeb from the
173 // configuration is used)
174
175 // SDI = mprj_io[2] (input)
176 // CSB = mprj_io[3] (input)
177 // SCK = mprj_io[4] (input)
178 // ser_rx = mprj_io[5] (input)
179 // ser_tx = mprj_io[6] (output)
180 // irq = mprj_io[7] (input)
181
182 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
183 wire jtag_out, sdo_out;
184 wire jtag_outenb, sdo_outenb;
185
186 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
187 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
188 wire [1:0] mgmt_io_nc2; /* no-connects */
189
Tim Edwards04ba17f2020-10-02 22:27:50 -0400190 // Power-on-reset signal. The reset pad generates the sense-inverted
191 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
192 // derived.
193
Tim Edwardsef8312e2020-09-22 17:20:06 -0400194 wire porb_h;
195 wire porb_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400196
Tim Edwardsf51dd082020-10-05 16:30:24 -0400197 wire rstb_h;
198 wire rstb_l;
199
Tim Edwards44bab472020-10-04 22:09:54 -0400200 // To be considered: Master hold signal on all user pads (?)
201 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
202 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400203 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400204 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
205
Tim Edwardsef8312e2020-09-22 17:20:06 -0400206 chip_io padframe(
207 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400208 .vddio(vddio),
209 .vssio(vssio),
210 .vdda(vdda),
211 .vssa(vssa),
212 .vccd(vccd),
213 .vssd(vssd),
214 .vdda1(vdda1),
215 .vdda2(vdda2),
216 .vssa1(vssa1),
217 .vssa2(vssa2),
218 .vccd1(vccd1),
219 .vccd2(vccd2),
220 .vssd1(vssd1),
221 .vssd2(vssd2),
222
Tim Edwardsef8312e2020-09-22 17:20:06 -0400223 .gpio(gpio),
224 .mprj_io(mprj_io),
225 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400226 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400227 .flash_csb(flash_csb),
228 .flash_clk(flash_clk),
229 .flash_io0(flash_io0),
230 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400231 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400232 .porb_h(porb_h),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400233 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400234 .clock_core(clock_core),
235 .gpio_out_core(gpio_out_core),
236 .gpio_in_core(gpio_in_core),
237 .gpio_mode0_core(gpio_mode0_core),
238 .gpio_mode1_core(gpio_mode1_core),
239 .gpio_outenb_core(gpio_outenb_core),
240 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400241 .flash_csb_core(flash_csb_core),
242 .flash_clk_core(flash_clk_core),
243 .flash_csb_oeb_core(flash_csb_oeb_core),
244 .flash_clk_oeb_core(flash_clk_oeb_core),
245 .flash_io0_oeb_core(flash_io0_oeb_core),
246 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400247 .flash_csb_ieb_core(flash_csb_ieb_core),
248 .flash_clk_ieb_core(flash_clk_ieb_core),
249 .flash_io0_ieb_core(flash_io0_ieb_core),
250 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400251 .flash_io0_do_core(flash_io0_do_core),
252 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400253 .flash_io0_di_core(flash_io0_di_core),
254 .flash_io1_di_core(flash_io1_di_core),
Tim Edwards44bab472020-10-04 22:09:54 -0400255 .por(~porb_l),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400256 .mprj_io_in(mprj_io_in),
257 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400258 .mprj_io_oeb(mprj_io_oeb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400259 .mprj_io_hldh_n(mprj_io_hldh_n),
260 .mprj_io_enh(mprj_io_enh),
261 .mprj_io_inp_dis(mprj_io_inp_dis),
262 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400263 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
264 .mprj_io_slow_sel(mprj_io_slow_sel),
265 .mprj_io_holdover(mprj_io_holdover),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400266 .mprj_io_analog_en(mprj_io_analog_en),
267 .mprj_io_analog_sel(mprj_io_analog_sel),
268 .mprj_io_analog_pol(mprj_io_analog_pol),
269 .mprj_io_dm(mprj_io_dm)
270 );
271
272 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400273 wire caravel_clk;
274 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400275
276 wire [7:0] spi_ro_config_core;
277
278 // LA signals
279 wire [127:0] la_output_core; // From CPU to MPRJ
280 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
281 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
282 wire [127:0] la_output_mprj; // From MPRJ to CPU
283 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
284
285 // WB MI A (Mega Project)
286 wire mprj_cyc_o_core;
287 wire mprj_stb_o_core;
288 wire mprj_we_o_core;
289 wire [3:0] mprj_sel_o_core;
290 wire [31:0] mprj_adr_o_core;
291 wire [31:0] mprj_dat_o_core;
292 wire mprj_ack_i_core;
293 wire [31:0] mprj_dat_i_core;
294
295 // WB MI B (xbar)
296 wire xbar_cyc_o_core;
297 wire xbar_stb_o_core;
298 wire xbar_we_o_core;
299 wire [3:0] xbar_sel_o_core;
300 wire [31:0] xbar_adr_o_core;
301 wire [31:0] xbar_dat_o_core;
302 wire xbar_ack_i_core;
303 wire [31:0] xbar_dat_i_core;
304
Tim Edwards04ba17f2020-10-02 22:27:50 -0400305 // Mask revision
306 wire [31:0] mask_rev;
307
Tim Edwards9eda80d2020-10-08 21:36:44 -0400308 mgmt_core #(
309 .MPRJ_IO_PADS(`MPRJ_IO_PADS),
310 .MPRJ_PWR_PADS(`MPRJ_PWR_PADS)
311 ) soc (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400312 `ifdef LVS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400313 .vdd(vccd),
314 .vss(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400315 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400316 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400317 .gpio_out_pad(gpio_out_core),
318 .gpio_in_pad(gpio_in_core),
319 .gpio_mode0_pad(gpio_mode0_core),
320 .gpio_mode1_pad(gpio_mode1_core),
321 .gpio_outenb_pad(gpio_outenb_core),
322 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400323 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400324 .flash_csb(flash_csb_core),
325 .flash_clk(flash_clk_core),
326 .flash_csb_oeb(flash_csb_oeb_core),
327 .flash_clk_oeb(flash_clk_oeb_core),
328 .flash_io0_oeb(flash_io0_oeb_core),
329 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400330 .flash_csb_ieb(flash_csb_ieb_core),
331 .flash_clk_ieb(flash_clk_ieb_core),
332 .flash_io0_ieb(flash_io0_ieb_core),
333 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400334 .flash_io0_do(flash_io0_do_core),
335 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400336 .flash_io0_di(flash_io0_di_core),
337 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400338 // Master Reset
339 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400340 .porb(porb_l),
341 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400342 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400343 .core_clk(caravel_clk),
344 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400345 // Logic Analyzer
346 .la_input(la_data_out_mprj),
347 .la_output(la_output_core),
348 .la_oen(la_oen),
349 // Mega Project IO Control
Tim Edwards04ba17f2020-10-02 22:27:50 -0400350 .mprj_io_loader_resetn(mprj_io_loader_resetn),
351 .mprj_io_loader_clock(mprj_io_loader_clock),
352 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400353 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400354 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
355 .sdo_out(sdo_out),
356 .sdo_outenb(sdo_outenb),
357 .jtag_out(jtag_out),
358 .jtag_outenb(jtag_outenb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400359 // Mega Project Slave ports (WB MI A)
360 .mprj_cyc_o(mprj_cyc_o_core),
361 .mprj_stb_o(mprj_stb_o_core),
362 .mprj_we_o(mprj_we_o_core),
363 .mprj_sel_o(mprj_sel_o_core),
364 .mprj_adr_o(mprj_adr_o_core),
365 .mprj_dat_o(mprj_dat_o_core),
366 .mprj_ack_i(mprj_ack_i_core),
367 .mprj_dat_i(mprj_dat_i_core),
368 // Xbar Switch (WB MI B)
369 .xbar_cyc_o(xbar_cyc_o_core),
370 .xbar_stb_o(xbar_stb_o_core),
371 .xbar_we_o (xbar_we_o_core),
372 .xbar_sel_o(xbar_sel_o_core),
373 .xbar_adr_o(xbar_adr_o_core),
374 .xbar_dat_o(xbar_dat_o_core),
375 .xbar_ack_i(xbar_ack_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400376 .xbar_dat_i(xbar_dat_i_core),
377 // mask data
378 .mask_rev(mask_rev)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400379 );
380
Tim Edwards04ba17f2020-10-02 22:27:50 -0400381 sky130_fd_sc_hd__ebufn_8 la_buf [127:0] (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400382 .Z(la_data_in_mprj),
383 .A(la_output_core),
Tim Edwardsc5265b82020-09-25 17:08:59 -0400384 .TE_B(la_oen)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400385 );
386
Tim Edwards05537512020-10-06 14:59:26 -0400387 /*--------------------------------------*/
388 /* User project is instantiated here */
389 /*--------------------------------------*/
390
Tim Edwards9eda80d2020-10-08 21:36:44 -0400391 user_proj_example #(
392 .IO_PADS(`MPRJ_IO_PADS),
393 .PWR_PADS(`MPRJ_PWR_PADS)
394 ) mprj (
395 `ifdef LVS
396 vdda1, // User area 1 3.3V power
397 vdda2, // User area 2 3.3V power
398 vssa1, // User area 1 analog ground
399 vssa2, // User area 2 analog ground
400 vccd1, // User area 1 1.8V power
401 vccd2, // User area 2 1.8V power
402 vssa1, // User area 1 digital ground
403 vssa2, // User area 2 digital ground
404 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400405 .wb_clk_i(caravel_clk),
406 .wb_rst_i(!caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400407 // MGMT SoC Wishbone Slave
408 .wbs_cyc_i(mprj_cyc_o_core),
409 .wbs_stb_i(mprj_stb_o_core),
410 .wbs_we_i(mprj_we_o_core),
411 .wbs_sel_i(mprj_sel_o_core),
412 .wbs_adr_i(mprj_adr_o_core),
413 .wbs_dat_i(mprj_dat_o_core),
414 .wbs_ack_o(mprj_ack_i_core),
415 .wbs_dat_o(mprj_dat_i_core),
416 // Logic Analyzer
417 .la_data_in(la_data_in_mprj),
418 .la_data_out(la_data_out_mprj),
419 .la_oen (la_oen),
420 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400421 .io_in (user_io_in),
422 .io_out(user_io_out)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400423 );
424
Tim Edwards05537512020-10-06 14:59:26 -0400425 /*--------------------------------------*/
426 /* End user project instantiation */
427 /*--------------------------------------*/
428
Tim Edwards04ba17f2020-10-02 22:27:50 -0400429 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
430
Tim Edwards251e0df2020-10-05 11:02:12 -0400431 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400432
Tim Edwards251e0df2020-10-05 11:02:12 -0400433 // Each control block sits next to an I/O pad in the user area.
434 // It gets input through a serial chain from the previous control
435 // block and passes it to the next control block. Due to the nature
436 // of the shift register, bits are presented in reverse, as the first
437 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400438
Tim Edwards89f09242020-10-05 15:17:34 -0400439 // There are two types of block; the first two are configured to be
440 // full bidirectional under control of the management Soc (JTAG and
441 // SDO). The rest are configured to be default (input).
442
Tim Edwards251e0df2020-10-05 11:02:12 -0400443 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400444 .DM_INIT(3'b110), // Mode = output, strong up/down
445 .OENB_INIT(1'b0) // Enable output signaling from wire
446 ) gpio_control_bidir [1:0] (
Tim Edwards44bab472020-10-04 22:09:54 -0400447
Tim Edwards04ba17f2020-10-02 22:27:50 -0400448 // Management Soc-facing signals
449
Tim Edwardsc18c4742020-10-03 11:26:39 -0400450 .resetn(mprj_io_loader_resetn),
451 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400452
Tim Edwards89f09242020-10-05 15:17:34 -0400453 .mgmt_gpio_in(mgmt_io_in[1:0]),
454 .mgmt_gpio_out({sdo_out, jtag_out}),
455 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400456
457 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400458 .serial_data_in(gpio_serial_link_shifted[1:0]),
459 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400460
461 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400462 .user_gpio_out(user_io_out[1:0]),
463 .user_gpio_oeb(user_io_oeb[1:0]),
464 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400465
466 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400467 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
468 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
469 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
470 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
471 .pad_gpio_holdover(mprj_io_holdover[1:0]),
472 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
473 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
474 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
475 .pad_gpio_dm(mprj_io_dm[5:0]),
476 .pad_gpio_outenb(mprj_io_oeb[1:0]),
477 .pad_gpio_out(mprj_io_out[1:0]),
478 .pad_gpio_in(mprj_io_in[1:0])
479 );
480
481 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
482
483 // Management Soc-facing signals
484
485 .resetn(mprj_io_loader_resetn),
486 .serial_clock(mprj_io_loader_clock),
487
488 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
489 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
490 .mgmt_gpio_oeb(1'b1),
491
492 // Serial data chain for pad configuration
493 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
494 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
495
496 // User-facing signals
497 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
498 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
499 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
500
501 // Pad-facing signals (Pad GPIOv2)
502 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
503 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
504 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
505 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
506 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
507 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
508 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
509 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
510 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
511 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
512 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
513 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400514 );
515
Tim Edwardsf51dd082020-10-05 16:30:24 -0400516 sky130_fd_sc_hvl__lsbufhv2lv porb_level (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400517 `ifdef LVS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400518 .vpwr(vddio),
519 .vpb(vddio),
520 .lvpwr(vccd),
521 .vnb(vssio),
522 .vgnd(vssio),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400523 `endif
524 .A(porb_h),
525 .X(porb_l)
526 );
527
Tim Edwards04ba17f2020-10-02 22:27:50 -0400528 user_id_programming #(
529 .USER_PROJECT_ID(USER_PROJECT_ID)
530 ) user_id_value (
531 .mask_rev(mask_rev)
532 );
533
Tim Edwardsf51dd082020-10-05 16:30:24 -0400534 // Power-on-reset circuit
535 simple_por por (
Tim Edwards9eda80d2020-10-08 21:36:44 -0400536 .vdd3v3(vddio),
537 .vss(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400538 .porb_h(porb_h)
539 );
540
541 // XRES (chip input pin reset) reset level converter
542 sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
543 `ifdef LVS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400544 .vpwr(vddio),
545 .vpb(vddio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400546 .lvpwr(vdd1v8),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400547 .vnb(vssio),
548 .vgnd(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400549 `endif
550 .A(rstb_h),
551 .X(rstb_l)
552 );
553
Tim Edwardsef8312e2020-09-22 17:20:06 -0400554endmodule