blob: beced01ea0eed3dbd3ff99de3cd7313b85e340f2 [file] [log] [blame]
Tim Edwardsef8312e2020-09-22 17:20:06 -04001/*--------------------------------------------------------------*/
2/* caravel, a project harness for the Google/SkyWater sky130 */
3/* fabrication process and open source PDK */
4/* */
5/* Copyright 2020 efabless, Inc. */
6/* Written by Tim Edwards, December 2019 */
7/* and Mohamed Shalan, August 2020 */
8/* This file is open source hardware released under the */
9/* Apache 2.0 license. See file LICENSE. */
10/* */
11/*--------------------------------------------------------------*/
12
13`timescale 1 ns / 1 ps
14
15`define USE_OPENRAM
16`define USE_PG_PIN
17`define functional
Tim Edwardsc5265b82020-09-25 17:08:59 -040018`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040019
20`define MPRJ_IO_PADS 32
21
22`include "pads.v"
23
24/* To be removed when sky130_fd_io is available */
25// `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/s8iom0s8.v"
26// `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/power_pads_lib.v"
27// `include "/ef/tech/SW/sky130A/libs.ref/verilog/sky130_fd_sc_hd/sky130_fd_sc_hd.v"
28// `include "/ef/tech/SW/sky130A/libs.ref/verilog/sky130_fd_sc_hvl/sky130_fd_sc_hvl.v"
29
30/* Local only, please remove */
31// `include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
32// `include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_io/verilog/power_pads_lib.v"
33`include "/home/tim/projects/efabless/tech/SW/EFS8A/libs.ref/s8iom0s8/verilog/s8iom0s8.v"
Tim Edwardsc5265b82020-09-25 17:08:59 -040034// `include "/home/tim/projects/efabless/tech/SW/EFS8A/libs.ref/s8iom0s8/verilog/power_pads_lib.v"
35`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
36`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
37`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
38`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040039
40`include "mgmt_soc.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040041`include "caravel_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040042`include "digital_pll.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040043`include "caravel_clkrst.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040044`include "mprj_counter.v"
45`include "mgmt_core.v"
46`include "mprj_io.v"
47`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040048`include "user_id_programming.v"
49`include "gpio_control_block.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040050
51`ifdef USE_OPENRAM
52 `include "sram_1rw1r_32_8192_8_sky130.v"
53`endif
54
55module caravel (
56 inout vdd3v3,
57 inout vdd1v8,
58 inout vss,
Tim Edwards04ba17f2020-10-02 22:27:50 -040059 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040060 inout [`MPRJ_IO_PADS-1:0] mprj_io,
61 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040062 input resetb,
63
64 // Note that only two pins are available on the flash so dual and
65 // quad flash modes are not available.
66
Tim Edwardsef8312e2020-09-22 17:20:06 -040067 output flash_csb,
68 output flash_clk,
69 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040070 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040071);
72
Tim Edwards04ba17f2020-10-02 22:27:50 -040073 //------------------------------------------------------------
74 // This value is uniquely defined for each user project.
75 //------------------------------------------------------------
76 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040077
Tim Edwards04ba17f2020-10-02 22:27:50 -040078 // These pins are overlaid on mprj_io space. They have the function
79 // below when the management processor is in reset, or in the default
80 // configuration. They are assigned to uses in the user space by the
81 // configuration program running off of the SPI flash. Note that even
82 // when the user has taken control of these pins, they can be restored
83 // to the original use by setting the resetb pin low. The SPI pins and
84 // UART pins can be connected directly to an FTDI chip as long as the
85 // FTDI chip sets these lines to high impedence (input function) at
86 // all times except when holding the chip in reset.
87
88 // JTAG = mprj_io[0] (inout)
89 // SDO = mprj_io[1] (output)
90 // SDI = mprj_io[2] (input)
91 // CSB = mprj_io[3] (input)
92 // SCK = mprj_io[4] (input)
93 // ser_rx = mprj_io[5] (input)
94 // ser_tx = mprj_io[6] (output)
95 // irq = mprj_io[7] (input)
96
97 // These pins are reserved for any project that wants to incorporate
98 // its own processor and flash controller. While a user project can
99 // technically use any available I/O pins for the purpose, these
100 // four pins connect to a pass-through mode from the SPI slave (pins
101 // 1-4 above) so that any SPI flash connected to these specific pins
102 // can be accessed through the SPI slave even when the processor is in
103 // reset.
104
105 // flash_csb = mprj_io[8]
106 // flash_sck = mprj_io[9]
107 // flash_io0 = mprj_io[10]
108 // flash_io1 = mprj_io[11]
109
110 // One-bit GPIO dedicated to management SoC (outside of user control)
111 wire gpio_out_core;
112 wire gpio_in_core;
113 wire gpio_mode0_core;
114 wire gpio_mode1_core;
115 wire gpio_outenb_core;
116 wire gpio_inenb_core;
117
118 // Mega-Project Control (pad-facing)
119 wire [`MPRJ_IO_PADS-1:0] mgmt_io_data;
120 wire mprj_io_loader_resetn;
121 wire mprj_io_loader_clock;
122 wire mprj_io_loader_data;
123
Tim Edwardsef8312e2020-09-22 17:20:06 -0400124 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
125 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
126 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400127 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb_n;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400128 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400129 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
130 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
131 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400132 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
133 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
134 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
135 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
136 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
137 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
138
Tim Edwards04ba17f2020-10-02 22:27:50 -0400139 // Mega-Project Control (user-facing)
140 wire [`MPRJ_IO_PADS-1:0] user_io_oeb_n;
141 wire [`MPRJ_IO_PADS-1:0] user_io_in;
142 wire [`MPRJ_IO_PADS-1:0] user_io_out;
143
144 /* Padframe control signals */
145 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
146 wire mgmt_serial_clock;
147 wire mgmt_serial_resetn;
148
149 // Power-on-reset signal. The reset pad generates the sense-inverted
150 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
151 // derived.
152
Tim Edwardsef8312e2020-09-22 17:20:06 -0400153 wire porb_h;
154 wire porb_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400155
156 chip_io padframe(
157 // Package Pins
158 .vdd3v3(vdd3v3),
159 .vdd1v8(vdd1v8),
160 .vss(vss),
161 .gpio(gpio),
162 .mprj_io(mprj_io),
163 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400164 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400165 .flash_csb(flash_csb),
166 .flash_clk(flash_clk),
167 .flash_io0(flash_io0),
168 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400169 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400170 .porb_h(porb_h),
171 .clock_core(clock_core),
172 .gpio_out_core(gpio_out_core),
173 .gpio_in_core(gpio_in_core),
174 .gpio_mode0_core(gpio_mode0_core),
175 .gpio_mode1_core(gpio_mode1_core),
176 .gpio_outenb_core(gpio_outenb_core),
177 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400178 .flash_csb_core(flash_csb_core),
179 .flash_clk_core(flash_clk_core),
180 .flash_csb_oeb_core(flash_csb_oeb_core),
181 .flash_clk_oeb_core(flash_clk_oeb_core),
182 .flash_io0_oeb_core(flash_io0_oeb_core),
183 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400184 .flash_csb_ieb_core(flash_csb_ieb_core),
185 .flash_clk_ieb_core(flash_clk_ieb_core),
186 .flash_io0_ieb_core(flash_io0_ieb_core),
187 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400188 .flash_io0_do_core(flash_io0_do_core),
189 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400190 .flash_io0_di_core(flash_io0_di_core),
191 .flash_io1_di_core(flash_io1_di_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400192 .pll_clk16(pll_clk16),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400193 .mprj_io_in(mprj_io_in),
194 .mprj_io_out(mprj_io_out),
195 .mprj_io_oeb_n(mprj_io_oeb_n),
196 .mprj_io_hldh_n(mprj_io_hldh_n),
197 .mprj_io_enh(mprj_io_enh),
198 .mprj_io_inp_dis(mprj_io_inp_dis),
199 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400200 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
201 .mprj_io_slow_sel(mprj_io_slow_sel),
202 .mprj_io_holdover(mprj_io_holdover),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400203 .mprj_io_analog_en(mprj_io_analog_en),
204 .mprj_io_analog_sel(mprj_io_analog_sel),
205 .mprj_io_analog_pol(mprj_io_analog_pol),
206 .mprj_io_dm(mprj_io_dm)
207 );
208
209 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400210 wire caravel_clk;
211 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400212
213 wire [7:0] spi_ro_config_core;
214
215 // LA signals
216 wire [127:0] la_output_core; // From CPU to MPRJ
217 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
218 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
219 wire [127:0] la_output_mprj; // From MPRJ to CPU
220 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
221
222 // WB MI A (Mega Project)
223 wire mprj_cyc_o_core;
224 wire mprj_stb_o_core;
225 wire mprj_we_o_core;
226 wire [3:0] mprj_sel_o_core;
227 wire [31:0] mprj_adr_o_core;
228 wire [31:0] mprj_dat_o_core;
229 wire mprj_ack_i_core;
230 wire [31:0] mprj_dat_i_core;
231
232 // WB MI B (xbar)
233 wire xbar_cyc_o_core;
234 wire xbar_stb_o_core;
235 wire xbar_we_o_core;
236 wire [3:0] xbar_sel_o_core;
237 wire [31:0] xbar_adr_o_core;
238 wire [31:0] xbar_dat_o_core;
239 wire xbar_ack_i_core;
240 wire [31:0] xbar_dat_i_core;
241
Tim Edwards04ba17f2020-10-02 22:27:50 -0400242 // Mask revision
243 wire [31:0] mask_rev;
244
Tim Edwardsef8312e2020-09-22 17:20:06 -0400245 mgmt_core soc (
246 `ifdef LVS
247 .vdd1v8(vdd1v8),
248 .vss(vss),
249 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400250 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400251 .gpio_out_pad(gpio_out_core),
252 .gpio_in_pad(gpio_in_core),
253 .gpio_mode0_pad(gpio_mode0_core),
254 .gpio_mode1_pad(gpio_mode1_core),
255 .gpio_outenb_pad(gpio_outenb_core),
256 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400257 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400258 .flash_csb(flash_csb_core),
259 .flash_clk(flash_clk_core),
260 .flash_csb_oeb(flash_csb_oeb_core),
261 .flash_clk_oeb(flash_clk_oeb_core),
262 .flash_io0_oeb(flash_io0_oeb_core),
263 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400264 .flash_csb_ieb(flash_csb_ieb_core),
265 .flash_clk_ieb(flash_clk_ieb_core),
266 .flash_io0_ieb(flash_io0_ieb_core),
267 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400268 .flash_io0_do(flash_io0_do_core),
269 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400270 .flash_io0_di(flash_io0_di_core),
271 .flash_io1_di(flash_io1_di_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400272 // Power-on Reset
273 .porb(porb_l),
274 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400275 .clock(clock_core),
276 .pll_clk16(pll_clk16),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400277 .core_clk(caravel_clk),
278 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400279 // Logic Analyzer
280 .la_input(la_data_out_mprj),
281 .la_output(la_output_core),
282 .la_oen(la_oen),
283 // Mega Project IO Control
Tim Edwards04ba17f2020-10-02 22:27:50 -0400284 .mprj_io_loader_resetn(mprj_io_loader_resetn),
285 .mprj_io_loader_clock(mprj_io_loader_clock),
286 .mprj_io_loader_data(mprj_io_loader_data),
287 .mgmt_io_data(mgmt_io_data),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400288 // Mega Project Slave ports (WB MI A)
289 .mprj_cyc_o(mprj_cyc_o_core),
290 .mprj_stb_o(mprj_stb_o_core),
291 .mprj_we_o(mprj_we_o_core),
292 .mprj_sel_o(mprj_sel_o_core),
293 .mprj_adr_o(mprj_adr_o_core),
294 .mprj_dat_o(mprj_dat_o_core),
295 .mprj_ack_i(mprj_ack_i_core),
296 .mprj_dat_i(mprj_dat_i_core),
297 // Xbar Switch (WB MI B)
298 .xbar_cyc_o(xbar_cyc_o_core),
299 .xbar_stb_o(xbar_stb_o_core),
300 .xbar_we_o (xbar_we_o_core),
301 .xbar_sel_o(xbar_sel_o_core),
302 .xbar_adr_o(xbar_adr_o_core),
303 .xbar_dat_o(xbar_dat_o_core),
304 .xbar_ack_i(xbar_ack_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400305 .xbar_dat_i(xbar_dat_i_core),
306 // mask data
307 .mask_rev(mask_rev)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400308 );
309
Tim Edwards04ba17f2020-10-02 22:27:50 -0400310 sky130_fd_sc_hd__ebufn_8 la_buf [127:0] (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400311 .Z(la_data_in_mprj),
312 .A(la_output_core),
Tim Edwardsc5265b82020-09-25 17:08:59 -0400313 .TE_B(la_oen)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400314 );
315
316 mega_project mprj (
Tim Edwards04ba17f2020-10-02 22:27:50 -0400317 .wb_clk_i(caravel_clk),
318 .wb_rst_i(!caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400319 // MGMT SoC Wishbone Slave
320 .wbs_cyc_i(mprj_cyc_o_core),
321 .wbs_stb_i(mprj_stb_o_core),
322 .wbs_we_i(mprj_we_o_core),
323 .wbs_sel_i(mprj_sel_o_core),
324 .wbs_adr_i(mprj_adr_o_core),
325 .wbs_dat_i(mprj_dat_o_core),
326 .wbs_ack_o(mprj_ack_i_core),
327 .wbs_dat_o(mprj_dat_i_core),
328 // Logic Analyzer
329 .la_data_in(la_data_in_mprj),
330 .la_data_out(la_data_out_mprj),
331 .la_oen (la_oen),
332 // IO Pads
333 .io_out(mprj_io_out),
334 .io_in (mprj_io_in)
335 );
336
Tim Edwards04ba17f2020-10-02 22:27:50 -0400337 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
338
339 assign gpio_serial_link_shifted = {mprj_io_loader_data, gpio_serial_link[`MPRJ_IO_PADS-1:1]};
340
341 gpio_control_block gpio_control_inst [`MPRJ_IO_PADS-1:0] (
342 // Management Soc-facing signals
343
344 resetn(mprj_io_loader_resetn),
345 serial_clock(mprj_io_loader_clock),
346
347 mgmt_gpio_io(mgmt_io_data),
348
349 // Serial data chain for pad configuration
350 serial_data_in(gpio_serial_link_shifted),
351 serial_data_out(gpio_serial_link),
352
353 // User-facing signals
354 user_gpio_out(user_io_out),
355 user_gpio_outenb(user_io_oeb_n),
356 user_gpio_in(user_io_in),
357
358 // Pad-facing signals (Pad GPIOv2)
359 pad_gpio_holdover(mprj_io_hldh_n),
360 pad_gpio_slow(mprj_io_slow),
361 pad_gpio_vtrip_sel(mprj_io_vtrip_sel),
362 pad_gpio_inenb(mprj_io_inp_dis),
363 pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel),
364 pad_gpio_vtrip_sel(mprj_io_vtrip_sel),
365 pad_gpio_slow_sel(mprj_io_slow_sel),
366 pad_gpio_holdover(mprj_io_holdover),
367 pad_gpio_ana_en(mprj_io_analog_en),
368 pad_gpio_ana_sel(mprj_io_analog_sel),
369 pad_gpio_ana_pol(mprj_io_analog_pol),
370 pad_gpio_dm(mprj_io_dm),
371 pad_gpio_outenb(mprj_io_oen_n),
372 pad_gpio_out(mprj_io_out),
373 pad_gpio_in(mprj_io_in)
374 );
375
Tim Edwardsc5265b82020-09-25 17:08:59 -0400376 sky130_fd_sc_hvl__lsbufhv2lv levelshift (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400377 `ifdef LVS
378 .vpwr(vdd3v3),
379 .vpb(vdd3v3),
380 .lvpwr(vdd1v8),
381 .vnb(vss),
382 .vgnd(vss),
383 `endif
384 .A(porb_h),
385 .X(porb_l)
386 );
387
Tim Edwards04ba17f2020-10-02 22:27:50 -0400388 user_id_programming #(
389 .USER_PROJECT_ID(USER_PROJECT_ID)
390 ) user_id_value (
391 .mask_rev(mask_rev)
392 );
393
Tim Edwardsef8312e2020-09-22 17:20:06 -0400394endmodule