blob: 23fb906ef02f9c3e5d15b1a5e209735490b8d0eb [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
Tim Edwardse2ef6732020-10-12 17:25:12 -040015`define USE_POWER_PINS
Tim Edwardsc5265b82020-09-25 17:08:59 -040016`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040017
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020018`include "defines.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040019`include "pads.v"
20
Tim Edwards4286ae12020-10-11 14:52:01 -040021/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
Tim Edwardsef8312e2020-09-22 17:20:06 -040022
Tim Edwards4286ae12020-10-11 14:52:01 -040023`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
Tim Edwards4c733352020-10-12 16:32:36 -040024`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
Tim Edwards4286ae12020-10-11 14:52:01 -040025
26`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
27`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
28`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
29`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040030
31`include "mgmt_soc.v"
Tim Edwards44bab472020-10-04 22:09:54 -040032`include "housekeeping_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040033`include "digital_pll.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040034`include "caravel_clocking.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040035`include "mgmt_core.v"
Tim Edwards53d92182020-10-11 21:47:40 -040036`include "mgmt_protect.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040037`include "mprj_io.v"
38`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040039`include "user_id_programming.v"
Tim Edwardsb86fc842020-10-13 17:11:54 -040040`include "user_project_wrapper.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040041`include "gpio_control_block.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040042`include "clock_div.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040043`include "simple_por.v"
Manar55ec3692020-10-30 16:32:18 +020044`include "storage_bridge_wb.v"
Ahmed Ghazy2517fa82020-11-08 23:34:41 +020045`include "DFFRAM.v"
Manar55ec3692020-10-30 16:32:18 +020046`include "sram_1rw1r_32_256_8_sky130.v"
47`include "storage.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040048
Tim Edwards05537512020-10-06 14:59:26 -040049/*------------------------------*/
50/* Include user project here */
51/*------------------------------*/
52`include "user_proj_example.v"
53
Manar55ec3692020-10-30 16:32:18 +020054// `ifdef USE_OPENRAM
55// `include "sram_1rw1r_32_256_8_sky130.v"
56// `endif
Tim Edwardsef8312e2020-09-22 17:20:06 -040057
58module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040059 inout vddio, // Common 3.3V padframe/ESD power
60 inout vssio, // Common padframe/ESD ground
61 inout vdda, // Management 3.3V power
62 inout vssa, // Common analog ground
63 inout vccd, // Management/Common 1.8V power
64 inout vssd, // Common digital ground
65 inout vdda1, // User area 1 3.3V power
66 inout vdda2, // User area 2 3.3V power
67 inout vssa1, // User area 1 analog ground
68 inout vssa2, // User area 2 analog ground
69 inout vccd1, // User area 1 1.8V power
70 inout vccd2, // User area 2 1.8V power
71 inout vssd1, // User area 1 digital ground
72 inout vssd2, // User area 2 digital ground
73
Tim Edwards04ba17f2020-10-02 22:27:50 -040074 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040075 inout [`MPRJ_IO_PADS-1:0] mprj_io,
Tim Edwardsba328902020-10-27 15:03:22 -040076 output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
Tim Edwardsef8312e2020-09-22 17:20:06 -040077 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040078 input resetb,
79
80 // Note that only two pins are available on the flash so dual and
81 // quad flash modes are not available.
82
Tim Edwardsef8312e2020-09-22 17:20:06 -040083 output flash_csb,
84 output flash_clk,
85 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040086 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040087);
88
Tim Edwards04ba17f2020-10-02 22:27:50 -040089 //------------------------------------------------------------
90 // This value is uniquely defined for each user project.
91 //------------------------------------------------------------
92 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040093
Tim Edwards04ba17f2020-10-02 22:27:50 -040094 // These pins are overlaid on mprj_io space. They have the function
95 // below when the management processor is in reset, or in the default
96 // configuration. They are assigned to uses in the user space by the
97 // configuration program running off of the SPI flash. Note that even
98 // when the user has taken control of these pins, they can be restored
99 // to the original use by setting the resetb pin low. The SPI pins and
100 // UART pins can be connected directly to an FTDI chip as long as the
101 // FTDI chip sets these lines to high impedence (input function) at
102 // all times except when holding the chip in reset.
103
104 // JTAG = mprj_io[0] (inout)
105 // SDO = mprj_io[1] (output)
106 // SDI = mprj_io[2] (input)
107 // CSB = mprj_io[3] (input)
108 // SCK = mprj_io[4] (input)
109 // ser_rx = mprj_io[5] (input)
110 // ser_tx = mprj_io[6] (output)
111 // irq = mprj_io[7] (input)
112
113 // These pins are reserved for any project that wants to incorporate
114 // its own processor and flash controller. While a user project can
115 // technically use any available I/O pins for the purpose, these
116 // four pins connect to a pass-through mode from the SPI slave (pins
117 // 1-4 above) so that any SPI flash connected to these specific pins
118 // can be accessed through the SPI slave even when the processor is in
119 // reset.
120
Tim Edwards44bab472020-10-04 22:09:54 -0400121 // user_flash_csb = mprj_io[8]
122 // user_flash_sck = mprj_io[9]
123 // user_flash_io0 = mprj_io[10]
124 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400125
126 // One-bit GPIO dedicated to management SoC (outside of user control)
127 wire gpio_out_core;
128 wire gpio_in_core;
129 wire gpio_mode0_core;
130 wire gpio_mode1_core;
131 wire gpio_outenb_core;
132 wire gpio_inenb_core;
133
Tim Edwards6d9739d2020-10-19 11:00:49 -0400134 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400135 wire mprj_io_loader_resetn;
136 wire mprj_io_loader_clock;
137 wire mprj_io_loader_data;
138
Tim Edwardsef8312e2020-09-22 17:20:06 -0400139 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
140 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
141 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400142 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400143 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400144 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
145 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
146 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400147 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
148 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
149 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
150 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
151 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
152 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
153
Tim Edwards6d9739d2020-10-19 11:00:49 -0400154 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400155 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400156 wire [`MPRJ_IO_PADS-1:0] user_io_in;
157 wire [`MPRJ_IO_PADS-1:0] user_io_out;
158
159 /* Padframe control signals */
160 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
161 wire mgmt_serial_clock;
162 wire mgmt_serial_resetn;
163
Tim Edwards6d9739d2020-10-19 11:00:49 -0400164 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400165 // There are two types of GPIO connections:
166 // (1) Full Bidirectional: Management connects to in, out, and oeb
167 // Uses: JTAG and SDO
168 // (2) Selectable bidirectional: Management connects to in and out,
169 // which are tied together. oeb is grounded (oeb from the
170 // configuration is used)
171
172 // SDI = mprj_io[2] (input)
173 // CSB = mprj_io[3] (input)
174 // SCK = mprj_io[4] (input)
175 // ser_rx = mprj_io[5] (input)
176 // ser_tx = mprj_io[6] (output)
177 // irq = mprj_io[7] (input)
178
179 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
180 wire jtag_out, sdo_out;
181 wire jtag_outenb, sdo_outenb;
182
183 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
184 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
185 wire [1:0] mgmt_io_nc2; /* no-connects */
186
Tim Edwards04ba17f2020-10-02 22:27:50 -0400187 // Power-on-reset signal. The reset pad generates the sense-inverted
188 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
189 // derived.
190
Tim Edwardsef8312e2020-09-22 17:20:06 -0400191 wire porb_h;
192 wire porb_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400193
Tim Edwardsf51dd082020-10-05 16:30:24 -0400194 wire rstb_h;
195 wire rstb_l;
196
Tim Edwards44bab472020-10-04 22:09:54 -0400197 // To be considered: Master hold signal on all user pads (?)
198 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
199 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400200 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400201 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
202
Tim Edwardsef8312e2020-09-22 17:20:06 -0400203 chip_io padframe(
204 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400205 .vddio(vddio),
206 .vssio(vssio),
207 .vdda(vdda),
208 .vssa(vssa),
209 .vccd(vccd),
210 .vssd(vssd),
211 .vdda1(vdda1),
212 .vdda2(vdda2),
213 .vssa1(vssa1),
214 .vssa2(vssa2),
215 .vccd1(vccd1),
216 .vccd2(vccd2),
217 .vssd1(vssd1),
218 .vssd2(vssd2),
219
Tim Edwardsef8312e2020-09-22 17:20:06 -0400220 .gpio(gpio),
221 .mprj_io(mprj_io),
222 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400223 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400224 .flash_csb(flash_csb),
225 .flash_clk(flash_clk),
226 .flash_io0(flash_io0),
227 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400228 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400229 .porb_h(porb_h),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400230 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400231 .clock_core(clock_core),
232 .gpio_out_core(gpio_out_core),
233 .gpio_in_core(gpio_in_core),
234 .gpio_mode0_core(gpio_mode0_core),
235 .gpio_mode1_core(gpio_mode1_core),
236 .gpio_outenb_core(gpio_outenb_core),
237 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400238 .flash_csb_core(flash_csb_core),
239 .flash_clk_core(flash_clk_core),
240 .flash_csb_oeb_core(flash_csb_oeb_core),
241 .flash_clk_oeb_core(flash_clk_oeb_core),
242 .flash_io0_oeb_core(flash_io0_oeb_core),
243 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400244 .flash_csb_ieb_core(flash_csb_ieb_core),
245 .flash_clk_ieb_core(flash_clk_ieb_core),
246 .flash_io0_ieb_core(flash_io0_ieb_core),
247 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400248 .flash_io0_do_core(flash_io0_do_core),
249 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400250 .flash_io0_di_core(flash_io0_di_core),
251 .flash_io1_di_core(flash_io1_di_core),
Tim Edwards44bab472020-10-04 22:09:54 -0400252 .por(~porb_l),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400253 .mprj_io_in(mprj_io_in),
254 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400255 .mprj_io_oeb(mprj_io_oeb),
Manar14d35ac2020-10-21 22:47:15 +0200256 .mprj_io_hldh_n(mprj_io_hldh_n),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400257 .mprj_io_enh(mprj_io_enh),
Manar14d35ac2020-10-21 22:47:15 +0200258 .mprj_io_inp_dis(mprj_io_inp_dis),
259 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
260 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
261 .mprj_io_slow_sel(mprj_io_slow_sel),
262 .mprj_io_holdover(mprj_io_holdover),
263 .mprj_io_analog_en(mprj_io_analog_en),
264 .mprj_io_analog_sel(mprj_io_analog_sel),
265 .mprj_io_analog_pol(mprj_io_analog_pol),
266 .mprj_io_dm(mprj_io_dm)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400267 );
268
269 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400270 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400271 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400272 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400273
274 wire [7:0] spi_ro_config_core;
275
276 // LA signals
277 wire [127:0] la_output_core; // From CPU to MPRJ
278 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
279 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
280 wire [127:0] la_output_mprj; // From MPRJ to CPU
281 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
282
Tim Edwards6d9739d2020-10-19 11:00:49 -0400283 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400284 wire mprj_cyc_o_core;
285 wire mprj_stb_o_core;
286 wire mprj_we_o_core;
287 wire [3:0] mprj_sel_o_core;
288 wire [31:0] mprj_adr_o_core;
289 wire [31:0] mprj_dat_o_core;
290 wire mprj_ack_i_core;
291 wire [31:0] mprj_dat_i_core;
292
293 // WB MI B (xbar)
294 wire xbar_cyc_o_core;
295 wire xbar_stb_o_core;
296 wire xbar_we_o_core;
297 wire [3:0] xbar_sel_o_core;
298 wire [31:0] xbar_adr_o_core;
299 wire [31:0] xbar_dat_o_core;
300 wire xbar_ack_i_core;
301 wire [31:0] xbar_dat_i_core;
302
Tim Edwards04ba17f2020-10-02 22:27:50 -0400303 // Mask revision
304 wire [31:0] mask_rev;
305
Manar14d35ac2020-10-21 22:47:15 +0200306 wire mprj_clock;
307 wire mprj_clock2;
308 wire mprj_resetn;
309 wire mprj_cyc_o_user;
310 wire mprj_stb_o_user;
311 wire mprj_we_o_user;
312 wire [3:0] mprj_sel_o_user;
313 wire [31:0] mprj_adr_o_user;
314 wire [31:0] mprj_dat_o_user;
315 wire mprj_vcc_pwrgood;
316 wire mprj2_vcc_pwrgood;
317 wire mprj_vdd_pwrgood;
318 wire mprj2_vdd_pwrgood;
319
Manar55ec3692020-10-30 16:32:18 +0200320 // Storage area
321 // Management R/W interface
322 wire [`MGMT_BLOCKS-1:0] mgmt_ena;
323 wire [`MGMT_BLOCKS-1:0] mgmt_wen;
324 wire [(`MGMT_BLOCKS*4)-1:0] mgmt_wen_mask;
325 wire [7:0] mgmt_addr;
326 wire [31:0] mgmt_wdata;
327 wire [(`MGMT_BLOCKS*32)-1:0] mgmt_rdata;
328 // Management RO interface
329 wire [`USER_BLOCKS-1:0] mgmt_user_ena;
330 wire [7:0] mgmt_user_addr;
331 wire [(`USER_BLOCKS*32)-1:0] mgmt_user_rdata;
332 // User R/W interface
333 wire [`USER_BLOCKS-1:0] user_ena;
334 wire [`USER_BLOCKS-1:0] user_wen;
335 wire [(`USER_BLOCKS*4)-1:0] user_wen_mask;
336 wire [7:0] user_addr;
337 wire [31:0] user_wdata;
338 wire [(`USER_BLOCKS*32)-1:0] user_rdata;
339 // User RO interface
340 wire [`MGMT_BLOCKS-1:0] user_mgmt_ena;
341 wire [7:0] user_mgmt_addr;
342 wire [(`MGMT_BLOCKS*32)-1:0] user_mgmt_rdata;
343
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200344 mgmt_core soc (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400345 `ifdef LVS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400346 .vdd(vccd),
347 .vss(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400348 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400349 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400350 .gpio_out_pad(gpio_out_core),
351 .gpio_in_pad(gpio_in_core),
352 .gpio_mode0_pad(gpio_mode0_core),
353 .gpio_mode1_pad(gpio_mode1_core),
354 .gpio_outenb_pad(gpio_outenb_core),
355 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400356 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400357 .flash_csb(flash_csb_core),
358 .flash_clk(flash_clk_core),
359 .flash_csb_oeb(flash_csb_oeb_core),
360 .flash_clk_oeb(flash_clk_oeb_core),
361 .flash_io0_oeb(flash_io0_oeb_core),
362 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400363 .flash_csb_ieb(flash_csb_ieb_core),
364 .flash_clk_ieb(flash_clk_ieb_core),
365 .flash_io0_ieb(flash_io0_ieb_core),
366 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400367 .flash_io0_do(flash_io0_do_core),
368 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400369 .flash_io0_di(flash_io0_di_core),
370 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400371 // Master Reset
372 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400373 .porb(porb_l),
374 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400375 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400376 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400377 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400378 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400379 // Logic Analyzer
380 .la_input(la_data_out_mprj),
381 .la_output(la_output_core),
382 .la_oen(la_oen),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400383 // User Project IO Control
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400384 .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
385 .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
386 .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
387 .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400388 .mprj_io_loader_resetn(mprj_io_loader_resetn),
389 .mprj_io_loader_clock(mprj_io_loader_clock),
390 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400391 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400392 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwardsba328902020-10-27 15:03:22 -0400393 .pwr_ctrl_out(pwr_ctrl_out),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400394 .sdo_out(sdo_out),
395 .sdo_outenb(sdo_outenb),
396 .jtag_out(jtag_out),
397 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400398 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400399 .mprj_cyc_o(mprj_cyc_o_core),
400 .mprj_stb_o(mprj_stb_o_core),
401 .mprj_we_o(mprj_we_o_core),
402 .mprj_sel_o(mprj_sel_o_core),
403 .mprj_adr_o(mprj_adr_o_core),
404 .mprj_dat_o(mprj_dat_o_core),
405 .mprj_ack_i(mprj_ack_i_core),
406 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400407 // mask data
Manar55ec3692020-10-30 16:32:18 +0200408 .mask_rev(mask_rev),
409 // MGMT area R/W interface for mgmt RAM
410 .mgmt_ena(mgmt_ena),
411 .mgmt_wen_mask(mgmt_wen_mask),
412 .mgmt_wen(mgmt_wen),
413 .mgmt_addr(mgmt_addr),
414 .mgmt_wdata(mgmt_wdata),
415 .mgmt_rdata(mgmt_rdata),
416 // MGMT area RO interface for user RAM
417 .user_ena(mgmt_user_ena),
418 .user_addr(mgmt_user_addr),
419 .user_rdata(mgmt_user_rdata)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400420 );
421
Tim Edwards53d92182020-10-11 21:47:40 -0400422 /* Clock and reset to user space are passed through a tristate */
423 /* buffer like the above, but since they are intended to be */
424 /* always active, connect the enable to the logic-1 output from */
425 /* the vccd1 domain. */
426
Tim Edwards53d92182020-10-11 21:47:40 -0400427 mgmt_protect mgmt_buffers (
Tim Edwards53d92182020-10-11 21:47:40 -0400428 .vccd(vccd),
429 .vssd(vssd),
430 .vccd1(vccd1),
431 .vssd1(vssd1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400432 .vdda1(vdda1),
433 .vssa1(vssa1),
434 .vdda2(vdda2),
435 .vssa2(vssa2),
Tim Edwards21a9aac2020-10-12 22:05:18 -0400436
Tim Edwards53d92182020-10-11 21:47:40 -0400437 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400438 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400439 .caravel_rstn(caravel_rstn),
440 .mprj_cyc_o_core(mprj_cyc_o_core),
441 .mprj_stb_o_core(mprj_stb_o_core),
442 .mprj_we_o_core(mprj_we_o_core),
443 .mprj_sel_o_core(mprj_sel_o_core),
444 .mprj_adr_o_core(mprj_adr_o_core),
445 .mprj_dat_o_core(mprj_dat_o_core),
446 .la_output_core(la_output_core),
447 .la_oen(la_oen),
448
449 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400450 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400451 .user_resetn(mprj_resetn),
452 .mprj_cyc_o_user(mprj_cyc_o_user),
453 .mprj_stb_o_user(mprj_stb_o_user),
454 .mprj_we_o_user(mprj_we_o_user),
455 .mprj_sel_o_user(mprj_sel_o_user),
456 .mprj_adr_o_user(mprj_adr_o_user),
457 .mprj_dat_o_user(mprj_dat_o_user),
Tim Edwards32d05422020-10-19 19:43:52 -0400458 .la_data_in_mprj(la_data_in_mprj),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400459 .user1_vcc_powergood(mprj_vcc_pwrgood),
460 .user2_vcc_powergood(mprj2_vcc_pwrgood),
461 .user1_vdd_powergood(mprj_vdd_pwrgood),
462 .user2_vdd_powergood(mprj2_vdd_pwrgood)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400463 );
Tim Edwards53d92182020-10-11 21:47:40 -0400464
Tim Edwardsef8312e2020-09-22 17:20:06 -0400465
Tim Edwardsb86fc842020-10-13 17:11:54 -0400466 /*----------------------------------------------*/
467 /* Wrapper module around the user project */
468 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400469
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200470 user_project_wrapper mprj (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400471 .vdda1(vdda1), // User area 1 3.3V power
472 .vdda2(vdda2), // User area 2 3.3V power
473 .vssa1(vssa1), // User area 1 analog ground
474 .vssa2(vssa2), // User area 2 analog ground
475 .vccd1(vccd1), // User area 1 1.8V power
476 .vccd2(vccd2), // User area 2 1.8V power
477 .vssd1(vssd1), // User area 1 digital ground
478 .vssd2(vssd2), // User area 2 digital ground
479
Tim Edwards53d92182020-10-11 21:47:40 -0400480 .wb_clk_i(mprj_clock),
481 .wb_rst_i(!mprj_resetn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400482 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400483 .wbs_cyc_i(mprj_cyc_o_user),
484 .wbs_stb_i(mprj_stb_o_user),
485 .wbs_we_i(mprj_we_o_user),
486 .wbs_sel_i(mprj_sel_o_user),
487 .wbs_adr_i(mprj_adr_o_user),
488 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400489 .wbs_ack_o(mprj_ack_i_core),
490 .wbs_dat_o(mprj_dat_i_core),
491 // Logic Analyzer
492 .la_data_in(la_data_in_mprj),
493 .la_data_out(la_data_out_mprj),
494 .la_oen (la_oen),
495 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400496 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400497 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400498 .io_oeb(user_io_oeb),
499 // Independent clock
500 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400501 );
502
Tim Edwards05537512020-10-06 14:59:26 -0400503 /*--------------------------------------*/
504 /* End user project instantiation */
505 /*--------------------------------------*/
506
Tim Edwards04ba17f2020-10-02 22:27:50 -0400507 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
508
Tim Edwards251e0df2020-10-05 11:02:12 -0400509 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400510
Tim Edwards251e0df2020-10-05 11:02:12 -0400511 // Each control block sits next to an I/O pad in the user area.
512 // It gets input through a serial chain from the previous control
513 // block and passes it to the next control block. Due to the nature
514 // of the shift register, bits are presented in reverse, as the first
515 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400516
Tim Edwards89f09242020-10-05 15:17:34 -0400517 // There are two types of block; the first two are configured to be
518 // full bidirectional under control of the management Soc (JTAG and
519 // SDO). The rest are configured to be default (input).
520
Tim Edwards251e0df2020-10-05 11:02:12 -0400521 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400522 .DM_INIT(3'b110), // Mode = output, strong up/down
Tim Edwards496a08a2020-10-26 15:44:51 -0400523 .OENB_INIT(1'b1) // Enable output signaling from wire
Tim Edwards89f09242020-10-05 15:17:34 -0400524 ) gpio_control_bidir [1:0] (
Tim Edwards53d92182020-10-11 21:47:40 -0400525 `ifdef LVS
526 inout vccd,
527 inout vssd,
528 inout vccd1,
529 inout vssd1,
530 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400531
Tim Edwards04ba17f2020-10-02 22:27:50 -0400532 // Management Soc-facing signals
533
Tim Edwardsc18c4742020-10-03 11:26:39 -0400534 .resetn(mprj_io_loader_resetn),
535 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400536
Tim Edwards89f09242020-10-05 15:17:34 -0400537 .mgmt_gpio_in(mgmt_io_in[1:0]),
538 .mgmt_gpio_out({sdo_out, jtag_out}),
539 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400540
541 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400542 .serial_data_in(gpio_serial_link_shifted[1:0]),
543 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400544
545 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400546 .user_gpio_out(user_io_out[1:0]),
547 .user_gpio_oeb(user_io_oeb[1:0]),
548 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400549
550 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400551 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
552 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
553 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
554 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
555 .pad_gpio_holdover(mprj_io_holdover[1:0]),
556 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
557 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
558 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
559 .pad_gpio_dm(mprj_io_dm[5:0]),
560 .pad_gpio_outenb(mprj_io_oeb[1:0]),
561 .pad_gpio_out(mprj_io_out[1:0]),
562 .pad_gpio_in(mprj_io_in[1:0])
563 );
564
565 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Tim Edwards53d92182020-10-11 21:47:40 -0400566 `ifdef LVS
567 inout vccd,
568 inout vssd,
569 inout vccd1,
570 inout vssd1,
571 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400572
573 // Management Soc-facing signals
574
575 .resetn(mprj_io_loader_resetn),
576 .serial_clock(mprj_io_loader_clock),
577
578 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
579 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
580 .mgmt_gpio_oeb(1'b1),
581
582 // Serial data chain for pad configuration
583 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
584 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
585
586 // User-facing signals
587 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
588 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
589 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
590
591 // Pad-facing signals (Pad GPIOv2)
592 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
593 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
594 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
595 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
596 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
597 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
598 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
599 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
600 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
601 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
602 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
603 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400604 );
605
Tim Edwardsf51dd082020-10-05 16:30:24 -0400606 sky130_fd_sc_hvl__lsbufhv2lv porb_level (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400607 .VPWR(vddio),
608 .VPB(vddio),
609 .LVPWR(vccd),
610 .VNB(vssio),
611 .VGND(vssio),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400612 .A(porb_h),
613 .X(porb_l)
614 );
615
Tim Edwards04ba17f2020-10-02 22:27:50 -0400616 user_id_programming #(
617 .USER_PROJECT_ID(USER_PROJECT_ID)
618 ) user_id_value (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400619 .vdd1v8(vccd),
620 .vss(vssd),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400621 .mask_rev(mask_rev)
622 );
623
Tim Edwardsf51dd082020-10-05 16:30:24 -0400624 // Power-on-reset circuit
625 simple_por por (
Tim Edwards9eda80d2020-10-08 21:36:44 -0400626 .vdd3v3(vddio),
627 .vss(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400628 .porb_h(porb_h)
629 );
630
631 // XRES (chip input pin reset) reset level converter
632 sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400633 .VPWR(vddio),
634 .VPB(vddio),
635 .LVPWR(vccd),
636 .VNB(vssio),
637 .VGND(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400638 .A(rstb_h),
639 .X(rstb_l)
640 );
641
Manar55ec3692020-10-30 16:32:18 +0200642 // Storage area
643 storage #(
644 .MGMT_BLOCKS(`MGMT_BLOCKS),
645 .USER_BLOCKS(`USER_BLOCKS)
646 ) storage(
647 .mgmt_clk(caravel_clk),
648 .mgmt_ena(mgmt_ena),
649 .mgmt_wen(mgmt_wen),
650 .mgmt_wen_mask(mgmt_wen_mask),
651 .mgmt_addr(mgmt_addr),
652 .mgmt_wdata(mgmt_wdata),
653 .mgmt_rdata(mgmt_rdata),
654 // Management RO interface
655 .mgmt_user_ena(mgmt_user_ena),
656 .mgmt_user_addr(mgmt_user_addr),
657 .mgmt_user_rdata(mgmt_user_rdata),
658
659 // User R/W interface
660 .user_clk(caravel_clk2),
661 .user_ena(user_ena),
662 .user_wen(user_wen),
663 .user_wen_mask(user_wen_mask),
664 .user_addr(user_addr),
665 .user_wdata(user_wdata),
666 .user_rdata(user_rdata),
667 // User RO interface
668 .user_mgmt_ena(user_mgmt_ena),
669 .user_mgmt_addr(user_mgmt_addr),
670 .user_mgmt_rdata(user_mgmt_rdata)
671 );
672
Tim Edwardsef8312e2020-09-22 17:20:06 -0400673endmodule