blob: bd3a167cc972f3977b8a0188a5ad7912addc914a [file] [log] [blame]
Tim Edwards581068f2020-11-19 12:45:25 -05001// `default_nettype none
Tim Edwardsef8312e2020-09-22 17:20:06 -04002/*--------------------------------------------------------------*/
3/* caravel, a project harness for the Google/SkyWater sky130 */
4/* fabrication process and open source PDK */
5/* */
6/* Copyright 2020 efabless, Inc. */
7/* Written by Tim Edwards, December 2019 */
8/* and Mohamed Shalan, August 2020 */
9/* This file is open source hardware released under the */
10/* Apache 2.0 license. See file LICENSE. */
11/* */
12/*--------------------------------------------------------------*/
13
14`timescale 1 ns / 1 ps
15
Tim Edwardse2ef6732020-10-12 17:25:12 -040016`define USE_POWER_PINS
Tim Edwardsc5265b82020-09-25 17:08:59 -040017`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040018
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020019`include "defines.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040020`include "pads.v"
21
Tim Edwards4286ae12020-10-11 14:52:01 -040022/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
Tim Edwardsef8312e2020-09-22 17:20:06 -040023
Tim Edwards4286ae12020-10-11 14:52:01 -040024`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
Tim Edwards4c733352020-10-12 16:32:36 -040025`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
Ahmed Ghazydf4dd882020-11-25 18:38:42 +020026`include "libs.tech/openlane/custom_cells/verilog/sky130_ef_io__gpiov2_pad_wrapped.v"
Tim Edwards4286ae12020-10-11 14:52:01 -040027
28`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
29`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
30`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
31`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040032
33`include "mgmt_soc.v"
Tim Edwards44bab472020-10-04 22:09:54 -040034`include "housekeeping_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040035`include "digital_pll.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040036`include "caravel_clocking.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040037`include "mgmt_core.v"
Tim Edwards53d92182020-10-11 21:47:40 -040038`include "mgmt_protect.v"
Tim Edwardsbc035512020-11-23 11:16:08 -050039`include "mgmt_protect_hv.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040040`include "mprj_io.v"
41`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040042`include "user_id_programming.v"
Tim Edwardsb86fc842020-10-13 17:11:54 -040043`include "user_project_wrapper.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040044`include "gpio_control_block.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040045`include "clock_div.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040046`include "simple_por.v"
Manar55ec3692020-10-30 16:32:18 +020047`include "storage_bridge_wb.v"
Ahmed Ghazy2517fa82020-11-08 23:34:41 +020048`include "DFFRAM.v"
Manar68e03632020-11-09 13:25:13 +020049`include "DFFRAMBB.v"
Manar55ec3692020-10-30 16:32:18 +020050`include "sram_1rw1r_32_256_8_sky130.v"
51`include "storage.v"
Ahmed Ghazy1d1679d2020-11-30 17:44:45 +020052`include "sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040053
Tim Edwards05537512020-10-06 14:59:26 -040054/*------------------------------*/
55/* Include user project here */
56/*------------------------------*/
57`include "user_proj_example.v"
58
Manar55ec3692020-10-30 16:32:18 +020059// `ifdef USE_OPENRAM
60// `include "sram_1rw1r_32_256_8_sky130.v"
61// `endif
Tim Edwardsef8312e2020-09-22 17:20:06 -040062
63module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040064 inout vddio, // Common 3.3V padframe/ESD power
65 inout vssio, // Common padframe/ESD ground
66 inout vdda, // Management 3.3V power
67 inout vssa, // Common analog ground
68 inout vccd, // Management/Common 1.8V power
69 inout vssd, // Common digital ground
70 inout vdda1, // User area 1 3.3V power
71 inout vdda2, // User area 2 3.3V power
72 inout vssa1, // User area 1 analog ground
73 inout vssa2, // User area 2 analog ground
74 inout vccd1, // User area 1 1.8V power
75 inout vccd2, // User area 2 1.8V power
76 inout vssd1, // User area 1 digital ground
77 inout vssd2, // User area 2 digital ground
78
Tim Edwards04ba17f2020-10-02 22:27:50 -040079 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040080 inout [`MPRJ_IO_PADS-1:0] mprj_io,
Tim Edwardsba328902020-10-27 15:03:22 -040081 output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
Tim Edwardsef8312e2020-09-22 17:20:06 -040082 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040083 input resetb,
84
85 // Note that only two pins are available on the flash so dual and
86 // quad flash modes are not available.
87
Tim Edwardsef8312e2020-09-22 17:20:06 -040088 output flash_csb,
89 output flash_clk,
90 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040091 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040092);
93
Tim Edwards04ba17f2020-10-02 22:27:50 -040094 //------------------------------------------------------------
95 // This value is uniquely defined for each user project.
96 //------------------------------------------------------------
97 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040098
Tim Edwards04ba17f2020-10-02 22:27:50 -040099 // These pins are overlaid on mprj_io space. They have the function
100 // below when the management processor is in reset, or in the default
101 // configuration. They are assigned to uses in the user space by the
102 // configuration program running off of the SPI flash. Note that even
103 // when the user has taken control of these pins, they can be restored
104 // to the original use by setting the resetb pin low. The SPI pins and
105 // UART pins can be connected directly to an FTDI chip as long as the
106 // FTDI chip sets these lines to high impedence (input function) at
107 // all times except when holding the chip in reset.
108
109 // JTAG = mprj_io[0] (inout)
110 // SDO = mprj_io[1] (output)
111 // SDI = mprj_io[2] (input)
112 // CSB = mprj_io[3] (input)
113 // SCK = mprj_io[4] (input)
114 // ser_rx = mprj_io[5] (input)
115 // ser_tx = mprj_io[6] (output)
116 // irq = mprj_io[7] (input)
117
118 // These pins are reserved for any project that wants to incorporate
119 // its own processor and flash controller. While a user project can
120 // technically use any available I/O pins for the purpose, these
121 // four pins connect to a pass-through mode from the SPI slave (pins
122 // 1-4 above) so that any SPI flash connected to these specific pins
123 // can be accessed through the SPI slave even when the processor is in
124 // reset.
125
Tim Edwards44bab472020-10-04 22:09:54 -0400126 // user_flash_csb = mprj_io[8]
127 // user_flash_sck = mprj_io[9]
128 // user_flash_io0 = mprj_io[10]
129 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400130
131 // One-bit GPIO dedicated to management SoC (outside of user control)
132 wire gpio_out_core;
133 wire gpio_in_core;
134 wire gpio_mode0_core;
135 wire gpio_mode1_core;
136 wire gpio_outenb_core;
137 wire gpio_inenb_core;
138
Tim Edwards6d9739d2020-10-19 11:00:49 -0400139 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400140 wire mprj_io_loader_resetn;
141 wire mprj_io_loader_clock;
142 wire mprj_io_loader_data;
143
Tim Edwardsef8312e2020-09-22 17:20:06 -0400144 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
145 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
146 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400147 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400148 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400149 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
150 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
151 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400152 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
153 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
154 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
155 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
156 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
157 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
158
Tim Edwards6d9739d2020-10-19 11:00:49 -0400159 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400160 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400161 wire [`MPRJ_IO_PADS-1:0] user_io_in;
162 wire [`MPRJ_IO_PADS-1:0] user_io_out;
Tim Edwards581068f2020-11-19 12:45:25 -0500163 wire [`MPRJ_IO_PADS-8:0] user_analog_io;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400164
165 /* Padframe control signals */
166 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
167 wire mgmt_serial_clock;
168 wire mgmt_serial_resetn;
169
Tim Edwards6d9739d2020-10-19 11:00:49 -0400170 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400171 // There are two types of GPIO connections:
172 // (1) Full Bidirectional: Management connects to in, out, and oeb
173 // Uses: JTAG and SDO
174 // (2) Selectable bidirectional: Management connects to in and out,
175 // which are tied together. oeb is grounded (oeb from the
176 // configuration is used)
177
178 // SDI = mprj_io[2] (input)
179 // CSB = mprj_io[3] (input)
180 // SCK = mprj_io[4] (input)
181 // ser_rx = mprj_io[5] (input)
182 // ser_tx = mprj_io[6] (output)
183 // irq = mprj_io[7] (input)
184
185 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200186 wire jtag_out, sdo_out;
187 wire jtag_outenb, sdo_outenb;
Tim Edwards44bab472020-10-04 22:09:54 -0400188
189 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
190 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
191 wire [1:0] mgmt_io_nc2; /* no-connects */
192
Tim Edwards581068f2020-11-19 12:45:25 -0500193 wire clock_core;
194
Tim Edwards04ba17f2020-10-02 22:27:50 -0400195 // Power-on-reset signal. The reset pad generates the sense-inverted
196 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
197 // derived.
198
Tim Edwardsef8312e2020-09-22 17:20:06 -0400199 wire porb_h;
200 wire porb_l;
Tim Edwards581068f2020-11-19 12:45:25 -0500201 wire por_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400202
Tim Edwardsf51dd082020-10-05 16:30:24 -0400203 wire rstb_h;
204 wire rstb_l;
205
Tim Edwards581068f2020-11-19 12:45:25 -0500206 wire flash_clk_core, flash_csb_core;
207 wire flash_clk_oeb_core, flash_csb_oeb_core;
208 wire flash_clk_ieb_core, flash_csb_ieb_core;
209 wire flash_io0_oeb_core, flash_io1_oeb_core;
210 wire flash_io2_oeb_core, flash_io3_oeb_core;
211 wire flash_io0_ieb_core, flash_io1_ieb_core;
212 wire flash_io2_ieb_core, flash_io3_ieb_core;
213 wire flash_io0_do_core, flash_io1_do_core;
214 wire flash_io2_do_core, flash_io3_do_core;
215 wire flash_io0_di_core, flash_io1_di_core;
216 wire flash_io2_di_core, flash_io3_di_core;
217
Tim Edwards44bab472020-10-04 22:09:54 -0400218 // To be considered: Master hold signal on all user pads (?)
219 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
220 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400221 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400222 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
223
Tim Edwardsef8312e2020-09-22 17:20:06 -0400224 chip_io padframe(
225 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400226 .vddio(vddio),
227 .vssio(vssio),
228 .vdda(vdda),
229 .vssa(vssa),
230 .vccd(vccd),
231 .vssd(vssd),
232 .vdda1(vdda1),
233 .vdda2(vdda2),
234 .vssa1(vssa1),
235 .vssa2(vssa2),
236 .vccd1(vccd1),
237 .vccd2(vccd2),
238 .vssd1(vssd1),
239 .vssd2(vssd2),
240
Tim Edwardsef8312e2020-09-22 17:20:06 -0400241 .gpio(gpio),
242 .mprj_io(mprj_io),
243 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400244 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400245 .flash_csb(flash_csb),
246 .flash_clk(flash_clk),
247 .flash_io0(flash_io0),
248 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400249 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400250 .porb_h(porb_h),
Tim Edwards581068f2020-11-19 12:45:25 -0500251 .por(por_l),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400252 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400253 .clock_core(clock_core),
254 .gpio_out_core(gpio_out_core),
255 .gpio_in_core(gpio_in_core),
256 .gpio_mode0_core(gpio_mode0_core),
257 .gpio_mode1_core(gpio_mode1_core),
258 .gpio_outenb_core(gpio_outenb_core),
259 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400260 .flash_csb_core(flash_csb_core),
261 .flash_clk_core(flash_clk_core),
262 .flash_csb_oeb_core(flash_csb_oeb_core),
263 .flash_clk_oeb_core(flash_clk_oeb_core),
264 .flash_io0_oeb_core(flash_io0_oeb_core),
265 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400266 .flash_csb_ieb_core(flash_csb_ieb_core),
267 .flash_clk_ieb_core(flash_clk_ieb_core),
268 .flash_io0_ieb_core(flash_io0_ieb_core),
269 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400270 .flash_io0_do_core(flash_io0_do_core),
271 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400272 .flash_io0_di_core(flash_io0_di_core),
273 .flash_io1_di_core(flash_io1_di_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400274 .mprj_io_in(mprj_io_in),
275 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400276 .mprj_io_oeb(mprj_io_oeb),
Manar14d35ac2020-10-21 22:47:15 +0200277 .mprj_io_hldh_n(mprj_io_hldh_n),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400278 .mprj_io_enh(mprj_io_enh),
Manar14d35ac2020-10-21 22:47:15 +0200279 .mprj_io_inp_dis(mprj_io_inp_dis),
280 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
281 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
282 .mprj_io_slow_sel(mprj_io_slow_sel),
283 .mprj_io_holdover(mprj_io_holdover),
284 .mprj_io_analog_en(mprj_io_analog_en),
285 .mprj_io_analog_sel(mprj_io_analog_sel),
286 .mprj_io_analog_pol(mprj_io_analog_pol),
Tim Edwards581068f2020-11-19 12:45:25 -0500287 .mprj_io_dm(mprj_io_dm),
288 .mprj_analog_io(user_analog_io)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400289 );
290
291 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400292 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400293 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400294 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400295
296 wire [7:0] spi_ro_config_core;
297
298 // LA signals
Tim Edwards43e5c602020-11-19 15:59:50 -0500299 wire [127:0] la_data_in_user; // From CPU to MPRJ
300 wire [127:0] la_data_in_mprj; // From MPRJ to CPU
Tim Edwardsef8312e2020-09-22 17:20:06 -0400301 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
Tim Edwards43e5c602020-11-19 15:59:50 -0500302 wire [127:0] la_data_out_user; // From MPRJ to CPU
303 wire [127:0] la_oen_user; // From CPU to MPRJ
304 wire [127:0] la_oen_mprj; // From CPU to MPRJ
305
Tim Edwards6d9739d2020-10-19 11:00:49 -0400306 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400307 wire mprj_cyc_o_core;
308 wire mprj_stb_o_core;
309 wire mprj_we_o_core;
310 wire [3:0] mprj_sel_o_core;
311 wire [31:0] mprj_adr_o_core;
312 wire [31:0] mprj_dat_o_core;
313 wire mprj_ack_i_core;
314 wire [31:0] mprj_dat_i_core;
315
316 // WB MI B (xbar)
317 wire xbar_cyc_o_core;
318 wire xbar_stb_o_core;
319 wire xbar_we_o_core;
320 wire [3:0] xbar_sel_o_core;
321 wire [31:0] xbar_adr_o_core;
322 wire [31:0] xbar_dat_o_core;
323 wire xbar_ack_i_core;
324 wire [31:0] xbar_dat_i_core;
325
Tim Edwards04ba17f2020-10-02 22:27:50 -0400326 // Mask revision
327 wire [31:0] mask_rev;
328
Manar14d35ac2020-10-21 22:47:15 +0200329 wire mprj_clock;
330 wire mprj_clock2;
331 wire mprj_resetn;
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200332 wire mprj_reset;
Manar14d35ac2020-10-21 22:47:15 +0200333 wire mprj_cyc_o_user;
334 wire mprj_stb_o_user;
335 wire mprj_we_o_user;
336 wire [3:0] mprj_sel_o_user;
337 wire [31:0] mprj_adr_o_user;
338 wire [31:0] mprj_dat_o_user;
339 wire mprj_vcc_pwrgood;
340 wire mprj2_vcc_pwrgood;
341 wire mprj_vdd_pwrgood;
342 wire mprj2_vdd_pwrgood;
343
Manar55ec3692020-10-30 16:32:18 +0200344 // Storage area
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200345 // Management R/W interface
346 wire [`RAM_BLOCKS-1:0] mgmt_ena;
Manarffe6cad2020-11-09 19:09:04 +0200347 wire [`RAM_BLOCKS-1:0] mgmt_wen;
348 wire [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask;
Manar55ec3692020-10-30 16:32:18 +0200349 wire [7:0] mgmt_addr;
350 wire [31:0] mgmt_wdata;
Manarffe6cad2020-11-09 19:09:04 +0200351 wire [(`RAM_BLOCKS*32)-1:0] mgmt_rdata;
Manar55ec3692020-10-30 16:32:18 +0200352 // Management RO interface
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200353 wire mgmt_ena_ro;
Manarffe6cad2020-11-09 19:09:04 +0200354 wire [7:0] mgmt_addr_ro;
355 wire [31:0] mgmt_rdata_ro;
Manar55ec3692020-10-30 16:32:18 +0200356
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200357 mgmt_core soc (
Manar61dce922020-11-10 19:26:28 +0200358 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200359 .vdd1v8(vccd),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400360 .vss(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400361 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400362 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400363 .gpio_out_pad(gpio_out_core),
364 .gpio_in_pad(gpio_in_core),
365 .gpio_mode0_pad(gpio_mode0_core),
366 .gpio_mode1_pad(gpio_mode1_core),
367 .gpio_outenb_pad(gpio_outenb_core),
368 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400369 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400370 .flash_csb(flash_csb_core),
371 .flash_clk(flash_clk_core),
372 .flash_csb_oeb(flash_csb_oeb_core),
373 .flash_clk_oeb(flash_clk_oeb_core),
374 .flash_io0_oeb(flash_io0_oeb_core),
375 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400376 .flash_csb_ieb(flash_csb_ieb_core),
377 .flash_clk_ieb(flash_clk_ieb_core),
378 .flash_io0_ieb(flash_io0_ieb_core),
379 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400380 .flash_io0_do(flash_io0_do_core),
381 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400382 .flash_io0_di(flash_io0_di_core),
383 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400384 // Master Reset
385 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400386 .porb(porb_l),
387 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400388 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400389 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400390 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400391 .core_rstn(caravel_rstn),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200392 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500393 .la_input(la_data_in_mprj),
394 .la_output(la_data_out_mprj),
395 .la_oen(la_oen_mprj),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400396 // User Project IO Control
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400397 .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
398 .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
399 .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
400 .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400401 .mprj_io_loader_resetn(mprj_io_loader_resetn),
402 .mprj_io_loader_clock(mprj_io_loader_clock),
403 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400404 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400405 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwardsba328902020-10-27 15:03:22 -0400406 .pwr_ctrl_out(pwr_ctrl_out),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400407 .sdo_out(sdo_out),
408 .sdo_outenb(sdo_outenb),
409 .jtag_out(jtag_out),
410 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400411 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400412 .mprj_cyc_o(mprj_cyc_o_core),
413 .mprj_stb_o(mprj_stb_o_core),
414 .mprj_we_o(mprj_we_o_core),
415 .mprj_sel_o(mprj_sel_o_core),
416 .mprj_adr_o(mprj_adr_o_core),
417 .mprj_dat_o(mprj_dat_o_core),
418 .mprj_ack_i(mprj_ack_i_core),
419 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400420 // mask data
Manar55ec3692020-10-30 16:32:18 +0200421 .mask_rev(mask_rev),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200422 // MGMT area R/W interface
423 .mgmt_ena(mgmt_ena),
Manar55ec3692020-10-30 16:32:18 +0200424 .mgmt_wen_mask(mgmt_wen_mask),
425 .mgmt_wen(mgmt_wen),
426 .mgmt_addr(mgmt_addr),
427 .mgmt_wdata(mgmt_wdata),
428 .mgmt_rdata(mgmt_rdata),
Manarffe6cad2020-11-09 19:09:04 +0200429 // MGMT area RO interface
430 .mgmt_ena_ro(mgmt_ena_ro),
431 .mgmt_addr_ro(mgmt_addr_ro),
432 .mgmt_rdata_ro(mgmt_rdata_ro)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400433 );
434
Tim Edwards53d92182020-10-11 21:47:40 -0400435 /* Clock and reset to user space are passed through a tristate */
436 /* buffer like the above, but since they are intended to be */
437 /* always active, connect the enable to the logic-1 output from */
438 /* the vccd1 domain. */
439
Tim Edwards53d92182020-10-11 21:47:40 -0400440 mgmt_protect mgmt_buffers (
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200441 `ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400442 .vccd(vccd),
443 .vssd(vssd),
444 .vccd1(vccd1),
445 .vssd1(vssd1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400446 .vdda1(vdda1),
447 .vssa1(vssa1),
448 .vdda2(vdda2),
449 .vssa2(vssa2),
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200450 `endif
Tim Edwards21a9aac2020-10-12 22:05:18 -0400451
Tim Edwards53d92182020-10-11 21:47:40 -0400452 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400453 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400454 .caravel_rstn(caravel_rstn),
455 .mprj_cyc_o_core(mprj_cyc_o_core),
456 .mprj_stb_o_core(mprj_stb_o_core),
457 .mprj_we_o_core(mprj_we_o_core),
458 .mprj_sel_o_core(mprj_sel_o_core),
459 .mprj_adr_o_core(mprj_adr_o_core),
460 .mprj_dat_o_core(mprj_dat_o_core),
Tim Edwards43e5c602020-11-19 15:59:50 -0500461 .la_data_out_core(la_data_out_user),
462 .la_data_out_mprj(la_data_out_mprj),
463 .la_data_in_core(la_data_in_user),
464 .la_data_in_mprj(la_data_in_mprj),
465 .la_oen_mprj(la_oen_mprj),
466 .la_oen_core(la_oen_user),
Tim Edwards53d92182020-10-11 21:47:40 -0400467
468 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400469 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400470 .user_resetn(mprj_resetn),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200471 .user_reset(mprj_reset),
Tim Edwards53d92182020-10-11 21:47:40 -0400472 .mprj_cyc_o_user(mprj_cyc_o_user),
473 .mprj_stb_o_user(mprj_stb_o_user),
474 .mprj_we_o_user(mprj_we_o_user),
475 .mprj_sel_o_user(mprj_sel_o_user),
476 .mprj_adr_o_user(mprj_adr_o_user),
477 .mprj_dat_o_user(mprj_dat_o_user),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400478 .user1_vcc_powergood(mprj_vcc_pwrgood),
479 .user2_vcc_powergood(mprj2_vcc_pwrgood),
480 .user1_vdd_powergood(mprj_vdd_pwrgood),
481 .user2_vdd_powergood(mprj2_vdd_pwrgood)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400482 );
Tim Edwards53d92182020-10-11 21:47:40 -0400483
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200484
Tim Edwardsb86fc842020-10-13 17:11:54 -0400485 /*----------------------------------------------*/
486 /* Wrapper module around the user project */
487 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400488
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200489 user_project_wrapper mprj (
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200490 `ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400491 .vdda1(vdda1), // User area 1 3.3V power
492 .vdda2(vdda2), // User area 2 3.3V power
493 .vssa1(vssa1), // User area 1 analog ground
494 .vssa2(vssa2), // User area 2 analog ground
495 .vccd1(vccd1), // User area 1 1.8V power
496 .vccd2(vccd2), // User area 2 1.8V power
497 .vssd1(vssd1), // User area 1 digital ground
498 .vssd2(vssd2), // User area 2 digital ground
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200499 `endif
Tim Edwards21a9aac2020-10-12 22:05:18 -0400500
Tim Edwards53d92182020-10-11 21:47:40 -0400501 .wb_clk_i(mprj_clock),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200502 .wb_rst_i(mprj_reset),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200503 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400504 .wbs_cyc_i(mprj_cyc_o_user),
505 .wbs_stb_i(mprj_stb_o_user),
506 .wbs_we_i(mprj_we_o_user),
507 .wbs_sel_i(mprj_sel_o_user),
508 .wbs_adr_i(mprj_adr_o_user),
509 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400510 .wbs_ack_o(mprj_ack_i_core),
511 .wbs_dat_o(mprj_dat_i_core),
512 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500513 .la_data_in(la_data_in_user),
514 .la_data_out(la_data_out_user),
515 .la_oen(la_oen_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400516 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400517 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400518 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400519 .io_oeb(user_io_oeb),
Tim Edwards581068f2020-11-19 12:45:25 -0500520 .analog_io(user_analog_io),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400521 // Independent clock
522 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400523 );
524
Tim Edwards05537512020-10-06 14:59:26 -0400525 /*--------------------------------------*/
526 /* End user project instantiation */
527 /*--------------------------------------*/
528
Tim Edwards04ba17f2020-10-02 22:27:50 -0400529 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
530
Tim Edwards251e0df2020-10-05 11:02:12 -0400531 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400532
Tim Edwards251e0df2020-10-05 11:02:12 -0400533 // Each control block sits next to an I/O pad in the user area.
534 // It gets input through a serial chain from the previous control
535 // block and passes it to the next control block. Due to the nature
536 // of the shift register, bits are presented in reverse, as the first
537 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400538
Tim Edwards89f09242020-10-05 15:17:34 -0400539 // There are two types of block; the first two are configured to be
540 // full bidirectional under control of the management Soc (JTAG and
541 // SDO). The rest are configured to be default (input).
542
Tim Edwards251e0df2020-10-05 11:02:12 -0400543 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400544 .DM_INIT(3'b110), // Mode = output, strong up/down
Tim Edwards496a08a2020-10-26 15:44:51 -0400545 .OENB_INIT(1'b1) // Enable output signaling from wire
Tim Edwards89f09242020-10-05 15:17:34 -0400546 ) gpio_control_bidir [1:0] (
Manar61dce922020-11-10 19:26:28 +0200547 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200548 .vccd(vccd),
549 .vssd(vssd),
550 .vccd1(vccd1),
551 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400552 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400553
Tim Edwards04ba17f2020-10-02 22:27:50 -0400554 // Management Soc-facing signals
555
Tim Edwardsc18c4742020-10-03 11:26:39 -0400556 .resetn(mprj_io_loader_resetn),
557 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400558
Tim Edwards89f09242020-10-05 15:17:34 -0400559 .mgmt_gpio_in(mgmt_io_in[1:0]),
560 .mgmt_gpio_out({sdo_out, jtag_out}),
561 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400562
563 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400564 .serial_data_in(gpio_serial_link_shifted[1:0]),
565 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400566
567 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400568 .user_gpio_out(user_io_out[1:0]),
569 .user_gpio_oeb(user_io_oeb[1:0]),
570 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400571
572 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400573 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
574 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
575 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
576 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
577 .pad_gpio_holdover(mprj_io_holdover[1:0]),
578 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
579 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
580 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
581 .pad_gpio_dm(mprj_io_dm[5:0]),
582 .pad_gpio_outenb(mprj_io_oeb[1:0]),
583 .pad_gpio_out(mprj_io_out[1:0]),
584 .pad_gpio_in(mprj_io_in[1:0])
585 );
586
587 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Manar61dce922020-11-10 19:26:28 +0200588 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200589 .vccd(vccd),
590 .vssd(vssd),
591 .vccd1(vccd1),
592 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400593 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400594
595 // Management Soc-facing signals
596
597 .resetn(mprj_io_loader_resetn),
598 .serial_clock(mprj_io_loader_clock),
599
600 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
601 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
602 .mgmt_gpio_oeb(1'b1),
603
604 // Serial data chain for pad configuration
605 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
606 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
607
608 // User-facing signals
609 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
610 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
611 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
612
613 // Pad-facing signals (Pad GPIOv2)
614 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
615 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
616 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
617 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
618 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
619 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
620 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
621 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
622 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
623 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
624 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
625 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400626 );
627
Tim Edwards04ba17f2020-10-02 22:27:50 -0400628 user_id_programming #(
629 .USER_PROJECT_ID(USER_PROJECT_ID)
630 ) user_id_value (
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200631`ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400632 .vdd1v8(vccd),
633 .vss(vssd),
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200634`endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400635 .mask_rev(mask_rev)
636 );
637
Tim Edwardsf51dd082020-10-05 16:30:24 -0400638 // Power-on-reset circuit
639 simple_por por (
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200640`ifdef USE_POWER_PINS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400641 .vdd3v3(vddio),
Tim Edwards581068f2020-11-19 12:45:25 -0500642 .vdd1v8(vccd),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400643 .vss(vssio),
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200644`endif
Tim Edwards581068f2020-11-19 12:45:25 -0500645 .porb_h(porb_h),
646 .porb_l(porb_l),
647 .por_l(por_l)
Tim Edwardsf51dd082020-10-05 16:30:24 -0400648 );
649
650 // XRES (chip input pin reset) reset level converter
Ahmed Ghazy1d1679d2020-11-30 17:44:45 +0200651 sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped rstb_level (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200652`ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400653 .VPWR(vddio),
654 .VPB(vddio),
655 .LVPWR(vccd),
656 .VNB(vssio),
657 .VGND(vssio),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200658`endif
Tim Edwardsf51dd082020-10-05 16:30:24 -0400659 .A(rstb_h),
660 .X(rstb_l)
661 );
662
Manar55ec3692020-10-30 16:32:18 +0200663 // Storage area
Manarffe6cad2020-11-09 19:09:04 +0200664 storage storage(
Manar55ec3692020-10-30 16:32:18 +0200665 .mgmt_clk(caravel_clk),
666 .mgmt_ena(mgmt_ena),
667 .mgmt_wen(mgmt_wen),
668 .mgmt_wen_mask(mgmt_wen_mask),
669 .mgmt_addr(mgmt_addr),
670 .mgmt_wdata(mgmt_wdata),
671 .mgmt_rdata(mgmt_rdata),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200672 // Management RO interface
Manarffe6cad2020-11-09 19:09:04 +0200673 .mgmt_ena_ro(mgmt_ena_ro),
674 .mgmt_addr_ro(mgmt_addr_ro),
675 .mgmt_rdata_ro(mgmt_rdata_ro)
Manar55ec3692020-10-30 16:32:18 +0200676 );
677
Tim Edwardsef8312e2020-09-22 17:20:06 -0400678endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500679// `default_nettype wire