blob: 58dd69275e3c66e9ca549a14494902fd13d2c7e6 [file] [log] [blame]
Tim Edwardsef8312e2020-09-22 17:20:06 -04001/*--------------------------------------------------------------*/
2/* caravel, a project harness for the Google/SkyWater sky130 */
3/* fabrication process and open source PDK */
4/* */
5/* Copyright 2020 efabless, Inc. */
6/* Written by Tim Edwards, December 2019 */
7/* and Mohamed Shalan, August 2020 */
8/* This file is open source hardware released under the */
9/* Apache 2.0 license. See file LICENSE. */
10/* */
11/*--------------------------------------------------------------*/
12
13`timescale 1 ns / 1 ps
14
15`define USE_OPENRAM
16`define USE_PG_PIN
17`define functional
Tim Edwardsc5265b82020-09-25 17:08:59 -040018`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040019
20`define MPRJ_IO_PADS 32
21
22`include "pads.v"
23
24/* To be removed when sky130_fd_io is available */
25// `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/s8iom0s8.v"
26// `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/power_pads_lib.v"
27// `include "/ef/tech/SW/sky130A/libs.ref/verilog/sky130_fd_sc_hd/sky130_fd_sc_hd.v"
28// `include "/ef/tech/SW/sky130A/libs.ref/verilog/sky130_fd_sc_hvl/sky130_fd_sc_hvl.v"
29
30/* Local only, please remove */
31// `include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
32// `include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_io/verilog/power_pads_lib.v"
33`include "/home/tim/projects/efabless/tech/SW/EFS8A/libs.ref/s8iom0s8/verilog/s8iom0s8.v"
Tim Edwardsc5265b82020-09-25 17:08:59 -040034// `include "/home/tim/projects/efabless/tech/SW/EFS8A/libs.ref/s8iom0s8/verilog/power_pads_lib.v"
35`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
36`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
37`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
38`include "/home/tim/projects/efabless/tech/SW/sky130A/libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040039
40`include "mgmt_soc.v"
Tim Edwards44bab472020-10-04 22:09:54 -040041`include "housekeeping_spi.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040042`include "digital_pll.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040043`include "caravel_clkrst.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040044`include "mprj_counter.v"
45`include "mgmt_core.v"
46`include "mprj_io.v"
47`include "chip_io.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040048`include "user_id_programming.v"
49`include "gpio_control_block.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040050`include "simple_por.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040051
52`ifdef USE_OPENRAM
53 `include "sram_1rw1r_32_8192_8_sky130.v"
54`endif
55
56module caravel (
57 inout vdd3v3,
58 inout vdd1v8,
59 inout vss,
Tim Edwards04ba17f2020-10-02 22:27:50 -040060 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -040061 inout [`MPRJ_IO_PADS-1:0] mprj_io,
62 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -040063 input resetb,
64
65 // Note that only two pins are available on the flash so dual and
66 // quad flash modes are not available.
67
Tim Edwardsef8312e2020-09-22 17:20:06 -040068 output flash_csb,
69 output flash_clk,
70 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -040071 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -040072);
73
Tim Edwards04ba17f2020-10-02 22:27:50 -040074 //------------------------------------------------------------
75 // This value is uniquely defined for each user project.
76 //------------------------------------------------------------
77 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -040078
Tim Edwards04ba17f2020-10-02 22:27:50 -040079 // These pins are overlaid on mprj_io space. They have the function
80 // below when the management processor is in reset, or in the default
81 // configuration. They are assigned to uses in the user space by the
82 // configuration program running off of the SPI flash. Note that even
83 // when the user has taken control of these pins, they can be restored
84 // to the original use by setting the resetb pin low. The SPI pins and
85 // UART pins can be connected directly to an FTDI chip as long as the
86 // FTDI chip sets these lines to high impedence (input function) at
87 // all times except when holding the chip in reset.
88
89 // JTAG = mprj_io[0] (inout)
90 // SDO = mprj_io[1] (output)
91 // SDI = mprj_io[2] (input)
92 // CSB = mprj_io[3] (input)
93 // SCK = mprj_io[4] (input)
94 // ser_rx = mprj_io[5] (input)
95 // ser_tx = mprj_io[6] (output)
96 // irq = mprj_io[7] (input)
97
98 // These pins are reserved for any project that wants to incorporate
99 // its own processor and flash controller. While a user project can
100 // technically use any available I/O pins for the purpose, these
101 // four pins connect to a pass-through mode from the SPI slave (pins
102 // 1-4 above) so that any SPI flash connected to these specific pins
103 // can be accessed through the SPI slave even when the processor is in
104 // reset.
105
Tim Edwards44bab472020-10-04 22:09:54 -0400106 // user_flash_csb = mprj_io[8]
107 // user_flash_sck = mprj_io[9]
108 // user_flash_io0 = mprj_io[10]
109 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400110
111 // One-bit GPIO dedicated to management SoC (outside of user control)
112 wire gpio_out_core;
113 wire gpio_in_core;
114 wire gpio_mode0_core;
115 wire gpio_mode1_core;
116 wire gpio_outenb_core;
117 wire gpio_inenb_core;
118
119 // Mega-Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400120 wire mprj_io_loader_resetn;
121 wire mprj_io_loader_clock;
122 wire mprj_io_loader_data;
123
Tim Edwardsef8312e2020-09-22 17:20:06 -0400124 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
125 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
126 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400127 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400128 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400129 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
130 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
131 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400132 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
133 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
134 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
135 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
136 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
137 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
138
Tim Edwards04ba17f2020-10-02 22:27:50 -0400139 // Mega-Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400140 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400141 wire [`MPRJ_IO_PADS-1:0] user_io_in;
142 wire [`MPRJ_IO_PADS-1:0] user_io_out;
143
144 /* Padframe control signals */
145 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
146 wire mgmt_serial_clock;
147 wire mgmt_serial_resetn;
148
Tim Edwards44bab472020-10-04 22:09:54 -0400149 // Mega-Project Control management I/O
150 // There are two types of GPIO connections:
151 // (1) Full Bidirectional: Management connects to in, out, and oeb
152 // Uses: JTAG and SDO
153 // (2) Selectable bidirectional: Management connects to in and out,
154 // which are tied together. oeb is grounded (oeb from the
155 // configuration is used)
156
157 // SDI = mprj_io[2] (input)
158 // CSB = mprj_io[3] (input)
159 // SCK = mprj_io[4] (input)
160 // ser_rx = mprj_io[5] (input)
161 // ser_tx = mprj_io[6] (output)
162 // irq = mprj_io[7] (input)
163
164 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
165 wire jtag_out, sdo_out;
166 wire jtag_outenb, sdo_outenb;
167
168 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
169 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
170 wire [1:0] mgmt_io_nc2; /* no-connects */
171
Tim Edwards04ba17f2020-10-02 22:27:50 -0400172 // Power-on-reset signal. The reset pad generates the sense-inverted
173 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
174 // derived.
175
Tim Edwardsef8312e2020-09-22 17:20:06 -0400176 wire porb_h;
177 wire porb_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400178
Tim Edwardsf51dd082020-10-05 16:30:24 -0400179 wire rstb_h;
180 wire rstb_l;
181
Tim Edwards44bab472020-10-04 22:09:54 -0400182 // To be considered: Master hold signal on all user pads (?)
183 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
184 // and setting enh to porb_h.
185 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vdd3v3}};
186 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
187
Tim Edwardsef8312e2020-09-22 17:20:06 -0400188 chip_io padframe(
189 // Package Pins
190 .vdd3v3(vdd3v3),
191 .vdd1v8(vdd1v8),
192 .vss(vss),
193 .gpio(gpio),
194 .mprj_io(mprj_io),
195 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400196 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400197 .flash_csb(flash_csb),
198 .flash_clk(flash_clk),
199 .flash_io0(flash_io0),
200 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400201 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400202 .porb_h(porb_h),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400203 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400204 .clock_core(clock_core),
205 .gpio_out_core(gpio_out_core),
206 .gpio_in_core(gpio_in_core),
207 .gpio_mode0_core(gpio_mode0_core),
208 .gpio_mode1_core(gpio_mode1_core),
209 .gpio_outenb_core(gpio_outenb_core),
210 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400211 .flash_csb_core(flash_csb_core),
212 .flash_clk_core(flash_clk_core),
213 .flash_csb_oeb_core(flash_csb_oeb_core),
214 .flash_clk_oeb_core(flash_clk_oeb_core),
215 .flash_io0_oeb_core(flash_io0_oeb_core),
216 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400217 .flash_csb_ieb_core(flash_csb_ieb_core),
218 .flash_clk_ieb_core(flash_clk_ieb_core),
219 .flash_io0_ieb_core(flash_io0_ieb_core),
220 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400221 .flash_io0_do_core(flash_io0_do_core),
222 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400223 .flash_io0_di_core(flash_io0_di_core),
224 .flash_io1_di_core(flash_io1_di_core),
Tim Edwards44bab472020-10-04 22:09:54 -0400225 .por(~porb_l),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400226 .mprj_io_in(mprj_io_in),
227 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400228 .mprj_io_oeb(mprj_io_oeb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400229 .mprj_io_hldh_n(mprj_io_hldh_n),
230 .mprj_io_enh(mprj_io_enh),
231 .mprj_io_inp_dis(mprj_io_inp_dis),
232 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400233 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
234 .mprj_io_slow_sel(mprj_io_slow_sel),
235 .mprj_io_holdover(mprj_io_holdover),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400236 .mprj_io_analog_en(mprj_io_analog_en),
237 .mprj_io_analog_sel(mprj_io_analog_sel),
238 .mprj_io_analog_pol(mprj_io_analog_pol),
239 .mprj_io_dm(mprj_io_dm)
240 );
241
242 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400243 wire caravel_clk;
244 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400245
246 wire [7:0] spi_ro_config_core;
247
248 // LA signals
249 wire [127:0] la_output_core; // From CPU to MPRJ
250 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
251 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
252 wire [127:0] la_output_mprj; // From MPRJ to CPU
253 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
254
255 // WB MI A (Mega Project)
256 wire mprj_cyc_o_core;
257 wire mprj_stb_o_core;
258 wire mprj_we_o_core;
259 wire [3:0] mprj_sel_o_core;
260 wire [31:0] mprj_adr_o_core;
261 wire [31:0] mprj_dat_o_core;
262 wire mprj_ack_i_core;
263 wire [31:0] mprj_dat_i_core;
264
265 // WB MI B (xbar)
266 wire xbar_cyc_o_core;
267 wire xbar_stb_o_core;
268 wire xbar_we_o_core;
269 wire [3:0] xbar_sel_o_core;
270 wire [31:0] xbar_adr_o_core;
271 wire [31:0] xbar_dat_o_core;
272 wire xbar_ack_i_core;
273 wire [31:0] xbar_dat_i_core;
274
Tim Edwards04ba17f2020-10-02 22:27:50 -0400275 // Mask revision
276 wire [31:0] mask_rev;
277
Tim Edwardsef8312e2020-09-22 17:20:06 -0400278 mgmt_core soc (
279 `ifdef LVS
280 .vdd1v8(vdd1v8),
281 .vss(vss),
282 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400283 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400284 .gpio_out_pad(gpio_out_core),
285 .gpio_in_pad(gpio_in_core),
286 .gpio_mode0_pad(gpio_mode0_core),
287 .gpio_mode1_pad(gpio_mode1_core),
288 .gpio_outenb_pad(gpio_outenb_core),
289 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400290 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400291 .flash_csb(flash_csb_core),
292 .flash_clk(flash_clk_core),
293 .flash_csb_oeb(flash_csb_oeb_core),
294 .flash_clk_oeb(flash_clk_oeb_core),
295 .flash_io0_oeb(flash_io0_oeb_core),
296 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400297 .flash_csb_ieb(flash_csb_ieb_core),
298 .flash_clk_ieb(flash_clk_ieb_core),
299 .flash_io0_ieb(flash_io0_ieb_core),
300 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400301 .flash_io0_do(flash_io0_do_core),
302 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400303 .flash_io0_di(flash_io0_di_core),
304 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400305 // Master Reset
306 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400307 .porb(porb_l),
308 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400309 .clock(clock_core),
310 .pll_clk16(pll_clk16),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400311 .core_clk(caravel_clk),
312 .core_rstn(caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400313 // Logic Analyzer
314 .la_input(la_data_out_mprj),
315 .la_output(la_output_core),
316 .la_oen(la_oen),
317 // Mega Project IO Control
Tim Edwards04ba17f2020-10-02 22:27:50 -0400318 .mprj_io_loader_resetn(mprj_io_loader_resetn),
319 .mprj_io_loader_clock(mprj_io_loader_clock),
320 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400321 .mgmt_in_data(mgmt_io_in),
Tim Edwards44bab472020-10-04 22:09:54 -0400322 .mgmt_outz_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwards89f09242020-10-05 15:17:34 -0400323 .mgmt_out_data({mgmt_io_nc1, sdo_out, jtag_out}),
Tim Edwards44bab472020-10-04 22:09:54 -0400324 .mgmt_oeb_data({mgmt_io_nc3, sdo_outenb, jtag_outenb}),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400325 // Mega Project Slave ports (WB MI A)
326 .mprj_cyc_o(mprj_cyc_o_core),
327 .mprj_stb_o(mprj_stb_o_core),
328 .mprj_we_o(mprj_we_o_core),
329 .mprj_sel_o(mprj_sel_o_core),
330 .mprj_adr_o(mprj_adr_o_core),
331 .mprj_dat_o(mprj_dat_o_core),
332 .mprj_ack_i(mprj_ack_i_core),
333 .mprj_dat_i(mprj_dat_i_core),
334 // Xbar Switch (WB MI B)
335 .xbar_cyc_o(xbar_cyc_o_core),
336 .xbar_stb_o(xbar_stb_o_core),
337 .xbar_we_o (xbar_we_o_core),
338 .xbar_sel_o(xbar_sel_o_core),
339 .xbar_adr_o(xbar_adr_o_core),
340 .xbar_dat_o(xbar_dat_o_core),
341 .xbar_ack_i(xbar_ack_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400342 .xbar_dat_i(xbar_dat_i_core),
343 // mask data
344 .mask_rev(mask_rev)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400345 );
346
Tim Edwards04ba17f2020-10-02 22:27:50 -0400347 sky130_fd_sc_hd__ebufn_8 la_buf [127:0] (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400348 .Z(la_data_in_mprj),
349 .A(la_output_core),
Tim Edwardsc5265b82020-09-25 17:08:59 -0400350 .TE_B(la_oen)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400351 );
352
353 mega_project mprj (
Tim Edwards04ba17f2020-10-02 22:27:50 -0400354 .wb_clk_i(caravel_clk),
355 .wb_rst_i(!caravel_rstn),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400356 // MGMT SoC Wishbone Slave
357 .wbs_cyc_i(mprj_cyc_o_core),
358 .wbs_stb_i(mprj_stb_o_core),
359 .wbs_we_i(mprj_we_o_core),
360 .wbs_sel_i(mprj_sel_o_core),
361 .wbs_adr_i(mprj_adr_o_core),
362 .wbs_dat_i(mprj_dat_o_core),
363 .wbs_ack_o(mprj_ack_i_core),
364 .wbs_dat_o(mprj_dat_i_core),
365 // Logic Analyzer
366 .la_data_in(la_data_in_mprj),
367 .la_data_out(la_data_out_mprj),
368 .la_oen (la_oen),
369 // IO Pads
Tim Edwards89f09242020-10-05 15:17:34 -0400370 .io_in (mprj_io_in),
371 .io_out() // ???
Tim Edwardsef8312e2020-09-22 17:20:06 -0400372 );
373
Tim Edwards04ba17f2020-10-02 22:27:50 -0400374 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
375
Tim Edwards251e0df2020-10-05 11:02:12 -0400376 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400377
Tim Edwards251e0df2020-10-05 11:02:12 -0400378 // Each control block sits next to an I/O pad in the user area.
379 // It gets input through a serial chain from the previous control
380 // block and passes it to the next control block. Due to the nature
381 // of the shift register, bits are presented in reverse, as the first
382 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400383
Tim Edwards89f09242020-10-05 15:17:34 -0400384 // There are two types of block; the first two are configured to be
385 // full bidirectional under control of the management Soc (JTAG and
386 // SDO). The rest are configured to be default (input).
387
Tim Edwards251e0df2020-10-05 11:02:12 -0400388 gpio_control_block #(
Tim Edwards89f09242020-10-05 15:17:34 -0400389 .DM_INIT(3'b110), // Mode = output, strong up/down
390 .OENB_INIT(1'b0) // Enable output signaling from wire
391 ) gpio_control_bidir [1:0] (
Tim Edwards44bab472020-10-04 22:09:54 -0400392
Tim Edwards04ba17f2020-10-02 22:27:50 -0400393 // Management Soc-facing signals
394
Tim Edwardsc18c4742020-10-03 11:26:39 -0400395 .resetn(mprj_io_loader_resetn),
396 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400397
Tim Edwards89f09242020-10-05 15:17:34 -0400398 .mgmt_gpio_in(mgmt_io_in[1:0]),
399 .mgmt_gpio_out({sdo_out, jtag_out}),
400 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400401
402 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400403 .serial_data_in(gpio_serial_link_shifted[1:0]),
404 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400405
406 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400407 .user_gpio_out(user_io_out[1:0]),
408 .user_gpio_oeb(user_io_oeb[1:0]),
409 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400410
411 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400412 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
413 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
414 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
415 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
416 .pad_gpio_holdover(mprj_io_holdover[1:0]),
417 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
418 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
419 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
420 .pad_gpio_dm(mprj_io_dm[5:0]),
421 .pad_gpio_outenb(mprj_io_oeb[1:0]),
422 .pad_gpio_out(mprj_io_out[1:0]),
423 .pad_gpio_in(mprj_io_in[1:0])
424 );
425
426 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
427
428 // Management Soc-facing signals
429
430 .resetn(mprj_io_loader_resetn),
431 .serial_clock(mprj_io_loader_clock),
432
433 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
434 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
435 .mgmt_gpio_oeb(1'b1),
436
437 // Serial data chain for pad configuration
438 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
439 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
440
441 // User-facing signals
442 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
443 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
444 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
445
446 // Pad-facing signals (Pad GPIOv2)
447 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
448 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
449 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
450 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
451 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
452 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
453 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
454 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
455 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
456 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
457 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
458 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400459 );
460
Tim Edwardsf51dd082020-10-05 16:30:24 -0400461 sky130_fd_sc_hvl__lsbufhv2lv porb_level (
Tim Edwardsef8312e2020-09-22 17:20:06 -0400462 `ifdef LVS
463 .vpwr(vdd3v3),
464 .vpb(vdd3v3),
465 .lvpwr(vdd1v8),
466 .vnb(vss),
467 .vgnd(vss),
468 `endif
469 .A(porb_h),
470 .X(porb_l)
471 );
472
Tim Edwards04ba17f2020-10-02 22:27:50 -0400473 user_id_programming #(
474 .USER_PROJECT_ID(USER_PROJECT_ID)
475 ) user_id_value (
476 .mask_rev(mask_rev)
477 );
478
Tim Edwardsf51dd082020-10-05 16:30:24 -0400479 // Power-on-reset circuit
480 simple_por por (
481 .vdd3v3(vdd3v3),
482 .vss(vss),
483 .porb_h(porb_h)
484 );
485
486 // XRES (chip input pin reset) reset level converter
487 sky130_fd_sc_hvl__lsbufhv2lv rstb_level (
488 `ifdef LVS
489 .vpwr(vdd3v3),
490 .vpb(vdd3v3),
491 .lvpwr(vdd1v8),
492 .vnb(vss),
493 .vgnd(vss),
494 `endif
495 .A(rstb_h),
496 .X(rstb_l)
497 );
498
Tim Edwardsef8312e2020-09-22 17:20:06 -0400499endmodule