blob: 16d7d7da24067a4661b19b12b3485dd569c36734 [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"
41`include "striVe_spi.v"
42`include "digital_pll.v"
43`include "striVe_clkrst.v"
44`include "mprj_counter.v"
45`include "mgmt_core.v"
46`include "mprj_io.v"
47`include "chip_io.v"
48
49`ifdef USE_OPENRAM
50 `include "sram_1rw1r_32_8192_8_sky130.v"
51`endif
52
53module caravel (
54 inout vdd3v3,
55 inout vdd1v8,
56 inout vss,
57 inout [1:0] gpio, // Local digital only for management area
58 inout [`MPRJ_IO_PADS-1:0] mprj_io,
59 input clock, // CMOS core clock input, not a crystal
60 input RSTB,
61 input ser_rx,
62 output ser_tx,
63 input irq,
64 output SDO,
65 input SDI,
66 input CSB,
67 input SCK,
68 output flash_csb,
69 output flash_clk,
70 output flash_io0,
71 output flash_io1,
72 output flash_io2,
73 output flash_io3
74);
75
76 wire [1:0] gpio_out_core;
77 wire [1:0] gpio_in_core;
78 wire [1:0] gpio_mode0_core;
79 wire [1:0] gpio_mode1_core;
80 wire [1:0] gpio_outenb_core;
81 wire [1:0] gpio_inenb_core;
82
83 // Mega-Project Control
84 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb_n;
85 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
86 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
87 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
88 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
89 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
90 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
91 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
92 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
93 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
94 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
95
96 wire porb_h;
97 wire porb_l;
98 wire por;
99 wire SCK_core;
100 wire SDI_core;
101 wire CSB_core;
102 wire SDO_core;
103 wire SDO_enb;
104
105 chip_io padframe(
106 // Package Pins
107 .vdd3v3(vdd3v3),
108 .vdd1v8(vdd1v8),
109 .vss(vss),
110 .gpio(gpio),
111 .mprj_io(mprj_io),
112 .clock(clock),
113 .RSTB(RSTB),
114 .ser_rx(ser_rx),
115 .ser_tx(ser_tx),
116 .irq(irq),
117 .SDO(SDO),
118 .SDI(SDI),
119 .CSB(CSB),
120 .SCK(SCK),
121 .flash_csb(flash_csb),
122 .flash_clk(flash_clk),
123 .flash_io0(flash_io0),
124 .flash_io1(flash_io1),
125 .flash_io2(flash_io2),
126 .flash_io3(flash_io3),
127 // SoC Core Interface
128 .por(por),
129 .porb_h(porb_h),
130 .clock_core(clock_core),
131 .gpio_out_core(gpio_out_core),
132 .gpio_in_core(gpio_in_core),
133 .gpio_mode0_core(gpio_mode0_core),
134 .gpio_mode1_core(gpio_mode1_core),
135 .gpio_outenb_core(gpio_outenb_core),
136 .gpio_inenb_core(gpio_inenb_core),
137 .SCK_core(SCK_core),
138 .ser_rx_core(ser_rx_core),
139 .ser_tx_core(ser_tx_core),
140 .irq_pin_core(irq_pin_core),
141 .flash_csb_core(flash_csb_core),
142 .flash_clk_core(flash_clk_core),
143 .flash_csb_oeb_core(flash_csb_oeb_core),
144 .flash_clk_oeb_core(flash_clk_oeb_core),
145 .flash_io0_oeb_core(flash_io0_oeb_core),
146 .flash_io1_oeb_core(flash_io1_oeb_core),
147 .flash_io2_oeb_core(flash_io2_oeb_core),
148 .flash_io3_oeb_core(flash_io3_oeb_core),
149 .flash_csb_ieb_core(flash_csb_ieb_core),
150 .flash_clk_ieb_core(flash_clk_ieb_core),
151 .flash_io0_ieb_core(flash_io0_ieb_core),
152 .flash_io1_ieb_core(flash_io1_ieb_core),
153 .flash_io2_ieb_core(flash_io2_ieb_core),
154 .flash_io3_ieb_core(flash_io3_ieb_core),
155 .flash_io0_do_core(flash_io0_do_core),
156 .flash_io1_do_core(flash_io1_do_core),
157 .flash_io2_do_core(flash_io2_do_core),
158 .flash_io3_do_core(flash_io3_do_core),
159 .flash_io0_di_core(flash_io0_di_core),
160 .flash_io1_di_core(flash_io1_di_core),
161 .flash_io2_di_core(flash_io2_di_core),
162 .flash_io3_di_core(flash_io3_di_core),
163 .SDI_core(SDI_core),
164 .CSB_core(CSB_core),
165 .pll_clk16(pll_clk16),
166 .SDO_core(SDO_core),
167 .mprj_io_in(mprj_io_in),
168 .mprj_io_out(mprj_io_out),
169 .mprj_io_oeb_n(mprj_io_oeb_n),
170 .mprj_io_hldh_n(mprj_io_hldh_n),
171 .mprj_io_enh(mprj_io_enh),
172 .mprj_io_inp_dis(mprj_io_inp_dis),
173 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
174 .mprj_io_analog_en(mprj_io_analog_en),
175 .mprj_io_analog_sel(mprj_io_analog_sel),
176 .mprj_io_analog_pol(mprj_io_analog_pol),
177 .mprj_io_dm(mprj_io_dm)
178 );
179
180 // SoC core
181 wire striVe_clk;
182 wire striVe_rstn;
183
184 wire [7:0] spi_ro_config_core;
185
186 // LA signals
187 wire [127:0] la_output_core; // From CPU to MPRJ
188 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
189 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
190 wire [127:0] la_output_mprj; // From MPRJ to CPU
191 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
192
193 // WB MI A (Mega Project)
194 wire mprj_cyc_o_core;
195 wire mprj_stb_o_core;
196 wire mprj_we_o_core;
197 wire [3:0] mprj_sel_o_core;
198 wire [31:0] mprj_adr_o_core;
199 wire [31:0] mprj_dat_o_core;
200 wire mprj_ack_i_core;
201 wire [31:0] mprj_dat_i_core;
202
203 // WB MI B (xbar)
204 wire xbar_cyc_o_core;
205 wire xbar_stb_o_core;
206 wire xbar_we_o_core;
207 wire [3:0] xbar_sel_o_core;
208 wire [31:0] xbar_adr_o_core;
209 wire [31:0] xbar_dat_o_core;
210 wire xbar_ack_i_core;
211 wire [31:0] xbar_dat_i_core;
212
213 mgmt_core soc (
214 `ifdef LVS
215 .vdd1v8(vdd1v8),
216 .vss(vss),
217 `endif
218 .gpio_out_pad(gpio_out_core),
219 .gpio_in_pad(gpio_in_core),
220 .gpio_mode0_pad(gpio_mode0_core),
221 .gpio_mode1_pad(gpio_mode1_core),
222 .gpio_outenb_pad(gpio_outenb_core),
223 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400224 .spi_ro_config(spi_ro_config_core),
225 .ser_tx(ser_tx_core),
226 .ser_rx(ser_rx_core),
227 .irq_pin(irq_pin_core),
228 .flash_csb(flash_csb_core),
229 .flash_clk(flash_clk_core),
230 .flash_csb_oeb(flash_csb_oeb_core),
231 .flash_clk_oeb(flash_clk_oeb_core),
232 .flash_io0_oeb(flash_io0_oeb_core),
233 .flash_io1_oeb(flash_io1_oeb_core),
234 .flash_io2_oeb(flash_io2_oeb_core),
235 .flash_io3_oeb(flash_io3_oeb_core),
236 .flash_csb_ieb(flash_csb_ieb_core),
237 .flash_clk_ieb(flash_clk_ieb_core),
238 .flash_io0_ieb(flash_io0_ieb_core),
239 .flash_io1_ieb(flash_io1_ieb_core),
240 .flash_io2_ieb(flash_io2_ieb_core),
241 .flash_io3_ieb(flash_io3_ieb_core),
242 .flash_io0_do(flash_io0_do_core),
243 .flash_io1_do(flash_io1_do_core),
244 .flash_io2_do(flash_io2_do_core),
245 .flash_io3_do(flash_io3_do_core),
246 .flash_io0_di(flash_io0_di_core),
247 .flash_io1_di(flash_io1_di_core),
248 .flash_io2_di(flash_io2_di_core),
249 .flash_io3_di(flash_io3_di_core),
250 .por(por),
251 .porb_l(porb_l),
252 .clock(clock_core),
253 .pll_clk16(pll_clk16),
254 .SDI_core(SDI_core),
255 .CSB_core(CSB_core),
256 .SDO_core(SDO_core),
257 .SDO_enb(SDO_enb),
258 .striVe_clk(striVe_clk),
259 .striVe_rstn(striVe_rstn),
260 // Logic Analyzer
261 .la_input(la_data_out_mprj),
262 .la_output(la_output_core),
263 .la_oen(la_oen),
264 // Mega Project IO Control
265 .mprj_io_oeb_n(mprj_io_oeb_n),
266 .mprj_io_enh(mprj_io_enh),
267 .mprj_io_hldh_n(mprj_io_hldh_n),
268 .mprj_io_inp_dis(mprj_io_inp_dis),
269 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
270 .mprj_io_analog_en(mprj_io_analog_en),
271 .mprj_io_analog_sel(mprj_io_analog_sel),
272 .mprj_io_analog_pol(mprj_io_analog_pol),
273 .mprj_io_dm(mprj_io_dm),
274 // Mega Project Slave ports (WB MI A)
275 .mprj_cyc_o(mprj_cyc_o_core),
276 .mprj_stb_o(mprj_stb_o_core),
277 .mprj_we_o(mprj_we_o_core),
278 .mprj_sel_o(mprj_sel_o_core),
279 .mprj_adr_o(mprj_adr_o_core),
280 .mprj_dat_o(mprj_dat_o_core),
281 .mprj_ack_i(mprj_ack_i_core),
282 .mprj_dat_i(mprj_dat_i_core),
283 // Xbar Switch (WB MI B)
284 .xbar_cyc_o(xbar_cyc_o_core),
285 .xbar_stb_o(xbar_stb_o_core),
286 .xbar_we_o (xbar_we_o_core),
287 .xbar_sel_o(xbar_sel_o_core),
288 .xbar_adr_o(xbar_adr_o_core),
289 .xbar_dat_o(xbar_dat_o_core),
290 .xbar_ack_i(xbar_ack_i_core),
291 .xbar_dat_i(xbar_dat_i_core)
292 );
293
294 sky130_fd_sc_hd__ebufn_8 la_buf[127:0](
295 .Z(la_data_in_mprj),
296 .A(la_output_core),
Tim Edwardsc5265b82020-09-25 17:08:59 -0400297 .TE_B(la_oen)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400298 );
299
300 mega_project mprj (
301 .wb_clk_i(striVe_clk),
302 .wb_rst_i(!striVe_rstn),
303 // MGMT SoC Wishbone Slave
304 .wbs_cyc_i(mprj_cyc_o_core),
305 .wbs_stb_i(mprj_stb_o_core),
306 .wbs_we_i(mprj_we_o_core),
307 .wbs_sel_i(mprj_sel_o_core),
308 .wbs_adr_i(mprj_adr_o_core),
309 .wbs_dat_i(mprj_dat_o_core),
310 .wbs_ack_o(mprj_ack_i_core),
311 .wbs_dat_o(mprj_dat_i_core),
312 // Logic Analyzer
313 .la_data_in(la_data_in_mprj),
314 .la_data_out(la_data_out_mprj),
315 .la_oen (la_oen),
316 // IO Pads
317 .io_out(mprj_io_out),
318 .io_in (mprj_io_in)
319 );
320
Tim Edwardsc5265b82020-09-25 17:08:59 -0400321 sky130_fd_sc_hvl__lsbufhv2lv levelshift (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400322 `ifdef LVS
323 .vpwr(vdd3v3),
324 .vpb(vdd3v3),
325 .lvpwr(vdd1v8),
326 .vnb(vss),
327 .vgnd(vss),
328 `endif
329 .A(porb_h),
330 .X(porb_l)
331 );
332
333endmodule