blob: fa85ee27d3f8fa54ac26adafec228bba3e17ddb2 [file] [log] [blame]
Tim Edwards581068f2020-11-19 12:45:25 -05001// `default_nettype none
agorararmard6c766a82020-12-10 18:13:12 +02002// SPDX-FileCopyrightText: 2020 Efabless Corporation
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15// SPDX-License-Identifier: Apache-2.0
Tim Edwardsef8312e2020-09-22 17:20:06 -040016/*--------------------------------------------------------------*/
17/* caravel, a project harness for the Google/SkyWater sky130 */
18/* fabrication process and open source PDK */
19/* */
20/* Copyright 2020 efabless, Inc. */
21/* Written by Tim Edwards, December 2019 */
22/* and Mohamed Shalan, August 2020 */
23/* This file is open source hardware released under the */
24/* Apache 2.0 license. See file LICENSE. */
25/* */
26/*--------------------------------------------------------------*/
27
28`timescale 1 ns / 1 ps
29
Tim Edwardsc5265b82020-09-25 17:08:59 -040030`define UNIT_DELAY #1
Tim Edwardsef8312e2020-09-22 17:20:06 -040031
Ahmed Ghazy31c34652020-12-01 19:59:44 +020032`ifdef SIM
33
34`define USE_POWER_PINS
35
Ahmed Ghazy22d29d62020-10-28 03:42:02 +020036`include "defines.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040037`include "pads.v"
38
Tim Edwards4286ae12020-10-11 14:52:01 -040039/* NOTE: Need to pass the PDK root directory to iverilog with option -I */
Tim Edwardsef8312e2020-09-22 17:20:06 -040040
Tim Edwards4286ae12020-10-11 14:52:01 -040041`include "libs.ref/sky130_fd_io/verilog/sky130_fd_io.v"
Tim Edwards4c733352020-10-12 16:32:36 -040042`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io.v"
Ahmed Ghazy65065c62020-12-01 17:06:16 +020043`include "libs.ref/sky130_fd_io/verilog/sky130_ef_io__gpiov2_pad_wrapped.v"
Tim Edwards4286ae12020-10-11 14:52:01 -040044
45`include "libs.ref/sky130_fd_sc_hd/verilog/primitives.v"
46`include "libs.ref/sky130_fd_sc_hd/verilog/sky130_fd_sc_hd.v"
47`include "libs.ref/sky130_fd_sc_hvl/verilog/primitives.v"
48`include "libs.ref/sky130_fd_sc_hvl/verilog/sky130_fd_sc_hvl.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040049
manarabdelatya115bdd2020-12-01 11:19:12 +020050`ifdef GL
51 `include "gl/mgmt_core.v"
manarabdelatyc7524312020-12-07 18:13:54 +020052 `include "gl/digital_pll.v"
53 `include "gl/DFFRAM.v"
54 `include "gl/storage.v"
55 `include "gl/user_id_programming.v"
56 `include "gl/chip_io.v"
manarabdelatya115bdd2020-12-01 11:19:12 +020057`else
58 `include "mgmt_soc.v"
59 `include "housekeeping_spi.v"
60 `include "caravel_clocking.v"
61 `include "mgmt_core.v"
manarabdelatyc7524312020-12-07 18:13:54 +020062 `include "digital_pll.v"
63 `include "DFFRAM.v"
64 `include "DFFRAMBB.v"
65 `include "storage.v"
66 `include "user_id_programming.v"
67 `include "clock_div.v"
68 `include "storage_bridge_wb.v"
69 `include "mprj_io.v"
70 `include "chip_io.v"
manarabdelatya115bdd2020-12-01 11:19:12 +020071`endif
72
Ahmed Ghazy442825e2020-12-14 19:12:34 +020073`include "mprj_logic_high.v"
74`include "mprj2_logic_high.v"
manarabdelatyc7524312020-12-07 18:13:54 +020075`include "sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped.v"
Tim Edwards53d92182020-10-11 21:47:40 -040076`include "mgmt_protect.v"
Tim Edwardsbc035512020-11-23 11:16:08 -050077`include "mgmt_protect_hv.v"
Tim Edwardsb86fc842020-10-13 17:11:54 -040078`include "user_project_wrapper.v"
Tim Edwards04ba17f2020-10-02 22:27:50 -040079`include "gpio_control_block.v"
Tim Edwardsf51dd082020-10-05 16:30:24 -040080`include "simple_por.v"
Manar55ec3692020-10-30 16:32:18 +020081`include "sram_1rw1r_32_256_8_sky130.v"
Tim Edwardsef8312e2020-09-22 17:20:06 -040082
Tim Edwards05537512020-10-06 14:59:26 -040083/*------------------------------*/
84/* Include user project here */
85/*------------------------------*/
86`include "user_proj_example.v"
87
Manar55ec3692020-10-30 16:32:18 +020088// `ifdef USE_OPENRAM
89// `include "sram_1rw1r_32_256_8_sky130.v"
90// `endif
Ahmed Ghazy31c34652020-12-01 19:59:44 +020091`endif
Tim Edwardsef8312e2020-09-22 17:20:06 -040092
93module caravel (
Tim Edwards9eda80d2020-10-08 21:36:44 -040094 inout vddio, // Common 3.3V padframe/ESD power
95 inout vssio, // Common padframe/ESD ground
96 inout vdda, // Management 3.3V power
97 inout vssa, // Common analog ground
98 inout vccd, // Management/Common 1.8V power
99 inout vssd, // Common digital ground
100 inout vdda1, // User area 1 3.3V power
101 inout vdda2, // User area 2 3.3V power
102 inout vssa1, // User area 1 analog ground
103 inout vssa2, // User area 2 analog ground
104 inout vccd1, // User area 1 1.8V power
105 inout vccd2, // User area 2 1.8V power
106 inout vssd1, // User area 1 digital ground
107 inout vssd2, // User area 2 digital ground
108
Tim Edwards04ba17f2020-10-02 22:27:50 -0400109 inout gpio, // Used for external LDO control
Tim Edwardsef8312e2020-09-22 17:20:06 -0400110 inout [`MPRJ_IO_PADS-1:0] mprj_io,
Tim Edwardsba328902020-10-27 15:03:22 -0400111 output [`MPRJ_PWR_PADS-1:0] pwr_ctrl_out,
Tim Edwardsef8312e2020-09-22 17:20:06 -0400112 input clock, // CMOS core clock input, not a crystal
Tim Edwards04ba17f2020-10-02 22:27:50 -0400113 input resetb,
114
115 // Note that only two pins are available on the flash so dual and
116 // quad flash modes are not available.
117
Tim Edwardsef8312e2020-09-22 17:20:06 -0400118 output flash_csb,
119 output flash_clk,
120 output flash_io0,
Tim Edwards04ba17f2020-10-02 22:27:50 -0400121 output flash_io1
Tim Edwardsef8312e2020-09-22 17:20:06 -0400122);
123
Tim Edwards04ba17f2020-10-02 22:27:50 -0400124 //------------------------------------------------------------
125 // This value is uniquely defined for each user project.
126 //------------------------------------------------------------
127 parameter USER_PROJECT_ID = 32'h0;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400128
Tim Edwards04ba17f2020-10-02 22:27:50 -0400129 // These pins are overlaid on mprj_io space. They have the function
130 // below when the management processor is in reset, or in the default
131 // configuration. They are assigned to uses in the user space by the
132 // configuration program running off of the SPI flash. Note that even
133 // when the user has taken control of these pins, they can be restored
134 // to the original use by setting the resetb pin low. The SPI pins and
135 // UART pins can be connected directly to an FTDI chip as long as the
136 // FTDI chip sets these lines to high impedence (input function) at
137 // all times except when holding the chip in reset.
138
139 // JTAG = mprj_io[0] (inout)
140 // SDO = mprj_io[1] (output)
141 // SDI = mprj_io[2] (input)
142 // CSB = mprj_io[3] (input)
143 // SCK = mprj_io[4] (input)
144 // ser_rx = mprj_io[5] (input)
145 // ser_tx = mprj_io[6] (output)
146 // irq = mprj_io[7] (input)
147
148 // These pins are reserved for any project that wants to incorporate
149 // its own processor and flash controller. While a user project can
150 // technically use any available I/O pins for the purpose, these
151 // four pins connect to a pass-through mode from the SPI slave (pins
152 // 1-4 above) so that any SPI flash connected to these specific pins
153 // can be accessed through the SPI slave even when the processor is in
154 // reset.
155
Tim Edwards44bab472020-10-04 22:09:54 -0400156 // user_flash_csb = mprj_io[8]
157 // user_flash_sck = mprj_io[9]
158 // user_flash_io0 = mprj_io[10]
159 // user_flash_io1 = mprj_io[11]
Tim Edwards04ba17f2020-10-02 22:27:50 -0400160
161 // One-bit GPIO dedicated to management SoC (outside of user control)
162 wire gpio_out_core;
163 wire gpio_in_core;
164 wire gpio_mode0_core;
165 wire gpio_mode1_core;
166 wire gpio_outenb_core;
167 wire gpio_inenb_core;
168
Tim Edwards6d9739d2020-10-19 11:00:49 -0400169 // User Project Control (pad-facing)
Tim Edwards04ba17f2020-10-02 22:27:50 -0400170 wire mprj_io_loader_resetn;
171 wire mprj_io_loader_clock;
172 wire mprj_io_loader_data;
173
Tim Edwardsef8312e2020-09-22 17:20:06 -0400174 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
175 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
176 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
Tim Edwards44bab472020-10-04 22:09:54 -0400177 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400178 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400179 wire [`MPRJ_IO_PADS-1:0] mprj_io_vtrip_sel;
180 wire [`MPRJ_IO_PADS-1:0] mprj_io_slow_sel;
181 wire [`MPRJ_IO_PADS-1:0] mprj_io_holdover;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400182 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
183 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
184 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
185 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
186 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
187 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
188
Tim Edwards6d9739d2020-10-19 11:00:49 -0400189 // User Project Control (user-facing)
Tim Edwards44bab472020-10-04 22:09:54 -0400190 wire [`MPRJ_IO_PADS-1:0] user_io_oeb;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400191 wire [`MPRJ_IO_PADS-1:0] user_io_in;
192 wire [`MPRJ_IO_PADS-1:0] user_io_out;
Tim Edwards581068f2020-11-19 12:45:25 -0500193 wire [`MPRJ_IO_PADS-8:0] user_analog_io;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400194
195 /* Padframe control signals */
196 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link;
197 wire mgmt_serial_clock;
198 wire mgmt_serial_resetn;
199
Tim Edwards6d9739d2020-10-19 11:00:49 -0400200 // User Project Control management I/O
Tim Edwards44bab472020-10-04 22:09:54 -0400201 // There are two types of GPIO connections:
202 // (1) Full Bidirectional: Management connects to in, out, and oeb
203 // Uses: JTAG and SDO
204 // (2) Selectable bidirectional: Management connects to in and out,
205 // which are tied together. oeb is grounded (oeb from the
206 // configuration is used)
207
208 // SDI = mprj_io[2] (input)
209 // CSB = mprj_io[3] (input)
210 // SCK = mprj_io[4] (input)
211 // ser_rx = mprj_io[5] (input)
212 // ser_tx = mprj_io[6] (output)
213 // irq = mprj_io[7] (input)
214
215 wire [`MPRJ_IO_PADS-1:0] mgmt_io_in;
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200216 wire jtag_out, sdo_out;
217 wire jtag_outenb, sdo_outenb;
Tim Edwards44bab472020-10-04 22:09:54 -0400218
219 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc1; /* no-connects */
220 wire [`MPRJ_IO_PADS-3:0] mgmt_io_nc3; /* no-connects */
221 wire [1:0] mgmt_io_nc2; /* no-connects */
222
Tim Edwards581068f2020-11-19 12:45:25 -0500223 wire clock_core;
224
Tim Edwards04ba17f2020-10-02 22:27:50 -0400225 // Power-on-reset signal. The reset pad generates the sense-inverted
226 // reset at 3.3V. The 1.8V signal and the inverted 1.8V signal are
227 // derived.
228
Tim Edwardsef8312e2020-09-22 17:20:06 -0400229 wire porb_h;
230 wire porb_l;
Tim Edwards581068f2020-11-19 12:45:25 -0500231 wire por_l;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400232
Tim Edwardsf51dd082020-10-05 16:30:24 -0400233 wire rstb_h;
234 wire rstb_l;
235
Tim Edwards581068f2020-11-19 12:45:25 -0500236 wire flash_clk_core, flash_csb_core;
237 wire flash_clk_oeb_core, flash_csb_oeb_core;
238 wire flash_clk_ieb_core, flash_csb_ieb_core;
239 wire flash_io0_oeb_core, flash_io1_oeb_core;
240 wire flash_io2_oeb_core, flash_io3_oeb_core;
241 wire flash_io0_ieb_core, flash_io1_ieb_core;
242 wire flash_io2_ieb_core, flash_io3_ieb_core;
243 wire flash_io0_do_core, flash_io1_do_core;
244 wire flash_io2_do_core, flash_io3_do_core;
245 wire flash_io0_di_core, flash_io1_di_core;
246 wire flash_io2_di_core, flash_io3_di_core;
247
Tim Edwards44bab472020-10-04 22:09:54 -0400248 // To be considered: Master hold signal on all user pads (?)
249 // For now, set holdh_n to 1 (NOTE: This is in the 3.3V domain)
250 // and setting enh to porb_h.
Tim Edwards9eda80d2020-10-08 21:36:44 -0400251 assign mprj_io_hldh_n = {`MPRJ_IO_PADS{vddio}};
Tim Edwards44bab472020-10-04 22:09:54 -0400252 assign mprj_io_enh = {`MPRJ_IO_PADS{porb_h}};
253
Tim Edwardsef8312e2020-09-22 17:20:06 -0400254 chip_io padframe(
255 // Package Pins
Tim Edwards9eda80d2020-10-08 21:36:44 -0400256 .vddio(vddio),
257 .vssio(vssio),
258 .vdda(vdda),
259 .vssa(vssa),
260 .vccd(vccd),
261 .vssd(vssd),
262 .vdda1(vdda1),
263 .vdda2(vdda2),
264 .vssa1(vssa1),
265 .vssa2(vssa2),
266 .vccd1(vccd1),
267 .vccd2(vccd2),
268 .vssd1(vssd1),
269 .vssd2(vssd2),
270
Tim Edwardsef8312e2020-09-22 17:20:06 -0400271 .gpio(gpio),
272 .mprj_io(mprj_io),
273 .clock(clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400274 .resetb(resetb),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400275 .flash_csb(flash_csb),
276 .flash_clk(flash_clk),
277 .flash_io0(flash_io0),
278 .flash_io1(flash_io1),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400279 // SoC Core Interface
Tim Edwardsef8312e2020-09-22 17:20:06 -0400280 .porb_h(porb_h),
Tim Edwards581068f2020-11-19 12:45:25 -0500281 .por(por_l),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400282 .resetb_core_h(rstb_h),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400283 .clock_core(clock_core),
284 .gpio_out_core(gpio_out_core),
285 .gpio_in_core(gpio_in_core),
286 .gpio_mode0_core(gpio_mode0_core),
287 .gpio_mode1_core(gpio_mode1_core),
288 .gpio_outenb_core(gpio_outenb_core),
289 .gpio_inenb_core(gpio_inenb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400290 .flash_csb_core(flash_csb_core),
291 .flash_clk_core(flash_clk_core),
292 .flash_csb_oeb_core(flash_csb_oeb_core),
293 .flash_clk_oeb_core(flash_clk_oeb_core),
294 .flash_io0_oeb_core(flash_io0_oeb_core),
295 .flash_io1_oeb_core(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400296 .flash_csb_ieb_core(flash_csb_ieb_core),
297 .flash_clk_ieb_core(flash_clk_ieb_core),
298 .flash_io0_ieb_core(flash_io0_ieb_core),
299 .flash_io1_ieb_core(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400300 .flash_io0_do_core(flash_io0_do_core),
301 .flash_io1_do_core(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400302 .flash_io0_di_core(flash_io0_di_core),
303 .flash_io1_di_core(flash_io1_di_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400304 .mprj_io_in(mprj_io_in),
305 .mprj_io_out(mprj_io_out),
Tim Edwards44bab472020-10-04 22:09:54 -0400306 .mprj_io_oeb(mprj_io_oeb),
Manar14d35ac2020-10-21 22:47:15 +0200307 .mprj_io_hldh_n(mprj_io_hldh_n),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400308 .mprj_io_enh(mprj_io_enh),
Manar14d35ac2020-10-21 22:47:15 +0200309 .mprj_io_inp_dis(mprj_io_inp_dis),
310 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
311 .mprj_io_vtrip_sel(mprj_io_vtrip_sel),
312 .mprj_io_slow_sel(mprj_io_slow_sel),
313 .mprj_io_holdover(mprj_io_holdover),
314 .mprj_io_analog_en(mprj_io_analog_en),
315 .mprj_io_analog_sel(mprj_io_analog_sel),
316 .mprj_io_analog_pol(mprj_io_analog_pol),
Tim Edwards581068f2020-11-19 12:45:25 -0500317 .mprj_io_dm(mprj_io_dm),
318 .mprj_analog_io(user_analog_io)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400319 );
320
321 // SoC core
Tim Edwards04ba17f2020-10-02 22:27:50 -0400322 wire caravel_clk;
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400323 wire caravel_clk2;
Tim Edwards04ba17f2020-10-02 22:27:50 -0400324 wire caravel_rstn;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400325
326 wire [7:0] spi_ro_config_core;
327
328 // LA signals
Tim Edwards43e5c602020-11-19 15:59:50 -0500329 wire [127:0] la_data_in_user; // From CPU to MPRJ
330 wire [127:0] la_data_in_mprj; // From MPRJ to CPU
Tim Edwardsef8312e2020-09-22 17:20:06 -0400331 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
Tim Edwards43e5c602020-11-19 15:59:50 -0500332 wire [127:0] la_data_out_user; // From MPRJ to CPU
333 wire [127:0] la_oen_user; // From CPU to MPRJ
334 wire [127:0] la_oen_mprj; // From CPU to MPRJ
335
Tim Edwards6d9739d2020-10-19 11:00:49 -0400336 // WB MI A (User Project)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400337 wire mprj_cyc_o_core;
338 wire mprj_stb_o_core;
339 wire mprj_we_o_core;
340 wire [3:0] mprj_sel_o_core;
341 wire [31:0] mprj_adr_o_core;
342 wire [31:0] mprj_dat_o_core;
343 wire mprj_ack_i_core;
344 wire [31:0] mprj_dat_i_core;
345
346 // WB MI B (xbar)
347 wire xbar_cyc_o_core;
348 wire xbar_stb_o_core;
349 wire xbar_we_o_core;
350 wire [3:0] xbar_sel_o_core;
351 wire [31:0] xbar_adr_o_core;
352 wire [31:0] xbar_dat_o_core;
353 wire xbar_ack_i_core;
354 wire [31:0] xbar_dat_i_core;
355
Tim Edwards04ba17f2020-10-02 22:27:50 -0400356 // Mask revision
357 wire [31:0] mask_rev;
358
Manar14d35ac2020-10-21 22:47:15 +0200359 wire mprj_clock;
360 wire mprj_clock2;
361 wire mprj_resetn;
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200362 wire mprj_reset;
Manar14d35ac2020-10-21 22:47:15 +0200363 wire mprj_cyc_o_user;
364 wire mprj_stb_o_user;
365 wire mprj_we_o_user;
366 wire [3:0] mprj_sel_o_user;
367 wire [31:0] mprj_adr_o_user;
368 wire [31:0] mprj_dat_o_user;
369 wire mprj_vcc_pwrgood;
370 wire mprj2_vcc_pwrgood;
371 wire mprj_vdd_pwrgood;
372 wire mprj2_vdd_pwrgood;
373
Manar55ec3692020-10-30 16:32:18 +0200374 // Storage area
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200375 // Management R/W interface
376 wire [`RAM_BLOCKS-1:0] mgmt_ena;
Manarffe6cad2020-11-09 19:09:04 +0200377 wire [`RAM_BLOCKS-1:0] mgmt_wen;
378 wire [(`RAM_BLOCKS*4)-1:0] mgmt_wen_mask;
Manar55ec3692020-10-30 16:32:18 +0200379 wire [7:0] mgmt_addr;
380 wire [31:0] mgmt_wdata;
Manarffe6cad2020-11-09 19:09:04 +0200381 wire [(`RAM_BLOCKS*32)-1:0] mgmt_rdata;
Manar55ec3692020-10-30 16:32:18 +0200382 // Management RO interface
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200383 wire mgmt_ena_ro;
Manarffe6cad2020-11-09 19:09:04 +0200384 wire [7:0] mgmt_addr_ro;
385 wire [31:0] mgmt_rdata_ro;
Manar55ec3692020-10-30 16:32:18 +0200386
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200387 mgmt_core soc (
Manar61dce922020-11-10 19:26:28 +0200388 `ifdef USE_POWER_PINS
manarabdelatya115bdd2020-12-01 11:19:12 +0200389 .VPWR(vccd),
390 .VGND(vssa),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400391 `endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400392 // GPIO (1 pin)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400393 .gpio_out_pad(gpio_out_core),
394 .gpio_in_pad(gpio_in_core),
395 .gpio_mode0_pad(gpio_mode0_core),
396 .gpio_mode1_pad(gpio_mode1_core),
397 .gpio_outenb_pad(gpio_outenb_core),
398 .gpio_inenb_pad(gpio_inenb_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400399 // Primary SPI flash controller
Tim Edwardsef8312e2020-09-22 17:20:06 -0400400 .flash_csb(flash_csb_core),
401 .flash_clk(flash_clk_core),
402 .flash_csb_oeb(flash_csb_oeb_core),
403 .flash_clk_oeb(flash_clk_oeb_core),
404 .flash_io0_oeb(flash_io0_oeb_core),
405 .flash_io1_oeb(flash_io1_oeb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400406 .flash_csb_ieb(flash_csb_ieb_core),
407 .flash_clk_ieb(flash_clk_ieb_core),
408 .flash_io0_ieb(flash_io0_ieb_core),
409 .flash_io1_ieb(flash_io1_ieb_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400410 .flash_io0_do(flash_io0_do_core),
411 .flash_io1_do(flash_io1_do_core),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400412 .flash_io0_di(flash_io0_di_core),
413 .flash_io1_di(flash_io1_di_core),
Tim Edwardsf51dd082020-10-05 16:30:24 -0400414 // Master Reset
415 .resetb(rstb_l),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400416 .porb(porb_l),
417 // Clocks and reset
Tim Edwardsef8312e2020-09-22 17:20:06 -0400418 .clock(clock_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400419 .core_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400420 .user_clk(caravel_clk2),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400421 .core_rstn(caravel_rstn),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200422 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500423 .la_input(la_data_in_mprj),
424 .la_output(la_data_out_mprj),
425 .la_oen(la_oen_mprj),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400426 // User Project IO Control
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400427 .mprj_vcc_pwrgood(mprj_vcc_pwrgood),
428 .mprj2_vcc_pwrgood(mprj2_vcc_pwrgood),
429 .mprj_vdd_pwrgood(mprj_vdd_pwrgood),
430 .mprj2_vdd_pwrgood(mprj2_vdd_pwrgood),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400431 .mprj_io_loader_resetn(mprj_io_loader_resetn),
432 .mprj_io_loader_clock(mprj_io_loader_clock),
433 .mprj_io_loader_data(mprj_io_loader_data),
Tim Edwards44bab472020-10-04 22:09:54 -0400434 .mgmt_in_data(mgmt_io_in),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400435 .mgmt_out_data({mgmt_io_in[(`MPRJ_IO_PADS-1):2], mgmt_io_nc2}),
Tim Edwardsba328902020-10-27 15:03:22 -0400436 .pwr_ctrl_out(pwr_ctrl_out),
Tim Edwardsca2f3182020-10-06 10:05:11 -0400437 .sdo_out(sdo_out),
438 .sdo_outenb(sdo_outenb),
439 .jtag_out(jtag_out),
440 .jtag_outenb(jtag_outenb),
Tim Edwards6d9739d2020-10-19 11:00:49 -0400441 // User Project Slave ports (WB MI A)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400442 .mprj_cyc_o(mprj_cyc_o_core),
443 .mprj_stb_o(mprj_stb_o_core),
444 .mprj_we_o(mprj_we_o_core),
445 .mprj_sel_o(mprj_sel_o_core),
446 .mprj_adr_o(mprj_adr_o_core),
447 .mprj_dat_o(mprj_dat_o_core),
448 .mprj_ack_i(mprj_ack_i_core),
449 .mprj_dat_i(mprj_dat_i_core),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400450 // mask data
Manar55ec3692020-10-30 16:32:18 +0200451 .mask_rev(mask_rev),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200452 // MGMT area R/W interface
453 .mgmt_ena(mgmt_ena),
Manar55ec3692020-10-30 16:32:18 +0200454 .mgmt_wen_mask(mgmt_wen_mask),
455 .mgmt_wen(mgmt_wen),
456 .mgmt_addr(mgmt_addr),
457 .mgmt_wdata(mgmt_wdata),
458 .mgmt_rdata(mgmt_rdata),
Manarffe6cad2020-11-09 19:09:04 +0200459 // MGMT area RO interface
460 .mgmt_ena_ro(mgmt_ena_ro),
461 .mgmt_addr_ro(mgmt_addr_ro),
462 .mgmt_rdata_ro(mgmt_rdata_ro)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400463 );
464
Tim Edwards53d92182020-10-11 21:47:40 -0400465 /* Clock and reset to user space are passed through a tristate */
466 /* buffer like the above, but since they are intended to be */
467 /* always active, connect the enable to the logic-1 output from */
468 /* the vccd1 domain. */
469
Tim Edwards53d92182020-10-11 21:47:40 -0400470 mgmt_protect mgmt_buffers (
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200471 `ifdef USE_POWER_PINS
Tim Edwards53d92182020-10-11 21:47:40 -0400472 .vccd(vccd),
473 .vssd(vssd),
474 .vccd1(vccd1),
475 .vssd1(vssd1),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400476 .vdda1(vdda1),
477 .vssa1(vssa1),
478 .vdda2(vdda2),
479 .vssa2(vssa2),
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200480 `endif
Tim Edwards21a9aac2020-10-12 22:05:18 -0400481
Tim Edwards53d92182020-10-11 21:47:40 -0400482 .caravel_clk(caravel_clk),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400483 .caravel_clk2(caravel_clk2),
Tim Edwards53d92182020-10-11 21:47:40 -0400484 .caravel_rstn(caravel_rstn),
485 .mprj_cyc_o_core(mprj_cyc_o_core),
486 .mprj_stb_o_core(mprj_stb_o_core),
487 .mprj_we_o_core(mprj_we_o_core),
488 .mprj_sel_o_core(mprj_sel_o_core),
489 .mprj_adr_o_core(mprj_adr_o_core),
490 .mprj_dat_o_core(mprj_dat_o_core),
Tim Edwards43e5c602020-11-19 15:59:50 -0500491 .la_data_out_core(la_data_out_user),
492 .la_data_out_mprj(la_data_out_mprj),
493 .la_data_in_core(la_data_in_user),
494 .la_data_in_mprj(la_data_in_mprj),
495 .la_oen_mprj(la_oen_mprj),
496 .la_oen_core(la_oen_user),
Tim Edwards53d92182020-10-11 21:47:40 -0400497
498 .user_clock(mprj_clock),
Tim Edwards7a8cbb12020-10-12 11:32:11 -0400499 .user_clock2(mprj_clock2),
Tim Edwards53d92182020-10-11 21:47:40 -0400500 .user_resetn(mprj_resetn),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200501 .user_reset(mprj_reset),
Tim Edwards53d92182020-10-11 21:47:40 -0400502 .mprj_cyc_o_user(mprj_cyc_o_user),
503 .mprj_stb_o_user(mprj_stb_o_user),
504 .mprj_we_o_user(mprj_we_o_user),
505 .mprj_sel_o_user(mprj_sel_o_user),
506 .mprj_adr_o_user(mprj_adr_o_user),
507 .mprj_dat_o_user(mprj_dat_o_user),
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400508 .user1_vcc_powergood(mprj_vcc_pwrgood),
509 .user2_vcc_powergood(mprj2_vcc_pwrgood),
510 .user1_vdd_powergood(mprj_vdd_pwrgood),
511 .user2_vdd_powergood(mprj2_vdd_pwrgood)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400512 );
Tim Edwards53d92182020-10-11 21:47:40 -0400513
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200514
Tim Edwardsb86fc842020-10-13 17:11:54 -0400515 /*----------------------------------------------*/
516 /* Wrapper module around the user project */
517 /*----------------------------------------------*/
Tim Edwards05537512020-10-06 14:59:26 -0400518
Ahmed Ghazy22d29d62020-10-28 03:42:02 +0200519 user_project_wrapper mprj (
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200520 `ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400521 .vdda1(vdda1), // User area 1 3.3V power
522 .vdda2(vdda2), // User area 2 3.3V power
523 .vssa1(vssa1), // User area 1 analog ground
524 .vssa2(vssa2), // User area 2 analog ground
525 .vccd1(vccd1), // User area 1 1.8V power
526 .vccd2(vccd2), // User area 2 1.8V power
527 .vssd1(vssd1), // User area 1 digital ground
528 .vssd2(vssd2), // User area 2 digital ground
Ahmed Ghazyfe9c3bb2020-11-26 15:29:48 +0200529 `endif
Tim Edwards21a9aac2020-10-12 22:05:18 -0400530
Tim Edwards53d92182020-10-11 21:47:40 -0400531 .wb_clk_i(mprj_clock),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200532 .wb_rst_i(mprj_reset),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200533 // MGMT SoC Wishbone Slave
Tim Edwards53d92182020-10-11 21:47:40 -0400534 .wbs_cyc_i(mprj_cyc_o_user),
535 .wbs_stb_i(mprj_stb_o_user),
536 .wbs_we_i(mprj_we_o_user),
537 .wbs_sel_i(mprj_sel_o_user),
538 .wbs_adr_i(mprj_adr_o_user),
539 .wbs_dat_i(mprj_dat_o_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400540 .wbs_ack_o(mprj_ack_i_core),
541 .wbs_dat_o(mprj_dat_i_core),
542 // Logic Analyzer
Tim Edwards43e5c602020-11-19 15:59:50 -0500543 .la_data_in(la_data_in_user),
544 .la_data_out(la_data_out_user),
545 .la_oen(la_oen_user),
Tim Edwardsef8312e2020-09-22 17:20:06 -0400546 // IO Pads
Tim Edwards05537512020-10-06 14:59:26 -0400547 .io_in (user_io_in),
Tim Edwardsef2b68d2020-10-11 17:00:44 -0400548 .io_out(user_io_out),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400549 .io_oeb(user_io_oeb),
Tim Edwards581068f2020-11-19 12:45:25 -0500550 .analog_io(user_analog_io),
Tim Edwardsb86fc842020-10-13 17:11:54 -0400551 // Independent clock
552 .user_clock2(mprj_clock2)
Tim Edwardsef8312e2020-09-22 17:20:06 -0400553 );
554
Tim Edwards05537512020-10-06 14:59:26 -0400555 /*--------------------------------------*/
556 /* End user project instantiation */
557 /*--------------------------------------*/
558
Tim Edwards04ba17f2020-10-02 22:27:50 -0400559 wire [`MPRJ_IO_PADS-1:0] gpio_serial_link_shifted;
560
Tim Edwards251e0df2020-10-05 11:02:12 -0400561 assign gpio_serial_link_shifted = {gpio_serial_link[`MPRJ_IO_PADS-2:0], mprj_io_loader_data};
Tim Edwards04ba17f2020-10-02 22:27:50 -0400562
Tim Edwards251e0df2020-10-05 11:02:12 -0400563 // Each control block sits next to an I/O pad in the user area.
564 // It gets input through a serial chain from the previous control
565 // block and passes it to the next control block. Due to the nature
566 // of the shift register, bits are presented in reverse, as the first
567 // bit in ends up as the last bit of the last I/O pad control block.
Tim Edwards44bab472020-10-04 22:09:54 -0400568
Tim Edwards89f09242020-10-05 15:17:34 -0400569 // There are two types of block; the first two are configured to be
570 // full bidirectional under control of the management Soc (JTAG and
571 // SDO). The rest are configured to be default (input).
572
Tim Edwards251e0df2020-10-05 11:02:12 -0400573 gpio_control_block #(
manarabdelaty589a5282020-12-05 01:06:48 +0200574 .DM_INIT(`DM_INIT), // Mode = output, strong up/down
575 .OENB_INIT(`OENB_INIT) // Enable output signaling from wire
Tim Edwards89f09242020-10-05 15:17:34 -0400576 ) gpio_control_bidir [1:0] (
Manar61dce922020-11-10 19:26:28 +0200577 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200578 .vccd(vccd),
579 .vssd(vssd),
580 .vccd1(vccd1),
581 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400582 `endif
Tim Edwards44bab472020-10-04 22:09:54 -0400583
Tim Edwards04ba17f2020-10-02 22:27:50 -0400584 // Management Soc-facing signals
585
Tim Edwardsc18c4742020-10-03 11:26:39 -0400586 .resetn(mprj_io_loader_resetn),
587 .serial_clock(mprj_io_loader_clock),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400588
Tim Edwards89f09242020-10-05 15:17:34 -0400589 .mgmt_gpio_in(mgmt_io_in[1:0]),
590 .mgmt_gpio_out({sdo_out, jtag_out}),
591 .mgmt_gpio_oeb({sdo_outenb, jtag_outenb}),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400592
Ahmed Ghazyd0dcdcf2020-12-15 22:00:25 +0200593 .one(),
594 .zero(),
595
Tim Edwards04ba17f2020-10-02 22:27:50 -0400596 // Serial data chain for pad configuration
Tim Edwards89f09242020-10-05 15:17:34 -0400597 .serial_data_in(gpio_serial_link_shifted[1:0]),
598 .serial_data_out(gpio_serial_link[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400599
600 // User-facing signals
Tim Edwards89f09242020-10-05 15:17:34 -0400601 .user_gpio_out(user_io_out[1:0]),
602 .user_gpio_oeb(user_io_oeb[1:0]),
603 .user_gpio_in(user_io_in[1:0]),
Tim Edwards04ba17f2020-10-02 22:27:50 -0400604
605 // Pad-facing signals (Pad GPIOv2)
Tim Edwards89f09242020-10-05 15:17:34 -0400606 .pad_gpio_inenb(mprj_io_inp_dis[1:0]),
607 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[1:0]),
608 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[1:0]),
609 .pad_gpio_slow_sel(mprj_io_slow_sel[1:0]),
610 .pad_gpio_holdover(mprj_io_holdover[1:0]),
611 .pad_gpio_ana_en(mprj_io_analog_en[1:0]),
612 .pad_gpio_ana_sel(mprj_io_analog_sel[1:0]),
613 .pad_gpio_ana_pol(mprj_io_analog_pol[1:0]),
614 .pad_gpio_dm(mprj_io_dm[5:0]),
615 .pad_gpio_outenb(mprj_io_oeb[1:0]),
616 .pad_gpio_out(mprj_io_out[1:0]),
617 .pad_gpio_in(mprj_io_in[1:0])
618 );
619
Ahmed Ghazyd0dcdcf2020-12-15 22:00:25 +0200620 wire [`MPRJ_IO_PADS-1:2] one_loop;
Tim Edwards89f09242020-10-05 15:17:34 -0400621 gpio_control_block gpio_control_in [`MPRJ_IO_PADS-1:2] (
Manar61dce922020-11-10 19:26:28 +0200622 `ifdef USE_POWER_PINS
Manar68e03632020-11-09 13:25:13 +0200623 .vccd(vccd),
624 .vssd(vssd),
625 .vccd1(vccd1),
626 .vssd1(vssd1),
Tim Edwards53d92182020-10-11 21:47:40 -0400627 `endif
Tim Edwards89f09242020-10-05 15:17:34 -0400628
629 // Management Soc-facing signals
630
631 .resetn(mprj_io_loader_resetn),
632 .serial_clock(mprj_io_loader_clock),
633
634 .mgmt_gpio_in(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
635 .mgmt_gpio_out(mgmt_io_in[(`MPRJ_IO_PADS-1):2]),
Ahmed Ghazyd0dcdcf2020-12-15 22:00:25 +0200636 .mgmt_gpio_oeb(one_loop),
637
638 .one(one_loop),
639 .zero(),
Tim Edwards89f09242020-10-05 15:17:34 -0400640
641 // Serial data chain for pad configuration
642 .serial_data_in(gpio_serial_link_shifted[(`MPRJ_IO_PADS-1):2]),
643 .serial_data_out(gpio_serial_link[(`MPRJ_IO_PADS-1):2]),
644
645 // User-facing signals
646 .user_gpio_out(user_io_out[(`MPRJ_IO_PADS-1):2]),
647 .user_gpio_oeb(user_io_oeb[(`MPRJ_IO_PADS-1):2]),
648 .user_gpio_in(user_io_in[(`MPRJ_IO_PADS-1):2]),
649
650 // Pad-facing signals (Pad GPIOv2)
651 .pad_gpio_inenb(mprj_io_inp_dis[(`MPRJ_IO_PADS-1):2]),
652 .pad_gpio_ib_mode_sel(mprj_io_ib_mode_sel[(`MPRJ_IO_PADS-1):2]),
653 .pad_gpio_vtrip_sel(mprj_io_vtrip_sel[(`MPRJ_IO_PADS-1):2]),
654 .pad_gpio_slow_sel(mprj_io_slow_sel[(`MPRJ_IO_PADS-1):2]),
655 .pad_gpio_holdover(mprj_io_holdover[(`MPRJ_IO_PADS-1):2]),
656 .pad_gpio_ana_en(mprj_io_analog_en[(`MPRJ_IO_PADS-1):2]),
657 .pad_gpio_ana_sel(mprj_io_analog_sel[(`MPRJ_IO_PADS-1):2]),
658 .pad_gpio_ana_pol(mprj_io_analog_pol[(`MPRJ_IO_PADS-1):2]),
659 .pad_gpio_dm(mprj_io_dm[(`MPRJ_IO_PADS*3-1):6]),
660 .pad_gpio_outenb(mprj_io_oeb[(`MPRJ_IO_PADS-1):2]),
661 .pad_gpio_out(mprj_io_out[(`MPRJ_IO_PADS-1):2]),
662 .pad_gpio_in(mprj_io_in[(`MPRJ_IO_PADS-1):2])
Tim Edwards04ba17f2020-10-02 22:27:50 -0400663 );
664
Tim Edwards04ba17f2020-10-02 22:27:50 -0400665 user_id_programming #(
666 .USER_PROJECT_ID(USER_PROJECT_ID)
667 ) user_id_value (
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200668`ifdef USE_POWER_PINS
manarabdelatyc7524312020-12-07 18:13:54 +0200669 .VPWR(vccd),
670 .VGND(vssd),
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200671`endif
Tim Edwards04ba17f2020-10-02 22:27:50 -0400672 .mask_rev(mask_rev)
673 );
674
Tim Edwardsf51dd082020-10-05 16:30:24 -0400675 // Power-on-reset circuit
676 simple_por por (
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200677`ifdef USE_POWER_PINS
Tim Edwards9eda80d2020-10-08 21:36:44 -0400678 .vdd3v3(vddio),
Tim Edwards581068f2020-11-19 12:45:25 -0500679 .vdd1v8(vccd),
Tim Edwards9eda80d2020-10-08 21:36:44 -0400680 .vss(vssio),
Ahmed Ghazy27200e92020-11-25 22:07:02 +0200681`endif
Tim Edwards581068f2020-11-19 12:45:25 -0500682 .porb_h(porb_h),
683 .porb_l(porb_l),
684 .por_l(por_l)
Tim Edwardsf51dd082020-10-05 16:30:24 -0400685 );
686
687 // XRES (chip input pin reset) reset level converter
Ahmed Ghazy1d1679d2020-11-30 17:44:45 +0200688 sky130_fd_sc_hvl__lsbufhv2lv_1_wrapped rstb_level (
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200689`ifdef USE_POWER_PINS
Tim Edwards21a9aac2020-10-12 22:05:18 -0400690 .VPWR(vddio),
691 .VPB(vddio),
692 .LVPWR(vccd),
693 .VNB(vssio),
694 .VGND(vssio),
Ahmed Ghazy69663c72020-11-18 20:15:53 +0200695`endif
Tim Edwardsf51dd082020-10-05 16:30:24 -0400696 .A(rstb_h),
697 .X(rstb_l)
698 );
699
Manar55ec3692020-10-30 16:32:18 +0200700 // Storage area
Manarffe6cad2020-11-09 19:09:04 +0200701 storage storage(
Manar55ec3692020-10-30 16:32:18 +0200702 .mgmt_clk(caravel_clk),
703 .mgmt_ena(mgmt_ena),
704 .mgmt_wen(mgmt_wen),
705 .mgmt_wen_mask(mgmt_wen_mask),
706 .mgmt_addr(mgmt_addr),
707 .mgmt_wdata(mgmt_wdata),
708 .mgmt_rdata(mgmt_rdata),
Ahmed Ghazydf4dd882020-11-25 18:38:42 +0200709 // Management RO interface
Manarffe6cad2020-11-09 19:09:04 +0200710 .mgmt_ena_ro(mgmt_ena_ro),
711 .mgmt_addr_ro(mgmt_addr_ro),
712 .mgmt_rdata_ro(mgmt_rdata_ro)
Manar55ec3692020-10-30 16:32:18 +0200713 );
714
Tim Edwardsef8312e2020-09-22 17:20:06 -0400715endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500716// `default_nettype wire