blob: 23f4291e216928eef1f9f23646ef19ad5a90982c [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
Tim Edwardse2ef6732020-10-12 17:25:12 -040016`define USE_POWER_PINS
Tim Edwardsc5265b82020-09-25 17:08:59 -040017`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040018
Tim Edwardsb6dd1522020-10-19 15:58:25 -040019`define MPRJ_IO_PADS 38
Tim Edwards9eda80d2020-10-08 21:36:44 -040020`define MPRJ_PWR_PADS 4 /* vdda1, vccd1, vdda2, vccd2 */
Tim Edwardsef8312e2020-09-22 17:20:06 -040021
22`include "pads.v"
23
Tim Edwards4286ae12020-10-11 14:52:01 -040024/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
Tim Edwardsef8312e2020-09-22 17:20:06 -040025
Tim Edwards4286ae12020-10-11 14:52:01 -040026`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
Tim Edwards4c733352020-10-12 16:32:36 -040027`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
Tim Edwards4286ae12020-10-11 14:52:01 -040028
29`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
30`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
31`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
32`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040033
34`include "mgmt_soc.v"
Tim Edwards44bab472020-10-04 22:09:54 -040035`include "housekeeping_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040036`include "digital_pll.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040037`include "caravel_clocking.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040038`include "mgmt_core.v"
Tim Edwards53d92182020-10-11 21:47:40 -040039`include "mgmt_protect.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040040`include "mprj_io.v"
41`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040042`include "user_id_programming.v"
Tim Edwardsb86fc842020-10-13 17:11:54 -040043`include "user_project_wrapper.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040044`include "gpio_control_block.v"
Tim Edwards3245e2f2020-10-10 14:02:11 -040045`include "clock_div.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040046`include "simple_por.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
Tim Edwardsef8312e2020-09-22 17:20:06 -040053`ifdef USE_OPENRAM
54 `include "sram_1rw1r_32_8192_8_sky130.v"
55`endif
56
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,
75 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040076 input resetb,
77
78 // Note that only two pins are available on the flash so dual and
79 // quad flash modes are not available.
80
Tim Edwardsef8312e2020-09-22 17:20:06 -040081 output flash_csb,
82 output flash_clk,
83 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040084 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040085);
86
Tim Edwards04ba17f2020-10-02 22:27:50 -040087 //------------------------------------------------------------
88 // This value is uniquely defined for each user project.
89 //------------------------------------------------------------
90 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040091
Tim Edwards04ba17f2020-10-02 22:27:50 -040092 // These pins are overlaid on mprj_io space. They have the function
93 // below when the management processor is in reset, or in the default
94 // configuration. They are assigned to uses in the user space by the
95 // configuration program running off of the SPI flash. Note that even
96 // when the user has taken control of these pins, they can be restored
97 // to the original use by setting the resetb pin low. The SPI pins and
98 // UART pins can be connected directly to an FTDI chip as long as the
99 // FTDI chip sets these lines to high impedence (input function) at
100 // all times except when holding the chip in reset.
101
102 // JTAG = mprj_io[0] (inout)
103 // SDO = mprj_io[1] (output)
104 // SDI = mprj_io[2] (input)
105 // CSB = mprj_io[3] (input)
106 // SCK = mprj_io[4] (input)
107 // ser_rx = mprj_io[5] (input)
108 // ser_tx = mprj_io[6] (output)
109 // irq = mprj_io[7] (input)
110
111 // These pins are reserved for any project that wants to incorporate
112 // its own processor and flash controller. While a user project can
113 // technically use any available I/O pins for the purpose, these
114 // four pins connect to a pass-through mode from the SPI slave (pins
115 // 1-4 above) so that any SPI flash connected to these specific pins
116 // can be accessed through the SPI slave even when the processor is in
117 // reset.
118
Tim Edwards44bab472020-10-04 22:09:54 -0400119 // user_flash_csb = mprj_io[8]
120 // user_flash_sck = mprj_io[9]
121 // user_flash_io0 = mprj_io[10]
122 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400123
124 // One-bit GPIO dedicated to management SoC (outside of user control)
125 wire gpio_out_core;
126 wire gpio_in_core;
127 wire gpio_mode0_core;
128 wire gpio_mode1_core;
129 wire gpio_outenb_core;
130 wire gpio_inenb_core;
131
Tim Edwards6d9739d2020-10-19 11:00:49 -0400132 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400133 wire mprj_io_loader_resetn;
134 wire mprj_io_loader_clock;
135 wire mprj_io_loader_data;
136
Tim Edwardsef8312e2020-09-22 17:20:06 -0400137 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
138 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
139 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400140 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400141 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400142 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
143 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
144 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400145 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
146 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
147 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
148 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
149 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
150 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
151
Tim Edwards6d9739d2020-10-19 11:00:49 -0400152 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400153 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400154 wire [`MPRJ_IO_PADS-1:0] user_io_in;
155 wire [`MPRJ_IO_PADS-1:0] user_io_out;
156
157 /* Padframe control signals */
158 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
159 wire mgmt_serial_clock;
160 wire mgmt_serial_resetn;
161
Tim Edwards6d9739d2020-10-19 11:00:49 -0400162 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400163 // There are two types of GPIO connections:
164 // (1) Full Bidirectional: Management connects to in, out, and oeb
165 // Uses: JTAG and SDO
166 // (2) Selectable bidirectional: Management connects to in and out,
167 // which are tied together. oeb is grounded (oeb from the
168 // configuration is used)
169
170 // SDI = mprj_io[2] (input)
171 // CSB = mprj_io[3] (input)
172 // SCK = mprj_io[4] (input)
173 // ser_rx = mprj_io[5] (input)
174 // ser_tx = mprj_io[6] (output)
175 // irq = mprj_io[7] (input)
176
177 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
178 wire jtag_out, sdo_out;
179 wire jtag_outenb, sdo_outenb;
180
181 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
182 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
183 wire [1:0] mgmt_io_nc2; /* no-connects */
184
Tim Edwards04ba17f2020-10-02 22:27:50 -0400185 // Power-on-reset signal. The reset pad generates the sense-inverted
186 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
187 // derived.
188
Tim Edwardsef8312e2020-09-22 17:20:06 -0400189 wire porb_h;
190 wire porb_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400191
Tim Edwardsf51dd082020-10-05 16:30:24 -0400192 wire rstb_h;
193 wire rstb_l;
194
Tim Edwards44bab472020-10-04 22:09:54 -0400195 // To be considered: Master hold signal on all user pads (?)
196 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
197 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400198 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400199 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
200
Tim Edwardsef8312e2020-09-22 17:20:06 -0400201 chip_io padframe(
202 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400203 .vddio(vddio),
204 .vssio(vssio),
205 .vdda(vdda),
206 .vssa(vssa),
207 .vccd(vccd),
208 .vssd(vssd),
209 .vdda1(vdda1),
210 .vdda2(vdda2),
211 .vssa1(vssa1),
212 .vssa2(vssa2),
213 .vccd1(vccd1),
214 .vccd2(vccd2),
215 .vssd1(vssd1),
216 .vssd2(vssd2),
217
Tim Edwardsef8312e2020-09-22 17:20:06 -0400218 .gpio(gpio),
219 .mprj_io(mprj_io),
220 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400221 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400222 .flash_csb(flash_csb),
223 .flash_clk(flash_clk),
224 .flash_io0(flash_io0),
225 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400226 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400227 .porb_h(porb_h),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400228 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400229 .clock_core(clock_core),
230 .gpio_out_core(gpio_out_core),
231 .gpio_in_core(gpio_in_core),
232 .gpio_mode0_core(gpio_mode0_core),
233 .gpio_mode1_core(gpio_mode1_core),
234 .gpio_outenb_core(gpio_outenb_core),
235 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400236 .flash_csb_core(flash_csb_core),
237 .flash_clk_core(flash_clk_core),
238 .flash_csb_oeb_core(flash_csb_oeb_core),
239 .flash_clk_oeb_core(flash_clk_oeb_core),
240 .flash_io0_oeb_core(flash_io0_oeb_core),
241 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400242 .flash_csb_ieb_core(flash_csb_ieb_core),
243 .flash_clk_ieb_core(flash_clk_ieb_core),
244 .flash_io0_ieb_core(flash_io0_ieb_core),
245 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400246 .flash_io0_do_core(flash_io0_do_core),
247 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400248 .flash_io0_di_core(flash_io0_di_core),
249 .flash_io1_di_core(flash_io1_di_core),
Tim Edwards44bab472020-10-04 22:09:54 -0400250 .por(~porb_l),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400251 .mprj_io_in(mprj_io_in),
252 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400253 .mprj_io_oeb(mprj_io_oeb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400254 .mprj_io_hldh_n(mprj_io_hldh_n),
255 .mprj_io_enh(mprj_io_enh),
256 .mprj_io_inp_dis(mprj_io_inp_dis),
257 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400258 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
259 .mprj_io_slow_sel(mprj_io_slow_sel),
260 .mprj_io_holdover(mprj_io_holdover),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400261 .mprj_io_analog_en(mprj_io_analog_en),
262 .mprj_io_analog_sel(mprj_io_analog_sel),
263 .mprj_io_analog_pol(mprj_io_analog_pol),
264 .mprj_io_dm(mprj_io_dm)
265 );
266
267 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400268 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400269 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400270 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400271
272 wire [7:0] spi_ro_config_core;
273
274 // LA signals
275 wire [127:0] la_output_core; // From CPU to MPRJ
276 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
277 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
278 wire [127:0] la_output_mprj; // From MPRJ to CPU
279 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
280
Tim Edwards6d9739d2020-10-19 11:00:49 -0400281 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400282 wire mprj_cyc_o_core;
283 wire mprj_stb_o_core;
284 wire mprj_we_o_core;
285 wire [3:0] mprj_sel_o_core;
286 wire [31:0] mprj_adr_o_core;
287 wire [31:0] mprj_dat_o_core;
288 wire mprj_ack_i_core;
289 wire [31:0] mprj_dat_i_core;
290
291 // WB MI B (xbar)
292 wire xbar_cyc_o_core;
293 wire xbar_stb_o_core;
294 wire xbar_we_o_core;
295 wire [3:0] xbar_sel_o_core;
296 wire [31:0] xbar_adr_o_core;
297 wire [31:0] xbar_dat_o_core;
298 wire xbar_ack_i_core;
299 wire [31:0] xbar_dat_i_core;
300
Tim Edwards04ba17f2020-10-02 22:27:50 -0400301 // Mask revision
302 wire [31:0] mask_rev;
303
Tim Edwards9eda80d2020-10-08 21:36:44 -0400304 mgmt_core #(
305 .MPRJ_IO_PADS(`MPRJ_IO_PADS),
306 .MPRJ_PWR_PADS(`MPRJ_PWR_PADS)
307 ) soc (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400308 `ifdef LVS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400309 .vdd(vccd),
310 .vss(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400311 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400312 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400313 .gpio_out_pad(gpio_out_core),
314 .gpio_in_pad(gpio_in_core),
315 .gpio_mode0_pad(gpio_mode0_core),
316 .gpio_mode1_pad(gpio_mode1_core),
317 .gpio_outenb_pad(gpio_outenb_core),
318 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400319 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400320 .flash_csb(flash_csb_core),
321 .flash_clk(flash_clk_core),
322 .flash_csb_oeb(flash_csb_oeb_core),
323 .flash_clk_oeb(flash_clk_oeb_core),
324 .flash_io0_oeb(flash_io0_oeb_core),
325 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400326 .flash_csb_ieb(flash_csb_ieb_core),
327 .flash_clk_ieb(flash_clk_ieb_core),
328 .flash_io0_ieb(flash_io0_ieb_core),
329 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400330 .flash_io0_do(flash_io0_do_core),
331 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400332 .flash_io0_di(flash_io0_di_core),
333 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400334 // Master Reset
335 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400336 .porb(porb_l),
337 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400338 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400339 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400340 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400341 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400342 // Logic Analyzer
343 .la_input(la_data_out_mprj),
344 .la_output(la_output_core),
345 .la_oen(la_oen),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400346 // User Project IO Control
Tim Edwards04ba17f2020-10-02 22:27:50 -0400347 .mprj_io_loader_resetn(mprj_io_loader_resetn),
348 .mprj_io_loader_clock(mprj_io_loader_clock),
349 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400350 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400351 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
352 .sdo_out(sdo_out),
353 .sdo_outenb(sdo_outenb),
354 .jtag_out(jtag_out),
355 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400356 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400357 .mprj_cyc_o(mprj_cyc_o_core),
358 .mprj_stb_o(mprj_stb_o_core),
359 .mprj_we_o(mprj_we_o_core),
360 .mprj_sel_o(mprj_sel_o_core),
361 .mprj_adr_o(mprj_adr_o_core),
362 .mprj_dat_o(mprj_dat_o_core),
363 .mprj_ack_i(mprj_ack_i_core),
364 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400365 // mask data
366 .mask_rev(mask_rev)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400367 );
368
Tim Edwards53d92182020-10-11 21:47:40 -0400369 /* Clock and reset to user space are passed through a tristate */
370 /* buffer like the above, but since they are intended to be */
371 /* always active, connect the enable to the logic-1 output from */
372 /* the vccd1 domain. */
373
374 wire mprj_clock;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400375 wire mprj_clock2;
Tim Edwards53d92182020-10-11 21:47:40 -0400376 wire mprj_resetn;
377 wire mprj_cyc_o_user;
378 wire mprj_stb_o_user;
379 wire mprj_we_o_user;
380 wire [3:0] mprj_sel_o_user;
381 wire [31:0] mprj_adr_o_user;
382 wire [31:0] mprj_dat_o_user;
383
384 mgmt_protect mgmt_buffers (
Tim Edwards53d92182020-10-11 21:47:40 -0400385 .vccd(vccd),
386 .vssd(vssd),
387 .vccd1(vccd1),
388 .vssd1(vssd1),
Tim Edwards21a9aac2020-10-12 22:05:18 -0400389
Tim Edwards53d92182020-10-11 21:47:40 -0400390 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400391 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400392 .caravel_rstn(caravel_rstn),
393 .mprj_cyc_o_core(mprj_cyc_o_core),
394 .mprj_stb_o_core(mprj_stb_o_core),
395 .mprj_we_o_core(mprj_we_o_core),
396 .mprj_sel_o_core(mprj_sel_o_core),
397 .mprj_adr_o_core(mprj_adr_o_core),
398 .mprj_dat_o_core(mprj_dat_o_core),
399 .la_output_core(la_output_core),
400 .la_oen(la_oen),
401
402 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400403 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400404 .user_resetn(mprj_resetn),
405 .mprj_cyc_o_user(mprj_cyc_o_user),
406 .mprj_stb_o_user(mprj_stb_o_user),
407 .mprj_we_o_user(mprj_we_o_user),
408 .mprj_sel_o_user(mprj_sel_o_user),
409 .mprj_adr_o_user(mprj_adr_o_user),
410 .mprj_dat_o_user(mprj_dat_o_user),
411 .la_data_in_mprj(la_data_in_mprj)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400412 );
Tim Edwards53d92182020-10-11 21:47:40 -0400413
Tim Edwardsef8312e2020-09-22 17:20:06 -0400414
Tim Edwardsb86fc842020-10-13 17:11:54 -0400415 /*----------------------------------------------*/
416 /* Wrapper module around the user project */
417 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400418
Tim Edwardsb86fc842020-10-13 17:11:54 -0400419 user_project_wrapper #(
Tim Edwards9eda80d2020-10-08 21:36:44 -0400420 .IO_PADS(`MPRJ_IO_PADS),
421 .PWR_PADS(`MPRJ_PWR_PADS)
422 ) mprj (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400423 .vdda1(vdda1), // User area 1 3.3V power
424 .vdda2(vdda2), // User area 2 3.3V power
425 .vssa1(vssa1), // User area 1 analog ground
426 .vssa2(vssa2), // User area 2 analog ground
427 .vccd1(vccd1), // User area 1 1.8V power
428 .vccd2(vccd2), // User area 2 1.8V power
429 .vssd1(vssd1), // User area 1 digital ground
430 .vssd2(vssd2), // User area 2 digital ground
431
Tim Edwards53d92182020-10-11 21:47:40 -0400432 .wb_clk_i(mprj_clock),
433 .wb_rst_i(!mprj_resetn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400434 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400435 .wbs_cyc_i(mprj_cyc_o_user),
436 .wbs_stb_i(mprj_stb_o_user),
437 .wbs_we_i(mprj_we_o_user),
438 .wbs_sel_i(mprj_sel_o_user),
439 .wbs_adr_i(mprj_adr_o_user),
440 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400441 .wbs_ack_o(mprj_ack_i_core),
442 .wbs_dat_o(mprj_dat_i_core),
443 // Logic Analyzer
444 .la_data_in(la_data_in_mprj),
445 .la_data_out(la_data_out_mprj),
446 .la_oen (la_oen),
447 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400448 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400449 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400450 .io_oeb(user_io_oeb),
451 // Independent clock
452 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400453 );
454
Tim Edwards05537512020-10-06 14:59:26 -0400455 /*--------------------------------------*/
456 /* End user project instantiation */
457 /*--------------------------------------*/
458
Tim Edwards04ba17f2020-10-02 22:27:50 -0400459 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
460
Tim Edwards251e0df2020-10-05 11:02:12 -0400461 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400462
Tim Edwards251e0df2020-10-05 11:02:12 -0400463 // Each control block sits next to an I/O pad in the user area.
464 // It gets input through a serial chain from the previous control
465 // block and passes it to the next control block. Due to the nature
466 // of the shift register, bits are presented in reverse, as the first
467 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400468
Tim Edwards89f09242020-10-05 15:17:34 -0400469 // There are two types of block; the first two are configured to be
470 // full bidirectional under control of the management Soc (JTAG and
471 // SDO). The rest are configured to be default (input).
472
Tim Edwards251e0df2020-10-05 11:02:12 -0400473 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400474 .DM_INIT(3'b110), // Mode = output, strong up/down
475 .OENB_INIT(1'b0) // Enable output signaling from wire
476 ) gpio_control_bidir [1:0] (
Tim Edwards53d92182020-10-11 21:47:40 -0400477 `ifdef LVS
478 inout vccd,
479 inout vssd,
480 inout vccd1,
481 inout vssd1,
482 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400483
Tim Edwards04ba17f2020-10-02 22:27:50 -0400484 // Management Soc-facing signals
485
Tim Edwardsc18c4742020-10-03 11:26:39 -0400486 .resetn(mprj_io_loader_resetn),
487 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400488
Tim Edwards89f09242020-10-05 15:17:34 -0400489 .mgmt_gpio_in(mgmt_io_in[1:0]),
490 .mgmt_gpio_out({sdo_out, jtag_out}),
491 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400492
493 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400494 .serial_data_in(gpio_serial_link_shifted[1:0]),
495 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400496
497 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400498 .user_gpio_out(user_io_out[1:0]),
499 .user_gpio_oeb(user_io_oeb[1:0]),
500 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400501
502 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400503 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
504 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
505 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
506 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
507 .pad_gpio_holdover(mprj_io_holdover[1:0]),
508 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
509 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
510 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
511 .pad_gpio_dm(mprj_io_dm[5:0]),
512 .pad_gpio_outenb(mprj_io_oeb[1:0]),
513 .pad_gpio_out(mprj_io_out[1:0]),
514 .pad_gpio_in(mprj_io_in[1:0])
515 );
516
517 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Tim Edwards53d92182020-10-11 21:47:40 -0400518 `ifdef LVS
519 inout vccd,
520 inout vssd,
521 inout vccd1,
522 inout vssd1,
523 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400524
525 // Management Soc-facing signals
526
527 .resetn(mprj_io_loader_resetn),
528 .serial_clock(mprj_io_loader_clock),
529
530 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
531 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
532 .mgmt_gpio_oeb(1'b1),
533
534 // Serial data chain for pad configuration
535 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
536 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
537
538 // User-facing signals
539 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
540 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
541 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
542
543 // Pad-facing signals (Pad GPIOv2)
544 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
545 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
546 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
547 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
548 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
549 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
550 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
551 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
552 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
553 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
554 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
555 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400556 );
557
Tim Edwardsf51dd082020-10-05 16:30:24 -0400558 sky130_fd_sc_hvl__lsbufhv2lv porb_level (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400559 .VPWR(vddio),
560 .VPB(vddio),
561 .LVPWR(vccd),
562 .VNB(vssio),
563 .VGND(vssio),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400564 .A(porb_h),
565 .X(porb_l)
566 );
567
Tim Edwards04ba17f2020-10-02 22:27:50 -0400568 user_id_programming #(
569 .USER_PROJECT_ID(USER_PROJECT_ID)
570 ) user_id_value (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400571 .vdd1v8(vccd),
572 .vss(vssd),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400573 .mask_rev(mask_rev)
574 );
575
Tim Edwardsf51dd082020-10-05 16:30:24 -0400576 // Power-on-reset circuit
577 simple_por por (
Tim Edwards9eda80d2020-10-08 21:36:44 -0400578 .vdd3v3(vddio),
579 .vss(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400580 .porb_h(porb_h)
581 );
582
583 // XRES (chip input pin reset) reset level converter
584 sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
Tim Edwards21a9aac2020-10-12 22:05:18 -0400585 .VPWR(vddio),
586 .VPB(vddio),
587 .LVPWR(vccd),
588 .VNB(vssio),
589 .VGND(vssio),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400590 .A(rstb_h),
591 .X(rstb_l)
592 );
593
Tim Edwardsef8312e2020-09-22 17:20:06 -0400594endmodule