blob: cf8f5630d4b85589730ad68cb600fefa348dccdf [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 Edwardsc5265b82020-09-25 17:08:59 -040016`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040017
Ahmed Ghazy31c34652020-12-01 19:59:44 +020018`ifdef SIM
19
20`define USE_POWER_PINS
21
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020022`include "defines.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040023`include "pads.v"
24
Tim Edwards4286ae12020-10-11 14:52:01 -040025/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
Tim Edwardsef8312e2020-09-22 17:20:06 -040026
Tim Edwards4286ae12020-10-11 14:52:01 -040027`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
Tim Edwards4c733352020-10-12 16:32:36 -040028`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
Ahmed Ghazy65065c62020-12-01 17:06:16 +020029`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io__gpiov2_pad_wrapped.v"
Tim Edwards4286ae12020-10-11 14:52:01 -040030
31`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
32`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
33`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
34`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040035
manarabdelatya115bdd2020-12-01 11:19:12 +020036`ifdef GL
37 `include "gl/mgmt_core.v"
38`else
39 `include "mgmt_soc.v"
40 `include "housekeeping_spi.v"
41 `include "caravel_clocking.v"
42 `include "mgmt_core.v"
43`endif
44
Tim Edwardsef8312e2020-09-22 17:20:06 -040045`include "digital_pll.v"
Tim Edwards53d92182020-10-11 21:47:40 -040046`include "mgmt_protect.v"
Tim Edwardsbc035512020-11-23 11:16:08 -050047`include "mgmt_protect_hv.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040048`include "mprj_io.v"
49`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040050`include "user_id_programming.v"
Tim Edwardsb86fc842020-10-13 17:11:54 -040051`include "user_project_wrapper.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040052`include "gpio_control_block.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040053`include "clock_div.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040054`include "simple_por.v"
Manar55ec3692020-10-30 16:32:18 +020055`include "storage_bridge_wb.v"
Ahmed Ghazy2517fa82020-11-08 23:34:41 +020056`include "DFFRAM.v"
Manar68e03632020-11-09 13:25:13 +020057`include "DFFRAMBB.v"
Manar55ec3692020-10-30 16:32:18 +020058`include "sram_1rw1r_32_256_8_sky130.v"
59`include "storage.v"
Ahmed Ghazy1d1679d2020-11-30 17:44:45 +020060`include "sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040061
Tim Edwards05537512020-10-06 14:59:26 -040062/*------------------------------*/
63/* Include user project here */
64/*------------------------------*/
Zain Rizwan Khan932a5ef2020-12-07 22:51:22 +000065`include "ghazi/ghazi_top_dffram_csv.v"
66`include "ghazi/ghazi_top.v"
67`include "ghazi/iccm_controller.v"
68`include "ghazi/uart_rx_prog.v"
Tim Edwards05537512020-10-06 14:59:26 -040069
Manar55ec3692020-10-30 16:32:18 +020070// `ifdef USE_OPENRAM
71// `include "sram_1rw1r_32_256_8_sky130.v"
72// `endif
Ahmed Ghazy31c34652020-12-01 19:59:44 +020073`endif
Tim Edwardsef8312e2020-09-22 17:20:06 -040074
75module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040076 inout vddio, // Common 3.3V padframe/ESD power
77 inout vssio, // Common padframe/ESD ground
78 inout vdda, // Management 3.3V power
79 inout vssa, // Common analog ground
80 inout vccd, // Management/Common 1.8V power
81 inout vssd, // Common digital ground
82 inout vdda1, // User area 1 3.3V power
83 inout vdda2, // User area 2 3.3V power
84 inout vssa1, // User area 1 analog ground
85 inout vssa2, // User area 2 analog ground
86 inout vccd1, // User area 1 1.8V power
87 inout vccd2, // User area 2 1.8V power
88 inout vssd1, // User area 1 digital ground
89 inout vssd2, // User area 2 digital ground
90
Tim Edwards04ba17f2020-10-02 22:27:50 -040091 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040092 inout [`MPRJ_IO_PADS-1:0] mprj_io,
Tim Edwardsba328902020-10-27 15:03:22 -040093 output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
Tim Edwardsef8312e2020-09-22 17:20:06 -040094 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040095 input resetb,
96
97 // Note that only two pins are available on the flash so dual and
98 // quad flash modes are not available.
99
Tim Edwardsef8312e2020-09-22 17:20:06 -0400100 output flash_csb,
101 output flash_clk,
102 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -0400103 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -0400104);
105
Tim Edwards04ba17f2020-10-02 22:27:50 -0400106 //------------------------------------------------------------
107 // This value is uniquely defined for each user project.
108 //------------------------------------------------------------
109 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400110
Tim Edwards04ba17f2020-10-02 22:27:50 -0400111 // These pins are overlaid on mprj_io space. They have the function
112 // below when the management processor is in reset, or in the default
113 // configuration. They are assigned to uses in the user space by the
114 // configuration program running off of the SPI flash. Note that even
115 // when the user has taken control of these pins, they can be restored
116 // to the original use by setting the resetb pin low. The SPI pins and
117 // UART pins can be connected directly to an FTDI chip as long as the
118 // FTDI chip sets these lines to high impedence (input function) at
119 // all times except when holding the chip in reset.
120
121 // JTAG = mprj_io[0] (inout)
122 // SDO = mprj_io[1] (output)
123 // SDI = mprj_io[2] (input)
124 // CSB = mprj_io[3] (input)
125 // SCK = mprj_io[4] (input)
126 // ser_rx = mprj_io[5] (input)
127 // ser_tx = mprj_io[6] (output)
128 // irq = mprj_io[7] (input)
129
130 // These pins are reserved for any project that wants to incorporate
131 // its own processor and flash controller. While a user project can
132 // technically use any available I/O pins for the purpose, these
133 // four pins connect to a pass-through mode from the SPI slave (pins
134 // 1-4 above) so that any SPI flash connected to these specific pins
135 // can be accessed through the SPI slave even when the processor is in
136 // reset.
137
Tim Edwards44bab472020-10-04 22:09:54 -0400138 // user_flash_csb = mprj_io[8]
139 // user_flash_sck = mprj_io[9]
140 // user_flash_io0 = mprj_io[10]
141 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400142
143 // One-bit GPIO dedicated to management SoC (outside of user control)
144 wire gpio_out_core;
145 wire gpio_in_core;
146 wire gpio_mode0_core;
147 wire gpio_mode1_core;
148 wire gpio_outenb_core;
149 wire gpio_inenb_core;
150
Tim Edwards6d9739d2020-10-19 11:00:49 -0400151 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400152 wire mprj_io_loader_resetn;
153 wire mprj_io_loader_clock;
154 wire mprj_io_loader_data;
155
Tim Edwardsef8312e2020-09-22 17:20:06 -0400156 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
157 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
158 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400159 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400160 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400161 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
162 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
163 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400164 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
165 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
166 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
167 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
168 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
169 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
170
Tim Edwards6d9739d2020-10-19 11:00:49 -0400171 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400172 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400173 wire [`MPRJ_IO_PADS-1:0] user_io_in;
174 wire [`MPRJ_IO_PADS-1:0] user_io_out;
Tim Edwards581068f2020-11-19 12:45:25 -0500175 wire [`MPRJ_IO_PADS-8:0] user_analog_io;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400176
177 /* Padframe control signals */
178 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
179 wire mgmt_serial_clock;
180 wire mgmt_serial_resetn;
181
Tim Edwards6d9739d2020-10-19 11:00:49 -0400182 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400183 // There are two types of GPIO connections:
184 // (1) Full Bidirectional: Management connects to in, out, and oeb
185 // Uses: JTAG and SDO
186 // (2) Selectable bidirectional: Management connects to in and out,
187 // which are tied together. oeb is grounded (oeb from the
188 // configuration is used)
189
190 // SDI = mprj_io[2] (input)
191 // CSB = mprj_io[3] (input)
192 // SCK = mprj_io[4] (input)
193 // ser_rx = mprj_io[5] (input)
194 // ser_tx = mprj_io[6] (output)
195 // irq = mprj_io[7] (input)
196
197 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200198 wire jtag_out, sdo_out;
199 wire jtag_outenb, sdo_outenb;
Tim Edwards44bab472020-10-04 22:09:54 -0400200
201 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
202 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
203 wire [1:0] mgmt_io_nc2; /* no-connects */
204
Tim Edwards581068f2020-11-19 12:45:25 -0500205 wire clock_core;
206
Tim Edwards04ba17f2020-10-02 22:27:50 -0400207 // Power-on-reset signal. The reset pad generates the sense-inverted
208 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
209 // derived.
210
Tim Edwardsef8312e2020-09-22 17:20:06 -0400211 wire porb_h;
212 wire porb_l;
Tim Edwards581068f2020-11-19 12:45:25 -0500213 wire por_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400214
Tim Edwardsf51dd082020-10-05 16:30:24 -0400215 wire rstb_h;
216 wire rstb_l;
217
Tim Edwards581068f2020-11-19 12:45:25 -0500218 wire flash_clk_core, flash_csb_core;
219 wire flash_clk_oeb_core, flash_csb_oeb_core;
220 wire flash_clk_ieb_core, flash_csb_ieb_core;
221 wire flash_io0_oeb_core, flash_io1_oeb_core;
222 wire flash_io2_oeb_core, flash_io3_oeb_core;
223 wire flash_io0_ieb_core, flash_io1_ieb_core;
224 wire flash_io2_ieb_core, flash_io3_ieb_core;
225 wire flash_io0_do_core, flash_io1_do_core;
226 wire flash_io2_do_core, flash_io3_do_core;
227 wire flash_io0_di_core, flash_io1_di_core;
228 wire flash_io2_di_core, flash_io3_di_core;
229
Tim Edwards44bab472020-10-04 22:09:54 -0400230 // To be considered: Master hold signal on all user pads (?)
231 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
232 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400233 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400234 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
235
Tim Edwardsef8312e2020-09-22 17:20:06 -0400236 chip_io padframe(
237 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400238 .vddio(vddio),
239 .vssio(vssio),
240 .vdda(vdda),
241 .vssa(vssa),
242 .vccd(vccd),
243 .vssd(vssd),
244 .vdda1(vdda1),
245 .vdda2(vdda2),
246 .vssa1(vssa1),
247 .vssa2(vssa2),
248 .vccd1(vccd1),
249 .vccd2(vccd2),
250 .vssd1(vssd1),
251 .vssd2(vssd2),
252
Tim Edwardsef8312e2020-09-22 17:20:06 -0400253 .gpio(gpio),
254 .mprj_io(mprj_io),
255 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400256 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400257 .flash_csb(flash_csb),
258 .flash_clk(flash_clk),
259 .flash_io0(flash_io0),
260 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400261 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400262 .porb_h(porb_h),
Tim Edwards581068f2020-11-19 12:45:25 -0500263 .por(por_l),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400264 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400265 .clock_core(clock_core),
266 .gpio_out_core(gpio_out_core),
267 .gpio_in_core(gpio_in_core),
268 .gpio_mode0_core(gpio_mode0_core),
269 .gpio_mode1_core(gpio_mode1_core),
270 .gpio_outenb_core(gpio_outenb_core),
271 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400272 .flash_csb_core(flash_csb_core),
273 .flash_clk_core(flash_clk_core),
274 .flash_csb_oeb_core(flash_csb_oeb_core),
275 .flash_clk_oeb_core(flash_clk_oeb_core),
276 .flash_io0_oeb_core(flash_io0_oeb_core),
277 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400278 .flash_csb_ieb_core(flash_csb_ieb_core),
279 .flash_clk_ieb_core(flash_clk_ieb_core),
280 .flash_io0_ieb_core(flash_io0_ieb_core),
281 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400282 .flash_io0_do_core(flash_io0_do_core),
283 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400284 .flash_io0_di_core(flash_io0_di_core),
285 .flash_io1_di_core(flash_io1_di_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400286 .mprj_io_in(mprj_io_in),
287 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400288 .mprj_io_oeb(mprj_io_oeb),
Manar14d35ac2020-10-21 22:47:15 +0200289 .mprj_io_hldh_n(mprj_io_hldh_n),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400290 .mprj_io_enh(mprj_io_enh),
Manar14d35ac2020-10-21 22:47:15 +0200291 .mprj_io_inp_dis(mprj_io_inp_dis),
292 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
293 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
294 .mprj_io_slow_sel(mprj_io_slow_sel),
295 .mprj_io_holdover(mprj_io_holdover),
296 .mprj_io_analog_en(mprj_io_analog_en),
297 .mprj_io_analog_sel(mprj_io_analog_sel),
298 .mprj_io_analog_pol(mprj_io_analog_pol),
Tim Edwards581068f2020-11-19 12:45:25 -0500299 .mprj_io_dm(mprj_io_dm),
300 .mprj_analog_io(user_analog_io)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400301 );
302
303 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400304 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400305 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400306 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400307
308 wire [7:0] spi_ro_config_core;
309
310 // LA signals
Tim Edwards43e5c602020-11-19 15:59:50 -0500311 wire [127:0] la_data_in_user; // From CPU to MPRJ
312 wire [127:0] la_data_in_mprj; // From MPRJ to CPU
Tim Edwardsef8312e2020-09-22 17:20:06 -0400313 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
Tim Edwards43e5c602020-11-19 15:59:50 -0500314 wire [127:0] la_data_out_user; // From MPRJ to CPU
315 wire [127:0] la_oen_user; // From CPU to MPRJ
316 wire [127:0] la_oen_mprj; // From CPU to MPRJ
317
Tim Edwards6d9739d2020-10-19 11:00:49 -0400318 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400319 wire mprj_cyc_o_core;
320 wire mprj_stb_o_core;
321 wire mprj_we_o_core;
322 wire [3:0] mprj_sel_o_core;
323 wire [31:0] mprj_adr_o_core;
324 wire [31:0] mprj_dat_o_core;
325 wire mprj_ack_i_core;
326 wire [31:0] mprj_dat_i_core;
327
328 // WB MI B (xbar)
329 wire xbar_cyc_o_core;
330 wire xbar_stb_o_core;
331 wire xbar_we_o_core;
332 wire [3:0] xbar_sel_o_core;
333 wire [31:0] xbar_adr_o_core;
334 wire [31:0] xbar_dat_o_core;
335 wire xbar_ack_i_core;
336 wire [31:0] xbar_dat_i_core;
337
Tim Edwards04ba17f2020-10-02 22:27:50 -0400338 // Mask revision
339 wire [31:0] mask_rev;
340
Manar14d35ac2020-10-21 22:47:15 +0200341 wire mprj_clock;
342 wire mprj_clock2;
343 wire mprj_resetn;
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200344 wire mprj_reset;
Manar14d35ac2020-10-21 22:47:15 +0200345 wire mprj_cyc_o_user;
346 wire mprj_stb_o_user;
347 wire mprj_we_o_user;
348 wire [3:0] mprj_sel_o_user;
349 wire [31:0] mprj_adr_o_user;
350 wire [31:0] mprj_dat_o_user;
351 wire mprj_vcc_pwrgood;
352 wire mprj2_vcc_pwrgood;
353 wire mprj_vdd_pwrgood;
354 wire mprj2_vdd_pwrgood;
355
Manar55ec3692020-10-30 16:32:18 +0200356 // Storage area
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200357 // Management R/W interface
358 wire [`RAM_BLOCKS-1:0] mgmt_ena;
Manarffe6cad2020-11-09 19:09:04 +0200359 wire [`RAM_BLOCKS-1:0] mgmt_wen;
360 wire [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask;
Manar55ec3692020-10-30 16:32:18 +0200361 wire [7:0] mgmt_addr;
362 wire [31:0] mgmt_wdata;
Manarffe6cad2020-11-09 19:09:04 +0200363 wire [(`RAM_BLOCKS*32)-1:0] mgmt_rdata;
Manar55ec3692020-10-30 16:32:18 +0200364 // Management RO interface
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200365 wire mgmt_ena_ro;
Manarffe6cad2020-11-09 19:09:04 +0200366 wire [7:0] mgmt_addr_ro;
367 wire [31:0] mgmt_rdata_ro;
Manar55ec3692020-10-30 16:32:18 +0200368
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200369 mgmt_core soc (
Manar61dce922020-11-10 19:26:28 +0200370 `ifdef USE_POWER_PINS
manarabdelatya115bdd2020-12-01 11:19:12 +0200371 .VPWR(vccd),
372 .VGND(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400373 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400374 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400375 .gpio_out_pad(gpio_out_core),
376 .gpio_in_pad(gpio_in_core),
377 .gpio_mode0_pad(gpio_mode0_core),
378 .gpio_mode1_pad(gpio_mode1_core),
379 .gpio_outenb_pad(gpio_outenb_core),
380 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400381 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400382 .flash_csb(flash_csb_core),
383 .flash_clk(flash_clk_core),
384 .flash_csb_oeb(flash_csb_oeb_core),
385 .flash_clk_oeb(flash_clk_oeb_core),
386 .flash_io0_oeb(flash_io0_oeb_core),
387 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400388 .flash_csb_ieb(flash_csb_ieb_core),
389 .flash_clk_ieb(flash_clk_ieb_core),
390 .flash_io0_ieb(flash_io0_ieb_core),
391 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400392 .flash_io0_do(flash_io0_do_core),
393 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400394 .flash_io0_di(flash_io0_di_core),
395 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400396 // Master Reset
397 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400398 .porb(porb_l),
399 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400400 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400401 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400402 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400403 .core_rstn(caravel_rstn),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200404 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500405 .la_input(la_data_in_mprj),
406 .la_output(la_data_out_mprj),
407 .la_oen(la_oen_mprj),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400408 // User Project IO Control
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400409 .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
410 .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
411 .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
412 .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400413 .mprj_io_loader_resetn(mprj_io_loader_resetn),
414 .mprj_io_loader_clock(mprj_io_loader_clock),
415 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400416 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400417 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwardsba328902020-10-27 15:03:22 -0400418 .pwr_ctrl_out(pwr_ctrl_out),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400419 .sdo_out(sdo_out),
420 .sdo_outenb(sdo_outenb),
421 .jtag_out(jtag_out),
422 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400423 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400424 .mprj_cyc_o(mprj_cyc_o_core),
425 .mprj_stb_o(mprj_stb_o_core),
426 .mprj_we_o(mprj_we_o_core),
427 .mprj_sel_o(mprj_sel_o_core),
428 .mprj_adr_o(mprj_adr_o_core),
429 .mprj_dat_o(mprj_dat_o_core),
430 .mprj_ack_i(mprj_ack_i_core),
431 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400432 // mask data
Manar55ec3692020-10-30 16:32:18 +0200433 .mask_rev(mask_rev),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200434 // MGMT area R/W interface
435 .mgmt_ena(mgmt_ena),
Manar55ec3692020-10-30 16:32:18 +0200436 .mgmt_wen_mask(mgmt_wen_mask),
437 .mgmt_wen(mgmt_wen),
438 .mgmt_addr(mgmt_addr),
439 .mgmt_wdata(mgmt_wdata),
440 .mgmt_rdata(mgmt_rdata),
Manarffe6cad2020-11-09 19:09:04 +0200441 // MGMT area RO interface
442 .mgmt_ena_ro(mgmt_ena_ro),
443 .mgmt_addr_ro(mgmt_addr_ro),
444 .mgmt_rdata_ro(mgmt_rdata_ro)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400445 );
446
Tim Edwards53d92182020-10-11 21:47:40 -0400447 /* Clock and reset to user space are passed through a tristate */
448 /* buffer like the above, but since they are intended to be */
449 /* always active, connect the enable to the logic-1 output from */
450 /* the vccd1 domain. */
451
Tim Edwards53d92182020-10-11 21:47:40 -0400452 mgmt_protect mgmt_buffers (
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200453 `ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400454 .vccd(vccd),
455 .vssd(vssd),
456 .vccd1(vccd1),
457 .vssd1(vssd1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400458 .vdda1(vdda1),
459 .vssa1(vssa1),
460 .vdda2(vdda2),
461 .vssa2(vssa2),
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200462 `endif
Tim Edwards21a9aac2020-10-12 22:05:18 -0400463
Tim Edwards53d92182020-10-11 21:47:40 -0400464 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400465 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400466 .caravel_rstn(caravel_rstn),
467 .mprj_cyc_o_core(mprj_cyc_o_core),
468 .mprj_stb_o_core(mprj_stb_o_core),
469 .mprj_we_o_core(mprj_we_o_core),
470 .mprj_sel_o_core(mprj_sel_o_core),
471 .mprj_adr_o_core(mprj_adr_o_core),
472 .mprj_dat_o_core(mprj_dat_o_core),
Tim Edwards43e5c602020-11-19 15:59:50 -0500473 .la_data_out_core(la_data_out_user),
474 .la_data_out_mprj(la_data_out_mprj),
475 .la_data_in_core(la_data_in_user),
476 .la_data_in_mprj(la_data_in_mprj),
477 .la_oen_mprj(la_oen_mprj),
478 .la_oen_core(la_oen_user),
Tim Edwards53d92182020-10-11 21:47:40 -0400479
480 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400481 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400482 .user_resetn(mprj_resetn),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200483 .user_reset(mprj_reset),
Tim Edwards53d92182020-10-11 21:47:40 -0400484 .mprj_cyc_o_user(mprj_cyc_o_user),
485 .mprj_stb_o_user(mprj_stb_o_user),
486 .mprj_we_o_user(mprj_we_o_user),
487 .mprj_sel_o_user(mprj_sel_o_user),
488 .mprj_adr_o_user(mprj_adr_o_user),
489 .mprj_dat_o_user(mprj_dat_o_user),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400490 .user1_vcc_powergood(mprj_vcc_pwrgood),
491 .user2_vcc_powergood(mprj2_vcc_pwrgood),
492 .user1_vdd_powergood(mprj_vdd_pwrgood),
493 .user2_vdd_powergood(mprj2_vdd_pwrgood)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400494 );
Tim Edwards53d92182020-10-11 21:47:40 -0400495
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200496
Tim Edwardsb86fc842020-10-13 17:11:54 -0400497 /*----------------------------------------------*/
498 /* Wrapper module around the user project */
499 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400500
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200501 user_project_wrapper mprj (
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200502 `ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400503 .vdda1(vdda1), // User area 1 3.3V power
504 .vdda2(vdda2), // User area 2 3.3V power
505 .vssa1(vssa1), // User area 1 analog ground
506 .vssa2(vssa2), // User area 2 analog ground
507 .vccd1(vccd1), // User area 1 1.8V power
508 .vccd2(vccd2), // User area 2 1.8V power
509 .vssd1(vssd1), // User area 1 digital ground
510 .vssd2(vssd2), // User area 2 digital ground
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200511 `endif
Tim Edwards21a9aac2020-10-12 22:05:18 -0400512
Tim Edwards53d92182020-10-11 21:47:40 -0400513 .wb_clk_i(mprj_clock),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200514 .wb_rst_i(mprj_reset),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200515 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400516 .wbs_cyc_i(mprj_cyc_o_user),
517 .wbs_stb_i(mprj_stb_o_user),
518 .wbs_we_i(mprj_we_o_user),
519 .wbs_sel_i(mprj_sel_o_user),
520 .wbs_adr_i(mprj_adr_o_user),
521 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400522 .wbs_ack_o(mprj_ack_i_core),
523 .wbs_dat_o(mprj_dat_i_core),
524 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500525 .la_data_in(la_data_in_user),
526 .la_data_out(la_data_out_user),
527 .la_oen(la_oen_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400528 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400529 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400530 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400531 .io_oeb(user_io_oeb),
Tim Edwards581068f2020-11-19 12:45:25 -0500532 .analog_io(user_analog_io),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400533 // Independent clock
534 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400535 );
536
Tim Edwards05537512020-10-06 14:59:26 -0400537 /*--------------------------------------*/
538 /* End user project instantiation */
539 /*--------------------------------------*/
540
Tim Edwards04ba17f2020-10-02 22:27:50 -0400541 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
542
Tim Edwards251e0df2020-10-05 11:02:12 -0400543 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400544
Tim Edwards251e0df2020-10-05 11:02:12 -0400545 // Each control block sits next to an I/O pad in the user area.
546 // It gets input through a serial chain from the previous control
547 // block and passes it to the next control block. Due to the nature
548 // of the shift register, bits are presented in reverse, as the first
549 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400550
Tim Edwards89f09242020-10-05 15:17:34 -0400551 // There are two types of block; the first two are configured to be
552 // full bidirectional under control of the management Soc (JTAG and
553 // SDO). The rest are configured to be default (input).
554
Tim Edwards251e0df2020-10-05 11:02:12 -0400555 gpio_control_block #(
manarabdelaty589a5282020-12-05 01:06:48 +0200556 .DM_INIT(`DM_INIT), // Mode = output, strong up/down
557 .OENB_INIT(`OENB_INIT) // Enable output signaling from wire
Tim Edwards89f09242020-10-05 15:17:34 -0400558 ) gpio_control_bidir [1:0] (
Manar61dce922020-11-10 19:26:28 +0200559 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200560 .vccd(vccd),
561 .vssd(vssd),
562 .vccd1(vccd1),
563 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400564 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400565
Tim Edwards04ba17f2020-10-02 22:27:50 -0400566 // Management Soc-facing signals
567
Tim Edwardsc18c4742020-10-03 11:26:39 -0400568 .resetn(mprj_io_loader_resetn),
569 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400570
Tim Edwards89f09242020-10-05 15:17:34 -0400571 .mgmt_gpio_in(mgmt_io_in[1:0]),
572 .mgmt_gpio_out({sdo_out, jtag_out}),
573 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400574
575 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400576 .serial_data_in(gpio_serial_link_shifted[1:0]),
577 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400578
579 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400580 .user_gpio_out(user_io_out[1:0]),
581 .user_gpio_oeb(user_io_oeb[1:0]),
582 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400583
584 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400585 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
586 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
587 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
588 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
589 .pad_gpio_holdover(mprj_io_holdover[1:0]),
590 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
591 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
592 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
593 .pad_gpio_dm(mprj_io_dm[5:0]),
594 .pad_gpio_outenb(mprj_io_oeb[1:0]),
595 .pad_gpio_out(mprj_io_out[1:0]),
596 .pad_gpio_in(mprj_io_in[1:0])
597 );
598
599 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Manar61dce922020-11-10 19:26:28 +0200600 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200601 .vccd(vccd),
602 .vssd(vssd),
603 .vccd1(vccd1),
604 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400605 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400606
607 // Management Soc-facing signals
608
609 .resetn(mprj_io_loader_resetn),
610 .serial_clock(mprj_io_loader_clock),
611
612 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
613 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
614 .mgmt_gpio_oeb(1'b1),
615
616 // Serial data chain for pad configuration
617 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
618 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
619
620 // User-facing signals
621 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
622 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
623 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
624
625 // Pad-facing signals (Pad GPIOv2)
626 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
627 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
628 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
629 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
630 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
631 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
632 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
633 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
634 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
635 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
636 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
637 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400638 );
639
Tim Edwards04ba17f2020-10-02 22:27:50 -0400640 user_id_programming #(
641 .USER_PROJECT_ID(USER_PROJECT_ID)
642 ) user_id_value (
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200643`ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400644 .vdd1v8(vccd),
645 .vss(vssd),
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200646`endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400647 .mask_rev(mask_rev)
648 );
649
Tim Edwardsf51dd082020-10-05 16:30:24 -0400650 // Power-on-reset circuit
651 simple_por por (
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200652`ifdef USE_POWER_PINS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400653 .vdd3v3(vddio),
Tim Edwards581068f2020-11-19 12:45:25 -0500654 .vdd1v8(vccd),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400655 .vss(vssio),
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200656`endif
Tim Edwards581068f2020-11-19 12:45:25 -0500657 .porb_h(porb_h),
658 .porb_l(porb_l),
659 .por_l(por_l)
Tim Edwardsf51dd082020-10-05 16:30:24 -0400660 );
661
662 // XRES (chip input pin reset) reset level converter
Ahmed Ghazy1d1679d2020-11-30 17:44:45 +0200663 sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped rstb_level (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200664`ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400665 .VPWR(vddio),
666 .VPB(vddio),
667 .LVPWR(vccd),
668 .VNB(vssio),
669 .VGND(vssio),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200670`endif
Tim Edwardsf51dd082020-10-05 16:30:24 -0400671 .A(rstb_h),
672 .X(rstb_l)
673 );
674
Manar55ec3692020-10-30 16:32:18 +0200675 // Storage area
Manarffe6cad2020-11-09 19:09:04 +0200676 storage storage(
Manar55ec3692020-10-30 16:32:18 +0200677 .mgmt_clk(caravel_clk),
678 .mgmt_ena(mgmt_ena),
679 .mgmt_wen(mgmt_wen),
680 .mgmt_wen_mask(mgmt_wen_mask),
681 .mgmt_addr(mgmt_addr),
682 .mgmt_wdata(mgmt_wdata),
683 .mgmt_rdata(mgmt_rdata),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200684 // Management RO interface
Manarffe6cad2020-11-09 19:09:04 +0200685 .mgmt_ena_ro(mgmt_ena_ro),
686 .mgmt_addr_ro(mgmt_addr_ro),
687 .mgmt_rdata_ro(mgmt_rdata_ro)
Manar55ec3692020-10-30 16:32:18 +0200688 );
689
Tim Edwardsef8312e2020-09-22 17:20:06 -0400690endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500691// `default_nettype wire