blob: d7c123fe7b4e91f657cc79e1c0e324df860d1a05 [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"
45`include "sram_1rw1r_32_256_8_sky130.v"
46`include "storage.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040047
Tim Edwards05537512020-10-06 14:59:26 -040048/*------------------------------*/
49/* Include user project here */
50/*------------------------------*/
51`include "user_proj_example.v"
52
Manar55ec3692020-10-30 16:32:18 +020053// `ifdef USE_OPENRAM
54// `include "sram_1rw1r_32_256_8_sky130.v"
55// `endif
Tim Edwardsef8312e2020-09-22 17:20:06 -040056
57module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040058 inout vddio, // Common 3.3V padframe/ESD power
59 inout vssio, // Common padframe/ESD ground
60 inout vdda, // Management 3.3V power
61 inout vssa, // Common analog ground
62 inout vccd, // Management/Common 1.8V power
63 inout vssd, // Common digital ground
64 inout vdda1, // User area 1 3.3V power
65 inout vdda2, // User area 2 3.3V power
66 inout vssa1, // User area 1 analog ground
67 inout vssa2, // User area 2 analog ground
68 inout vccd1, // User area 1 1.8V power
69 inout vccd2, // User area 2 1.8V power
70 inout vssd1, // User area 1 digital ground
71 inout vssd2, // User area 2 digital ground
72
Tim Edwards04ba17f2020-10-02 22:27:50 -040073 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040074 inout [`MPRJ_IO_PADS-1:0] mprj_io,
Tim Edwardsba328902020-10-27 15:03:22 -040075 output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
Tim Edwardsef8312e2020-09-22 17:20:06 -040076 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040077 input resetb,
78
79 // Note that only two pins are available on the flash so dual and
80 // quad flash modes are not available.
81
Tim Edwardsef8312e2020-09-22 17:20:06 -040082 output flash_csb,
83 output flash_clk,
84 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040085 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040086);
87
Tim Edwards04ba17f2020-10-02 22:27:50 -040088 //------------------------------------------------------------
89 // This value is uniquely defined for each user project.
90 //------------------------------------------------------------
91 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040092
Tim Edwards04ba17f2020-10-02 22:27:50 -040093 // These pins are overlaid on mprj_io space. They have the function
94 // below when the management processor is in reset, or in the default
95 // configuration. They are assigned to uses in the user space by the
96 // configuration program running off of the SPI flash. Note that even
97 // when the user has taken control of these pins, they can be restored
98 // to the original use by setting the resetb pin low. The SPI pins and
99 // UART pins can be connected directly to an FTDI chip as long as the
100 // FTDI chip sets these lines to high impedence (input function) at
101 // all times except when holding the chip in reset.
102
103 // JTAG = mprj_io[0] (inout)
104 // SDO = mprj_io[1] (output)
105 // SDI = mprj_io[2] (input)
106 // CSB = mprj_io[3] (input)
107 // SCK = mprj_io[4] (input)
108 // ser_rx = mprj_io[5] (input)
109 // ser_tx = mprj_io[6] (output)
110 // irq = mprj_io[7] (input)
111
112 // These pins are reserved for any project that wants to incorporate
113 // its own processor and flash controller. While a user project can
114 // technically use any available I/O pins for the purpose, these
115 // four pins connect to a pass-through mode from the SPI slave (pins
116 // 1-4 above) so that any SPI flash connected to these specific pins
117 // can be accessed through the SPI slave even when the processor is in
118 // reset.
119
Tim Edwards44bab472020-10-04 22:09:54 -0400120 // user_flash_csb = mprj_io[8]
121 // user_flash_sck = mprj_io[9]
122 // user_flash_io0 = mprj_io[10]
123 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400124
125 // One-bit GPIO dedicated to management SoC (outside of user control)
126 wire gpio_out_core;
127 wire gpio_in_core;
128 wire gpio_mode0_core;
129 wire gpio_mode1_core;
130 wire gpio_outenb_core;
131 wire gpio_inenb_core;
132
Tim Edwards6d9739d2020-10-19 11:00:49 -0400133 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400134 wire mprj_io_loader_resetn;
135 wire mprj_io_loader_clock;
136 wire mprj_io_loader_data;
137
Tim Edwardsef8312e2020-09-22 17:20:06 -0400138 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
139 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
140 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400141 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400142 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400143 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
144 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
145 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400146 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
147 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
148 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
149 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
150 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
151 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
152
Tim Edwards6d9739d2020-10-19 11:00:49 -0400153 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400154 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400155 wire [`MPRJ_IO_PADS-1:0] user_io_in;
156 wire [`MPRJ_IO_PADS-1:0] user_io_out;
157
158 /* Padframe control signals */
159 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
160 wire mgmt_serial_clock;
161 wire mgmt_serial_resetn;
162
Tim Edwards6d9739d2020-10-19 11:00:49 -0400163 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400164 // There are two types of GPIO connections:
165 // (1) Full Bidirectional: Management connects to in, out, and oeb
166 // Uses: JTAG and SDO
167 // (2) Selectable bidirectional: Management connects to in and out,
168 // which are tied together. oeb is grounded (oeb from the
169 // configuration is used)
170
171 // SDI = mprj_io[2] (input)
172 // CSB = mprj_io[3] (input)
173 // SCK = mprj_io[4] (input)
174 // ser_rx = mprj_io[5] (input)
175 // ser_tx = mprj_io[6] (output)
176 // irq = mprj_io[7] (input)
177
178 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
179 wire jtag_out, sdo_out;
180 wire jtag_outenb, sdo_outenb;
181
182 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
183 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
184 wire [1:0] mgmt_io_nc2; /* no-connects */
185
Tim Edwards04ba17f2020-10-02 22:27:50 -0400186 // Power-on-reset signal. The reset pad generates the sense-inverted
187 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
188 // derived.
189
Tim Edwardsef8312e2020-09-22 17:20:06 -0400190 wire porb_h;
191 wire porb_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400192
Tim Edwardsf51dd082020-10-05 16:30:24 -0400193 wire rstb_h;
194 wire rstb_l;
195
Tim Edwards44bab472020-10-04 22:09:54 -0400196 // To be considered: Master hold signal on all user pads (?)
197 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
198 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400199 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400200 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
201
Tim Edwardsef8312e2020-09-22 17:20:06 -0400202 chip_io padframe(
203 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400204 .vddio(vddio),
205 .vssio(vssio),
206 .vdda(vdda),
207 .vssa(vssa),
208 .vccd(vccd),
209 .vssd(vssd),
210 .vdda1(vdda1),
211 .vdda2(vdda2),
212 .vssa1(vssa1),
213 .vssa2(vssa2),
214 .vccd1(vccd1),
215 .vccd2(vccd2),
216 .vssd1(vssd1),
217 .vssd2(vssd2),
218
Tim Edwardsef8312e2020-09-22 17:20:06 -0400219 .gpio(gpio),
220 .mprj_io(mprj_io),
221 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400222 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400223 .flash_csb(flash_csb),
224 .flash_clk(flash_clk),
225 .flash_io0(flash_io0),
226 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400227 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400228 .porb_h(porb_h),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400229 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400230 .clock_core(clock_core),
231 .gpio_out_core(gpio_out_core),
232 .gpio_in_core(gpio_in_core),
233 .gpio_mode0_core(gpio_mode0_core),
234 .gpio_mode1_core(gpio_mode1_core),
235 .gpio_outenb_core(gpio_outenb_core),
236 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400237 .flash_csb_core(flash_csb_core),
238 .flash_clk_core(flash_clk_core),
239 .flash_csb_oeb_core(flash_csb_oeb_core),
240 .flash_clk_oeb_core(flash_clk_oeb_core),
241 .flash_io0_oeb_core(flash_io0_oeb_core),
242 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400243 .flash_csb_ieb_core(flash_csb_ieb_core),
244 .flash_clk_ieb_core(flash_clk_ieb_core),
245 .flash_io0_ieb_core(flash_io0_ieb_core),
246 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400247 .flash_io0_do_core(flash_io0_do_core),
248 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400249 .flash_io0_di_core(flash_io0_di_core),
250 .flash_io1_di_core(flash_io1_di_core),
Tim Edwards44bab472020-10-04 22:09:54 -0400251 .por(~porb_l),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400252 .mprj_io_in(mprj_io_in),
253 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400254 .mprj_io_oeb(mprj_io_oeb),
Manar14d35ac2020-10-21 22:47:15 +0200255 .mprj_io_hldh_n(mprj_io_hldh_n),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400256 .mprj_io_enh(mprj_io_enh),
Manar14d35ac2020-10-21 22:47:15 +0200257 .mprj_io_inp_dis(mprj_io_inp_dis),
258 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
259 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
260 .mprj_io_slow_sel(mprj_io_slow_sel),
261 .mprj_io_holdover(mprj_io_holdover),
262 .mprj_io_analog_en(mprj_io_analog_en),
263 .mprj_io_analog_sel(mprj_io_analog_sel),
264 .mprj_io_analog_pol(mprj_io_analog_pol),
265 .mprj_io_dm(mprj_io_dm)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400266 );
267
268 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400269 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400270 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400271 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400272
273 wire [7:0] spi_ro_config_core;
274
275 // LA signals
276 wire [127:0] la_output_core; // From CPU to MPRJ
277 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
278 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
279 wire [127:0] la_output_mprj; // From MPRJ to CPU
280 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
281
Tim Edwards6d9739d2020-10-19 11:00:49 -0400282 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400283 wire mprj_cyc_o_core;
284 wire mprj_stb_o_core;
285 wire mprj_we_o_core;
286 wire [3:0] mprj_sel_o_core;
287 wire [31:0] mprj_adr_o_core;
288 wire [31:0] mprj_dat_o_core;
289 wire mprj_ack_i_core;
290 wire [31:0] mprj_dat_i_core;
291
292 // WB MI B (xbar)
293 wire xbar_cyc_o_core;
294 wire xbar_stb_o_core;
295 wire xbar_we_o_core;
296 wire [3:0] xbar_sel_o_core;
297 wire [31:0] xbar_adr_o_core;
298 wire [31:0] xbar_dat_o_core;
299 wire xbar_ack_i_core;
300 wire [31:0] xbar_dat_i_core;
301
Tim Edwards04ba17f2020-10-02 22:27:50 -0400302 // Mask revision
303 wire [31:0] mask_rev;
304
Manar14d35ac2020-10-21 22:47:15 +0200305 wire mprj_clock;
306 wire mprj_clock2;
307 wire mprj_resetn;
308 wire mprj_cyc_o_user;
309 wire mprj_stb_o_user;
310 wire mprj_we_o_user;
311 wire [3:0] mprj_sel_o_user;
312 wire [31:0] mprj_adr_o_user;
313 wire [31:0] mprj_dat_o_user;
314 wire mprj_vcc_pwrgood;
315 wire mprj2_vcc_pwrgood;
316 wire mprj_vdd_pwrgood;
317 wire mprj2_vdd_pwrgood;
318
Manar55ec3692020-10-30 16:32:18 +0200319 // Storage area
320 // Management R/W interface
321 wire [`MGMT_BLOCKS-1:0] mgmt_ena;
322 wire [`MGMT_BLOCKS-1:0] mgmt_wen;
323 wire [(`MGMT_BLOCKS*4)-1:0] mgmt_wen_mask;
324 wire [7:0] mgmt_addr;
325 wire [31:0] mgmt_wdata;
326 wire [(`MGMT_BLOCKS*32)-1:0] mgmt_rdata;
327 // Management RO interface
328 wire [`USER_BLOCKS-1:0] mgmt_user_ena;
329 wire [7:0] mgmt_user_addr;
330 wire [(`USER_BLOCKS*32)-1:0] mgmt_user_rdata;
331 // User R/W interface
332 wire [`USER_BLOCKS-1:0] user_ena;
333 wire [`USER_BLOCKS-1:0] user_wen;
334 wire [(`USER_BLOCKS*4)-1:0] user_wen_mask;
335 wire [7:0] user_addr;
336 wire [31:0] user_wdata;
337 wire [(`USER_BLOCKS*32)-1:0] user_rdata;
338 // User RO interface
339 wire [`MGMT_BLOCKS-1:0] user_mgmt_ena;
340 wire [7:0] user_mgmt_addr;
341 wire [(`MGMT_BLOCKS*32)-1:0] user_mgmt_rdata;
342
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200343 mgmt_core soc (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400344 `ifdef LVS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400345 .vdd(vccd),
346 .vss(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400347 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400348 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400349 .gpio_out_pad(gpio_out_core),
350 .gpio_in_pad(gpio_in_core),
351 .gpio_mode0_pad(gpio_mode0_core),
352 .gpio_mode1_pad(gpio_mode1_core),
353 .gpio_outenb_pad(gpio_outenb_core),
354 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400355 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400356 .flash_csb(flash_csb_core),
357 .flash_clk(flash_clk_core),
358 .flash_csb_oeb(flash_csb_oeb_core),
359 .flash_clk_oeb(flash_clk_oeb_core),
360 .flash_io0_oeb(flash_io0_oeb_core),
361 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400362 .flash_csb_ieb(flash_csb_ieb_core),
363 .flash_clk_ieb(flash_clk_ieb_core),
364 .flash_io0_ieb(flash_io0_ieb_core),
365 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400366 .flash_io0_do(flash_io0_do_core),
367 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400368 .flash_io0_di(flash_io0_di_core),
369 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400370 // Master Reset
371 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400372 .porb(porb_l),
373 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400374 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400375 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400376 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400377 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400378 // Logic Analyzer
379 .la_input(la_data_out_mprj),
380 .la_output(la_output_core),
381 .la_oen(la_oen),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400382 // User Project IO Control
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400383 .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
384 .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
385 .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
386 .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400387 .mprj_io_loader_resetn(mprj_io_loader_resetn),
388 .mprj_io_loader_clock(mprj_io_loader_clock),
389 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400390 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400391 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwardsba328902020-10-27 15:03:22 -0400392 .pwr_ctrl_out(pwr_ctrl_out),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400393 .sdo_out(sdo_out),
394 .sdo_outenb(sdo_outenb),
395 .jtag_out(jtag_out),
396 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400397 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400398 .mprj_cyc_o(mprj_cyc_o_core),
399 .mprj_stb_o(mprj_stb_o_core),
400 .mprj_we_o(mprj_we_o_core),
401 .mprj_sel_o(mprj_sel_o_core),
402 .mprj_adr_o(mprj_adr_o_core),
403 .mprj_dat_o(mprj_dat_o_core),
404 .mprj_ack_i(mprj_ack_i_core),
405 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400406 // mask data
Manar55ec3692020-10-30 16:32:18 +0200407 .mask_rev(mask_rev),
408 // MGMT area R/W interface for mgmt RAM
409 .mgmt_ena(mgmt_ena),
410 .mgmt_wen_mask(mgmt_wen_mask),
411 .mgmt_wen(mgmt_wen),
412 .mgmt_addr(mgmt_addr),
413 .mgmt_wdata(mgmt_wdata),
414 .mgmt_rdata(mgmt_rdata),
415 // MGMT area RO interface for user RAM
416 .user_ena(mgmt_user_ena),
417 .user_addr(mgmt_user_addr),
418 .user_rdata(mgmt_user_rdata)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400419 );
420
Tim Edwards53d92182020-10-11 21:47:40 -0400421 /* Clock and reset to user space are passed through a tristate */
422 /* buffer like the above, but since they are intended to be */
423 /* always active, connect the enable to the logic-1 output from */
424 /* the vccd1 domain. */
425
Tim Edwards53d92182020-10-11 21:47:40 -0400426 mgmt_protect mgmt_buffers (
Tim Edwards53d92182020-10-11 21:47:40 -0400427 .vccd(vccd),
428 .vssd(vssd),
429 .vccd1(vccd1),
430 .vssd1(vssd1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400431 .vdda1(vdda1),
432 .vssa1(vssa1),
433 .vdda2(vdda2),
434 .vssa2(vssa2),
Tim Edwards21a9aac2020-10-12 22:05:18 -0400435
Tim Edwards53d92182020-10-11 21:47:40 -0400436 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400437 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400438 .caravel_rstn(caravel_rstn),
439 .mprj_cyc_o_core(mprj_cyc_o_core),
440 .mprj_stb_o_core(mprj_stb_o_core),
441 .mprj_we_o_core(mprj_we_o_core),
442 .mprj_sel_o_core(mprj_sel_o_core),
443 .mprj_adr_o_core(mprj_adr_o_core),
444 .mprj_dat_o_core(mprj_dat_o_core),
445 .la_output_core(la_output_core),
446 .la_oen(la_oen),
447
448 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400449 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400450 .user_resetn(mprj_resetn),
451 .mprj_cyc_o_user(mprj_cyc_o_user),
452 .mprj_stb_o_user(mprj_stb_o_user),
453 .mprj_we_o_user(mprj_we_o_user),
454 .mprj_sel_o_user(mprj_sel_o_user),
455 .mprj_adr_o_user(mprj_adr_o_user),
456 .mprj_dat_o_user(mprj_dat_o_user),
Tim Edwards32d05422020-10-19 19:43:52 -0400457 .la_data_in_mprj(la_data_in_mprj),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400458 .user1_vcc_powergood(mprj_vcc_pwrgood),
459 .user2_vcc_powergood(mprj2_vcc_pwrgood),
460 .user1_vdd_powergood(mprj_vdd_pwrgood),
461 .user2_vdd_powergood(mprj2_vdd_pwrgood)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400462 );
Tim Edwards53d92182020-10-11 21:47:40 -0400463
Tim Edwardsef8312e2020-09-22 17:20:06 -0400464
Tim Edwardsb86fc842020-10-13 17:11:54 -0400465 /*----------------------------------------------*/
466 /* Wrapper module around the user project */
467 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400468
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200469 user_project_wrapper mprj (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400470 .vdda1(vdda1), // User area 1 3.3V power
471 .vdda2(vdda2), // User area 2 3.3V power
472 .vssa1(vssa1), // User area 1 analog ground
473 .vssa2(vssa2), // User area 2 analog ground
474 .vccd1(vccd1), // User area 1 1.8V power
475 .vccd2(vccd2), // User area 2 1.8V power
476 .vssd1(vssd1), // User area 1 digital ground
477 .vssd2(vssd2), // User area 2 digital ground
478
Tim Edwards53d92182020-10-11 21:47:40 -0400479 .wb_clk_i(mprj_clock),
480 .wb_rst_i(!mprj_resetn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400481 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400482 .wbs_cyc_i(mprj_cyc_o_user),
483 .wbs_stb_i(mprj_stb_o_user),
484 .wbs_we_i(mprj_we_o_user),
485 .wbs_sel_i(mprj_sel_o_user),
486 .wbs_adr_i(mprj_adr_o_user),
487 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400488 .wbs_ack_o(mprj_ack_i_core),
489 .wbs_dat_o(mprj_dat_i_core),
490 // Logic Analyzer
491 .la_data_in(la_data_in_mprj),
492 .la_data_out(la_data_out_mprj),
493 .la_oen (la_oen),
494 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400495 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400496 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400497 .io_oeb(user_io_oeb),
498 // Independent clock
499 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400500 );
501
Tim Edwards05537512020-10-06 14:59:26 -0400502 /*--------------------------------------*/
503 /* End user project instantiation */
504 /*--------------------------------------*/
505
Tim Edwards04ba17f2020-10-02 22:27:50 -0400506 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
507
Tim Edwards251e0df2020-10-05 11:02:12 -0400508 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400509
Tim Edwards251e0df2020-10-05 11:02:12 -0400510 // Each control block sits next to an I/O pad in the user area.
511 // It gets input through a serial chain from the previous control
512 // block and passes it to the next control block. Due to the nature
513 // of the shift register, bits are presented in reverse, as the first
514 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400515
Tim Edwards89f09242020-10-05 15:17:34 -0400516 // There are two types of block; the first two are configured to be
517 // full bidirectional under control of the management Soc (JTAG and
518 // SDO). The rest are configured to be default (input).
519
Tim Edwards251e0df2020-10-05 11:02:12 -0400520 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400521 .DM_INIT(3'b110), // Mode = output, strong up/down
Tim Edwards496a08a2020-10-26 15:44:51 -0400522 .OENB_INIT(1'b1) // Enable output signaling from wire
Tim Edwards89f09242020-10-05 15:17:34 -0400523 ) gpio_control_bidir [1:0] (
Tim Edwards53d92182020-10-11 21:47:40 -0400524 `ifdef LVS
525 inout vccd,
526 inout vssd,
527 inout vccd1,
528 inout vssd1,
529 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400530
Tim Edwards04ba17f2020-10-02 22:27:50 -0400531 // Management Soc-facing signals
532
Tim Edwardsc18c4742020-10-03 11:26:39 -0400533 .resetn(mprj_io_loader_resetn),
534 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400535
Tim Edwards89f09242020-10-05 15:17:34 -0400536 .mgmt_gpio_in(mgmt_io_in[1:0]),
537 .mgmt_gpio_out({sdo_out, jtag_out}),
538 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400539
540 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400541 .serial_data_in(gpio_serial_link_shifted[1:0]),
542 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400543
544 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400545 .user_gpio_out(user_io_out[1:0]),
546 .user_gpio_oeb(user_io_oeb[1:0]),
547 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400548
549 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400550 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
551 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
552 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
553 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
554 .pad_gpio_holdover(mprj_io_holdover[1:0]),
555 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
556 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
557 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
558 .pad_gpio_dm(mprj_io_dm[5:0]),
559 .pad_gpio_outenb(mprj_io_oeb[1:0]),
560 .pad_gpio_out(mprj_io_out[1:0]),
561 .pad_gpio_in(mprj_io_in[1:0])
562 );
563
564 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Tim Edwards53d92182020-10-11 21:47:40 -0400565 `ifdef LVS
566 inout vccd,
567 inout vssd,
568 inout vccd1,
569 inout vssd1,
570 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400571
572 // Management Soc-facing signals
573
574 .resetn(mprj_io_loader_resetn),
575 .serial_clock(mprj_io_loader_clock),
576
577 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
578 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
579 .mgmt_gpio_oeb(1'b1),
580
581 // Serial data chain for pad configuration
582 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
583 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
584
585 // User-facing signals
586 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
587 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
588 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
589
590 // Pad-facing signals (Pad GPIOv2)
591 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
592 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
593 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
594 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
595 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
596 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
597 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
598 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
599 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
600 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
601 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
602 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400603 );
604
Tim Edwardsf51dd082020-10-05 16:30:24 -0400605 sky130_fd_sc_hvl__lsbufhv2lv porb_level (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400606 .VPWR(vddio),
607 .VPB(vddio),
608 .LVPWR(vccd),
609 .VNB(vssio),
610 .VGND(vssio),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400611 .A(porb_h),
612 .X(porb_l)
613 );
614
Tim Edwards04ba17f2020-10-02 22:27:50 -0400615 user_id_programming #(
616 .USER_PROJECT_ID(USER_PROJECT_ID)
617 ) user_id_value (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400618 .vdd1v8(vccd),
619 .vss(vssd),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400620 .mask_rev(mask_rev)
621 );
622
Tim Edwardsf51dd082020-10-05 16:30:24 -0400623 // Power-on-reset circuit
624 simple_por por (
Tim Edwards9eda80d2020-10-08 21:36:44 -0400625 .vdd3v3(vddio),
626 .vss(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400627 .porb_h(porb_h)
628 );
629
630 // XRES (chip input pin reset) reset level converter
631 sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400632 .VPWR(vddio),
633 .VPB(vddio),
634 .LVPWR(vccd),
635 .VNB(vssio),
636 .VGND(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400637 .A(rstb_h),
638 .X(rstb_l)
639 );
640
Manar55ec3692020-10-30 16:32:18 +0200641 // Storage area
642 storage #(
643 .MGMT_BLOCKS(`MGMT_BLOCKS),
644 .USER_BLOCKS(`USER_BLOCKS)
645 ) storage(
646 .mgmt_clk(caravel_clk),
647 .mgmt_ena(mgmt_ena),
648 .mgmt_wen(mgmt_wen),
649 .mgmt_wen_mask(mgmt_wen_mask),
650 .mgmt_addr(mgmt_addr),
651 .mgmt_wdata(mgmt_wdata),
652 .mgmt_rdata(mgmt_rdata),
653 // Management RO interface
654 .mgmt_user_ena(mgmt_user_ena),
655 .mgmt_user_addr(mgmt_user_addr),
656 .mgmt_user_rdata(mgmt_user_rdata),
657
658 // User R/W interface
659 .user_clk(caravel_clk2),
660 .user_ena(user_ena),
661 .user_wen(user_wen),
662 .user_wen_mask(user_wen_mask),
663 .user_addr(user_addr),
664 .user_wdata(user_wdata),
665 .user_rdata(user_rdata),
666 // User RO interface
667 .user_mgmt_ena(user_mgmt_ena),
668 .user_mgmt_addr(user_mgmt_addr),
669 .user_mgmt_rdata(user_mgmt_rdata)
670 );
671
Tim Edwardsef8312e2020-09-22 17:20:06 -0400672endmodule