blob: 3832f6748aec261aa9850c047d8906e8ae82f1b7 [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"
Tim Edwards4286ae12020-10-11 14:52:01 -040026
27`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
28`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
29`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
30`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040031
32`include "mgmt_soc.v"
Tim Edwards44bab472020-10-04 22:09:54 -040033`include "housekeeping_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040034`include "digital_pll.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040035`include "caravel_clocking.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040036`include "mgmt_core.v"
Tim Edwards53d92182020-10-11 21:47:40 -040037`include "mgmt_protect.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040038`include "mprj_io.v"
39`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040040`include "user_id_programming.v"
Tim Edwardsb86fc842020-10-13 17:11:54 -040041`include "user_project_wrapper.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040042`include "gpio_control_block.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040043`include "clock_div.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040044`include "simple_por.v"
Manar55ec3692020-10-30 16:32:18 +020045`include "storage_bridge_wb.v"
Ahmed Ghazy2517fa82020-11-08 23:34:41 +020046`include "DFFRAM.v"
Manar68e03632020-11-09 13:25:13 +020047`include "DFFRAMBB.v"
Manar55ec3692020-10-30 16:32:18 +020048`include "sram_1rw1r_32_256_8_sky130.v"
49`include "storage.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040050
Tim Edwards05537512020-10-06 14:59:26 -040051/*------------------------------*/
52/* Include user project here */
53/*------------------------------*/
54`include "user_proj_example.v"
55
Manar55ec3692020-10-30 16:32:18 +020056// `ifdef USE_OPENRAM
57// `include "sram_1rw1r_32_256_8_sky130.v"
58// `endif
Tim Edwardsef8312e2020-09-22 17:20:06 -040059
60module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040061 inout vddio, // Common 3.3V padframe/ESD power
62 inout vssio, // Common padframe/ESD ground
63 inout vdda, // Management 3.3V power
64 inout vssa, // Common analog ground
65 inout vccd, // Management/Common 1.8V power
66 inout vssd, // Common digital ground
67 inout vdda1, // User area 1 3.3V power
68 inout vdda2, // User area 2 3.3V power
69 inout vssa1, // User area 1 analog ground
70 inout vssa2, // User area 2 analog ground
71 inout vccd1, // User area 1 1.8V power
72 inout vccd2, // User area 2 1.8V power
73 inout vssd1, // User area 1 digital ground
74 inout vssd2, // User area 2 digital ground
75
Tim Edwards04ba17f2020-10-02 22:27:50 -040076 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040077 inout [`MPRJ_IO_PADS-1:0] mprj_io,
Tim Edwardsba328902020-10-27 15:03:22 -040078 output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
Tim Edwardsef8312e2020-09-22 17:20:06 -040079 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040080 input resetb,
81
82 // Note that only two pins are available on the flash so dual and
83 // quad flash modes are not available.
84
Tim Edwardsef8312e2020-09-22 17:20:06 -040085 output flash_csb,
86 output flash_clk,
87 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040088 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040089);
90
Tim Edwards04ba17f2020-10-02 22:27:50 -040091 //------------------------------------------------------------
92 // This value is uniquely defined for each user project.
93 //------------------------------------------------------------
94 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040095
Tim Edwards04ba17f2020-10-02 22:27:50 -040096 // These pins are overlaid on mprj_io space. They have the function
97 // below when the management processor is in reset, or in the default
98 // configuration. They are assigned to uses in the user space by the
99 // configuration program running off of the SPI flash. Note that even
100 // when the user has taken control of these pins, they can be restored
101 // to the original use by setting the resetb pin low. The SPI pins and
102 // UART pins can be connected directly to an FTDI chip as long as the
103 // FTDI chip sets these lines to high impedence (input function) at
104 // all times except when holding the chip in reset.
105
106 // JTAG = mprj_io[0] (inout)
107 // SDO = mprj_io[1] (output)
108 // SDI = mprj_io[2] (input)
109 // CSB = mprj_io[3] (input)
110 // SCK = mprj_io[4] (input)
111 // ser_rx = mprj_io[5] (input)
112 // ser_tx = mprj_io[6] (output)
113 // irq = mprj_io[7] (input)
114
115 // These pins are reserved for any project that wants to incorporate
116 // its own processor and flash controller. While a user project can
117 // technically use any available I/O pins for the purpose, these
118 // four pins connect to a pass-through mode from the SPI slave (pins
119 // 1-4 above) so that any SPI flash connected to these specific pins
120 // can be accessed through the SPI slave even when the processor is in
121 // reset.
122
Tim Edwards44bab472020-10-04 22:09:54 -0400123 // user_flash_csb = mprj_io[8]
124 // user_flash_sck = mprj_io[9]
125 // user_flash_io0 = mprj_io[10]
126 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400127
128 // One-bit GPIO dedicated to management SoC (outside of user control)
129 wire gpio_out_core;
130 wire gpio_in_core;
131 wire gpio_mode0_core;
132 wire gpio_mode1_core;
133 wire gpio_outenb_core;
134 wire gpio_inenb_core;
135
Tim Edwards6d9739d2020-10-19 11:00:49 -0400136 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400137 wire mprj_io_loader_resetn;
138 wire mprj_io_loader_clock;
139 wire mprj_io_loader_data;
140
Tim Edwardsef8312e2020-09-22 17:20:06 -0400141 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
142 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
143 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400144 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400145 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400146 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
147 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
148 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400149 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
150 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
151 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
152 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
153 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
154 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
155
Tim Edwards6d9739d2020-10-19 11:00:49 -0400156 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400157 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400158 wire [`MPRJ_IO_PADS-1:0] user_io_in;
159 wire [`MPRJ_IO_PADS-1:0] user_io_out;
Tim Edwards581068f2020-11-19 12:45:25 -0500160 wire [`MPRJ_IO_PADS-8:0] user_analog_io;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400161
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 Edwards6d9739d2020-10-19 11:00:49 -0400167 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400168 // 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 Edwards581068f2020-11-19 12:45:25 -0500190 wire clock_core;
191
Tim Edwards04ba17f2020-10-02 22:27:50 -0400192 // Power-on-reset signal. The reset pad generates the sense-inverted
193 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
194 // derived.
195
Tim Edwardsef8312e2020-09-22 17:20:06 -0400196 wire porb_h;
197 wire porb_l;
Tim Edwards581068f2020-11-19 12:45:25 -0500198 wire por_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400199
Tim Edwardsf51dd082020-10-05 16:30:24 -0400200 wire rstb_h;
201 wire rstb_l;
202
Tim Edwards581068f2020-11-19 12:45:25 -0500203 wire flash_clk_core, flash_csb_core;
204 wire flash_clk_oeb_core, flash_csb_oeb_core;
205 wire flash_clk_ieb_core, flash_csb_ieb_core;
206 wire flash_io0_oeb_core, flash_io1_oeb_core;
207 wire flash_io2_oeb_core, flash_io3_oeb_core;
208 wire flash_io0_ieb_core, flash_io1_ieb_core;
209 wire flash_io2_ieb_core, flash_io3_ieb_core;
210 wire flash_io0_do_core, flash_io1_do_core;
211 wire flash_io2_do_core, flash_io3_do_core;
212 wire flash_io0_di_core, flash_io1_di_core;
213 wire flash_io2_di_core, flash_io3_di_core;
214
Tim Edwards44bab472020-10-04 22:09:54 -0400215 // To be considered: Master hold signal on all user pads (?)
216 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
217 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400218 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400219 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
220
Tim Edwardsef8312e2020-09-22 17:20:06 -0400221 chip_io padframe(
222 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400223 .vddio(vddio),
224 .vssio(vssio),
225 .vdda(vdda),
226 .vssa(vssa),
227 .vccd(vccd),
228 .vssd(vssd),
229 .vdda1(vdda1),
230 .vdda2(vdda2),
231 .vssa1(vssa1),
232 .vssa2(vssa2),
233 .vccd1(vccd1),
234 .vccd2(vccd2),
235 .vssd1(vssd1),
236 .vssd2(vssd2),
237
Tim Edwardsef8312e2020-09-22 17:20:06 -0400238 .gpio(gpio),
239 .mprj_io(mprj_io),
240 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400241 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400242 .flash_csb(flash_csb),
243 .flash_clk(flash_clk),
244 .flash_io0(flash_io0),
245 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400246 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400247 .porb_h(porb_h),
Tim Edwards581068f2020-11-19 12:45:25 -0500248 .por(por_l),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400249 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400250 .clock_core(clock_core),
251 .gpio_out_core(gpio_out_core),
252 .gpio_in_core(gpio_in_core),
253 .gpio_mode0_core(gpio_mode0_core),
254 .gpio_mode1_core(gpio_mode1_core),
255 .gpio_outenb_core(gpio_outenb_core),
256 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400257 .flash_csb_core(flash_csb_core),
258 .flash_clk_core(flash_clk_core),
259 .flash_csb_oeb_core(flash_csb_oeb_core),
260 .flash_clk_oeb_core(flash_clk_oeb_core),
261 .flash_io0_oeb_core(flash_io0_oeb_core),
262 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400263 .flash_csb_ieb_core(flash_csb_ieb_core),
264 .flash_clk_ieb_core(flash_clk_ieb_core),
265 .flash_io0_ieb_core(flash_io0_ieb_core),
266 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400267 .flash_io0_do_core(flash_io0_do_core),
268 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400269 .flash_io0_di_core(flash_io0_di_core),
270 .flash_io1_di_core(flash_io1_di_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400271 .mprj_io_in(mprj_io_in),
272 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400273 .mprj_io_oeb(mprj_io_oeb),
Manar14d35ac2020-10-21 22:47:15 +0200274 .mprj_io_hldh_n(mprj_io_hldh_n),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400275 .mprj_io_enh(mprj_io_enh),
Manar14d35ac2020-10-21 22:47:15 +0200276 .mprj_io_inp_dis(mprj_io_inp_dis),
277 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
278 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
279 .mprj_io_slow_sel(mprj_io_slow_sel),
280 .mprj_io_holdover(mprj_io_holdover),
281 .mprj_io_analog_en(mprj_io_analog_en),
282 .mprj_io_analog_sel(mprj_io_analog_sel),
283 .mprj_io_analog_pol(mprj_io_analog_pol),
Tim Edwards581068f2020-11-19 12:45:25 -0500284 .mprj_io_dm(mprj_io_dm),
285 .mprj_analog_io(user_analog_io)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400286 );
287
288 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400289 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400290 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400291 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400292
293 wire [7:0] spi_ro_config_core;
294
295 // LA signals
Tim Edwards43e5c602020-11-19 15:59:50 -0500296 wire [127:0] la_data_in_user; // From CPU to MPRJ
297 wire [127:0] la_data_in_mprj; // From MPRJ to CPU
Tim Edwardsef8312e2020-09-22 17:20:06 -0400298 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
Tim Edwards43e5c602020-11-19 15:59:50 -0500299 wire [127:0] la_data_out_user; // From MPRJ to CPU
300 wire [127:0] la_oen_user; // From CPU to MPRJ
301 wire [127:0] la_oen_mprj; // From CPU to MPRJ
302
Tim Edwards6d9739d2020-10-19 11:00:49 -0400303 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400304 wire mprj_cyc_o_core;
305 wire mprj_stb_o_core;
306 wire mprj_we_o_core;
307 wire [3:0] mprj_sel_o_core;
308 wire [31:0] mprj_adr_o_core;
309 wire [31:0] mprj_dat_o_core;
310 wire mprj_ack_i_core;
311 wire [31:0] mprj_dat_i_core;
312
313 // WB MI B (xbar)
314 wire xbar_cyc_o_core;
315 wire xbar_stb_o_core;
316 wire xbar_we_o_core;
317 wire [3:0] xbar_sel_o_core;
318 wire [31:0] xbar_adr_o_core;
319 wire [31:0] xbar_dat_o_core;
320 wire xbar_ack_i_core;
321 wire [31:0] xbar_dat_i_core;
322
Tim Edwards04ba17f2020-10-02 22:27:50 -0400323 // Mask revision
324 wire [31:0] mask_rev;
325
Manar14d35ac2020-10-21 22:47:15 +0200326 wire mprj_clock;
327 wire mprj_clock2;
328 wire mprj_resetn;
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200329 wire mprj_reset;
Manar14d35ac2020-10-21 22:47:15 +0200330 wire mprj_cyc_o_user;
331 wire mprj_stb_o_user;
332 wire mprj_we_o_user;
333 wire [3:0] mprj_sel_o_user;
334 wire [31:0] mprj_adr_o_user;
335 wire [31:0] mprj_dat_o_user;
336 wire mprj_vcc_pwrgood;
337 wire mprj2_vcc_pwrgood;
338 wire mprj_vdd_pwrgood;
339 wire mprj2_vdd_pwrgood;
340
Manar55ec3692020-10-30 16:32:18 +0200341 // Storage area
342 // Management R/W interface
Manarffe6cad2020-11-09 19:09:04 +0200343 wire [`RAM_BLOCKS-1:0] mgmt_ena;
344 wire [`RAM_BLOCKS-1:0] mgmt_wen;
345 wire [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask;
Manar55ec3692020-10-30 16:32:18 +0200346 wire [7:0] mgmt_addr;
347 wire [31:0] mgmt_wdata;
Manarffe6cad2020-11-09 19:09:04 +0200348 wire [(`RAM_BLOCKS*32)-1:0] mgmt_rdata;
Manar55ec3692020-10-30 16:32:18 +0200349 // Management RO interface
Manarffe6cad2020-11-09 19:09:04 +0200350 wire mgmt_ena_ro;
351 wire [7:0] mgmt_addr_ro;
352 wire [31:0] mgmt_rdata_ro;
Manar55ec3692020-10-30 16:32:18 +0200353
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200354 mgmt_core soc (
Manar61dce922020-11-10 19:26:28 +0200355 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200356 .vdd1v8(vccd),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400357 .vss(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400358 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400359 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400360 .gpio_out_pad(gpio_out_core),
361 .gpio_in_pad(gpio_in_core),
362 .gpio_mode0_pad(gpio_mode0_core),
363 .gpio_mode1_pad(gpio_mode1_core),
364 .gpio_outenb_pad(gpio_outenb_core),
365 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400366 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400367 .flash_csb(flash_csb_core),
368 .flash_clk(flash_clk_core),
369 .flash_csb_oeb(flash_csb_oeb_core),
370 .flash_clk_oeb(flash_clk_oeb_core),
371 .flash_io0_oeb(flash_io0_oeb_core),
372 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400373 .flash_csb_ieb(flash_csb_ieb_core),
374 .flash_clk_ieb(flash_clk_ieb_core),
375 .flash_io0_ieb(flash_io0_ieb_core),
376 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400377 .flash_io0_do(flash_io0_do_core),
378 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400379 .flash_io0_di(flash_io0_di_core),
380 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400381 // Master Reset
382 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400383 .porb(porb_l),
384 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400385 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400386 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400387 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400388 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400389 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500390 .la_input(la_data_in_mprj),
391 .la_output(la_data_out_mprj),
392 .la_oen(la_oen_mprj),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400393 // User Project IO Control
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400394 .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
395 .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
396 .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
397 .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400398 .mprj_io_loader_resetn(mprj_io_loader_resetn),
399 .mprj_io_loader_clock(mprj_io_loader_clock),
400 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400401 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400402 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwardsba328902020-10-27 15:03:22 -0400403 .pwr_ctrl_out(pwr_ctrl_out),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400404 .sdo_out(sdo_out),
405 .sdo_outenb(sdo_outenb),
406 .jtag_out(jtag_out),
407 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400408 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400409 .mprj_cyc_o(mprj_cyc_o_core),
410 .mprj_stb_o(mprj_stb_o_core),
411 .mprj_we_o(mprj_we_o_core),
412 .mprj_sel_o(mprj_sel_o_core),
413 .mprj_adr_o(mprj_adr_o_core),
414 .mprj_dat_o(mprj_dat_o_core),
415 .mprj_ack_i(mprj_ack_i_core),
416 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400417 // mask data
Manar55ec3692020-10-30 16:32:18 +0200418 .mask_rev(mask_rev),
Manarffe6cad2020-11-09 19:09:04 +0200419 // MGMT area R/W interface
Manar55ec3692020-10-30 16:32:18 +0200420 .mgmt_ena(mgmt_ena),
421 .mgmt_wen_mask(mgmt_wen_mask),
422 .mgmt_wen(mgmt_wen),
423 .mgmt_addr(mgmt_addr),
424 .mgmt_wdata(mgmt_wdata),
425 .mgmt_rdata(mgmt_rdata),
Manarffe6cad2020-11-09 19:09:04 +0200426 // MGMT area RO interface
427 .mgmt_ena_ro(mgmt_ena_ro),
428 .mgmt_addr_ro(mgmt_addr_ro),
429 .mgmt_rdata_ro(mgmt_rdata_ro)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400430 );
431
Tim Edwards53d92182020-10-11 21:47:40 -0400432 /* Clock and reset to user space are passed through a tristate */
433 /* buffer like the above, but since they are intended to be */
434 /* always active, connect the enable to the logic-1 output from */
435 /* the vccd1 domain. */
436
Tim Edwards53d92182020-10-11 21:47:40 -0400437 mgmt_protect mgmt_buffers (
Tim Edwards53d92182020-10-11 21:47:40 -0400438 .vccd(vccd),
439 .vssd(vssd),
440 .vccd1(vccd1),
441 .vssd1(vssd1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400442 .vdda1(vdda1),
443 .vssa1(vssa1),
444 .vdda2(vdda2),
445 .vssa2(vssa2),
Tim Edwards21a9aac2020-10-12 22:05:18 -0400446
Tim Edwards53d92182020-10-11 21:47:40 -0400447 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400448 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400449 .caravel_rstn(caravel_rstn),
450 .mprj_cyc_o_core(mprj_cyc_o_core),
451 .mprj_stb_o_core(mprj_stb_o_core),
452 .mprj_we_o_core(mprj_we_o_core),
453 .mprj_sel_o_core(mprj_sel_o_core),
454 .mprj_adr_o_core(mprj_adr_o_core),
455 .mprj_dat_o_core(mprj_dat_o_core),
Tim Edwards43e5c602020-11-19 15:59:50 -0500456 .la_data_out_core(la_data_out_user),
457 .la_data_out_mprj(la_data_out_mprj),
458 .la_data_in_core(la_data_in_user),
459 .la_data_in_mprj(la_data_in_mprj),
460 .la_oen_mprj(la_oen_mprj),
461 .la_oen_core(la_oen_user),
Tim Edwards53d92182020-10-11 21:47:40 -0400462
463 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400464 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400465 .user_resetn(mprj_resetn),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200466 .user_reset(mprj_reset),
Tim Edwards53d92182020-10-11 21:47:40 -0400467 .mprj_cyc_o_user(mprj_cyc_o_user),
468 .mprj_stb_o_user(mprj_stb_o_user),
469 .mprj_we_o_user(mprj_we_o_user),
470 .mprj_sel_o_user(mprj_sel_o_user),
471 .mprj_adr_o_user(mprj_adr_o_user),
472 .mprj_dat_o_user(mprj_dat_o_user),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400473 .user1_vcc_powergood(mprj_vcc_pwrgood),
474 .user2_vcc_powergood(mprj2_vcc_pwrgood),
475 .user1_vdd_powergood(mprj_vdd_pwrgood),
476 .user2_vdd_powergood(mprj2_vdd_pwrgood)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400477 );
Tim Edwards53d92182020-10-11 21:47:40 -0400478
Tim Edwardsef8312e2020-09-22 17:20:06 -0400479
Tim Edwardsb86fc842020-10-13 17:11:54 -0400480 /*----------------------------------------------*/
481 /* Wrapper module around the user project */
482 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400483
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200484 user_project_wrapper mprj (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400485 .vdda1(vdda1), // User area 1 3.3V power
486 .vdda2(vdda2), // User area 2 3.3V power
487 .vssa1(vssa1), // User area 1 analog ground
488 .vssa2(vssa2), // User area 2 analog ground
489 .vccd1(vccd1), // User area 1 1.8V power
490 .vccd2(vccd2), // User area 2 1.8V power
491 .vssd1(vssd1), // User area 1 digital ground
492 .vssd2(vssd2), // User area 2 digital ground
493
Tim Edwards53d92182020-10-11 21:47:40 -0400494 .wb_clk_i(mprj_clock),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200495 .wb_rst_i(mprj_reset),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400496 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400497 .wbs_cyc_i(mprj_cyc_o_user),
498 .wbs_stb_i(mprj_stb_o_user),
499 .wbs_we_i(mprj_we_o_user),
500 .wbs_sel_i(mprj_sel_o_user),
501 .wbs_adr_i(mprj_adr_o_user),
502 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400503 .wbs_ack_o(mprj_ack_i_core),
504 .wbs_dat_o(mprj_dat_i_core),
505 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500506 .la_data_in(la_data_in_user),
507 .la_data_out(la_data_out_user),
508 .la_oen(la_oen_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400509 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400510 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400511 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400512 .io_oeb(user_io_oeb),
Tim Edwards581068f2020-11-19 12:45:25 -0500513 .analog_io(user_analog_io),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400514 // Independent clock
515 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400516 );
517
Tim Edwards05537512020-10-06 14:59:26 -0400518 /*--------------------------------------*/
519 /* End user project instantiation */
520 /*--------------------------------------*/
521
Tim Edwards04ba17f2020-10-02 22:27:50 -0400522 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
523
Tim Edwards251e0df2020-10-05 11:02:12 -0400524 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400525
Tim Edwards251e0df2020-10-05 11:02:12 -0400526 // Each control block sits next to an I/O pad in the user area.
527 // It gets input through a serial chain from the previous control
528 // block and passes it to the next control block. Due to the nature
529 // of the shift register, bits are presented in reverse, as the first
530 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400531
Tim Edwards89f09242020-10-05 15:17:34 -0400532 // There are two types of block; the first two are configured to be
533 // full bidirectional under control of the management Soc (JTAG and
534 // SDO). The rest are configured to be default (input).
535
Tim Edwards251e0df2020-10-05 11:02:12 -0400536 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400537 .DM_INIT(3'b110), // Mode = output, strong up/down
Tim Edwards496a08a2020-10-26 15:44:51 -0400538 .OENB_INIT(1'b1) // Enable output signaling from wire
Tim Edwards89f09242020-10-05 15:17:34 -0400539 ) gpio_control_bidir [1:0] (
Manar61dce922020-11-10 19:26:28 +0200540 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200541 .vccd(vccd),
542 .vssd(vssd),
543 .vccd1(vccd1),
544 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400545 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400546
Tim Edwards04ba17f2020-10-02 22:27:50 -0400547 // Management Soc-facing signals
548
Tim Edwardsc18c4742020-10-03 11:26:39 -0400549 .resetn(mprj_io_loader_resetn),
550 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400551
Tim Edwards89f09242020-10-05 15:17:34 -0400552 .mgmt_gpio_in(mgmt_io_in[1:0]),
553 .mgmt_gpio_out({sdo_out, jtag_out}),
554 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400555
556 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400557 .serial_data_in(gpio_serial_link_shifted[1:0]),
558 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400559
560 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400561 .user_gpio_out(user_io_out[1:0]),
562 .user_gpio_oeb(user_io_oeb[1:0]),
563 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400564
565 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400566 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
567 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
568 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
569 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
570 .pad_gpio_holdover(mprj_io_holdover[1:0]),
571 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
572 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
573 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
574 .pad_gpio_dm(mprj_io_dm[5:0]),
575 .pad_gpio_outenb(mprj_io_oeb[1:0]),
576 .pad_gpio_out(mprj_io_out[1:0]),
577 .pad_gpio_in(mprj_io_in[1:0])
578 );
579
580 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Manar61dce922020-11-10 19:26:28 +0200581 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200582 .vccd(vccd),
583 .vssd(vssd),
584 .vccd1(vccd1),
585 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400586 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400587
588 // Management Soc-facing signals
589
590 .resetn(mprj_io_loader_resetn),
591 .serial_clock(mprj_io_loader_clock),
592
593 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
594 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
595 .mgmt_gpio_oeb(1'b1),
596
597 // Serial data chain for pad configuration
598 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
599 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
600
601 // User-facing signals
602 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
603 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
604 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
605
606 // Pad-facing signals (Pad GPIOv2)
607 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
608 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
609 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
610 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
611 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
612 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
613 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
614 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
615 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
616 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
617 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
618 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400619 );
620
Tim Edwards04ba17f2020-10-02 22:27:50 -0400621 user_id_programming #(
622 .USER_PROJECT_ID(USER_PROJECT_ID)
623 ) user_id_value (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400624 .vdd1v8(vccd),
625 .vss(vssd),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400626 .mask_rev(mask_rev)
627 );
628
Tim Edwardsf51dd082020-10-05 16:30:24 -0400629 // Power-on-reset circuit
630 simple_por por (
Tim Edwards9eda80d2020-10-08 21:36:44 -0400631 .vdd3v3(vddio),
Tim Edwards581068f2020-11-19 12:45:25 -0500632 .vdd1v8(vccd),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400633 .vss(vssio),
Tim Edwards581068f2020-11-19 12:45:25 -0500634 .porb_h(porb_h),
635 .porb_l(porb_l),
636 .por_l(por_l)
Tim Edwardsf51dd082020-10-05 16:30:24 -0400637 );
638
639 // XRES (chip input pin reset) reset level converter
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200640 sky130_fd_sc_hvl__lsbufhv2lv_1 rstb_level (
641`ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400642 .VPWR(vddio),
643 .VPB(vddio),
644 .LVPWR(vccd),
645 .VNB(vssio),
646 .VGND(vssio),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200647`endif
Tim Edwardsf51dd082020-10-05 16:30:24 -0400648 .A(rstb_h),
649 .X(rstb_l)
650 );
651
Manar55ec3692020-10-30 16:32:18 +0200652 // Storage area
Manarffe6cad2020-11-09 19:09:04 +0200653 storage storage(
Manar55ec3692020-10-30 16:32:18 +0200654 .mgmt_clk(caravel_clk),
655 .mgmt_ena(mgmt_ena),
656 .mgmt_wen(mgmt_wen),
657 .mgmt_wen_mask(mgmt_wen_mask),
658 .mgmt_addr(mgmt_addr),
659 .mgmt_wdata(mgmt_wdata),
660 .mgmt_rdata(mgmt_rdata),
661 // Management RO interface
Manarffe6cad2020-11-09 19:09:04 +0200662 .mgmt_ena_ro(mgmt_ena_ro),
663 .mgmt_addr_ro(mgmt_addr_ro),
664 .mgmt_rdata_ro(mgmt_rdata_ro)
Manar55ec3692020-10-30 16:32:18 +0200665 );
666
Tim Edwardsef8312e2020-09-22 17:20:06 -0400667endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500668// `default_nettype wire