blob: 52992eb7ea0ac8c257491980648f9ac73008e46d [file] [log] [blame]
shalan0d14e6e2020-08-31 16:50:48 +02001/*----------------------------------------------------------*/
2/* striVe, a raven/ravenna-like architecture in SkyWater s8 */
3/* */
4/* 1st edition, test of SkyWater s8 process */
5/* This version is missing all analog functionality, */
6/* including crystal oscillator, voltage regulator, and PLL */
7/* For simplicity, the pad arrangement of Raven has been */
8/* retained, even though many pads have no internal */
9/* connection. */
10/* */
11/* Copyright 2020 efabless, Inc. */
12/* Written by Tim Edwards, December 2019 */
13/* This file is open source hardware released under the */
14/* Apache 2.0 license. See file LICENSE. */
15/* */
16/*----------------------------------------------------------*/
17
18`timescale 1 ns / 1 ps
19
20`define USE_OPENRAM
21`define USE_PG_PIN
22`define functional
23
24`define MPRJ_IO_PADS 32
25
26`include "pads.v"
27
28`include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/s8iom0s8.v"
29`include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/power_pads_lib.v"
30`include "/ef/tech/SW/EFS8A/libs.ref/verilog/scs8hd/scs8hd.v"
31
32`include "lvlshiftdown.v"
33`include "mgmt_soc.v"
34`include "striVe_spi.v"
35`include "digital_pll.v"
36`include "striVe_clkrst.v"
37`include "mprj_counter.v"
38`include "mgmt_core.v"
39`include "mprj_io.v"
40`include "chip_io.v"
41
42`ifdef USE_OPENRAM
43 `include "sram_1rw1r_32_8192_8_sky130.v"
44`endif
45
46module harness_chip (
47 inout vdd,
48 inout vdd1v8,
49 inout vss,
50 inout [15:0] gpio,
51 inout [`MPRJ_IO_PADS-1:0] mprj_io,
52 input xi, // CMOS clock input, not a crystal
53 output xo, // divide-by-16 clock output
54 input adc0_in,
55 input adc1_in,
56 input adc_high,
57 input adc_low,
58 input comp_inn,
59 input comp_inp,
60 input RSTB, // NOTE: Replaces analog_out pin from raven chip
61 input ser_rx,
62 output ser_tx,
63 input irq,
64 output SDO,
65 input SDI,
66 input CSB,
67 input SCK,
68 input xclk,
69 output flash_csb,
70 output flash_clk,
71 output flash_io0,
72 output flash_io1,
73 output flash_io2,
74 output flash_io3
75);
76
77 wire [15:0] gpio_out_core;
78 wire [15:0] gpio_in_core;
79 wire [15:0] gpio_mode0_core;
80 wire [15:0] gpio_mode1_core;
81 wire [15:0] gpio_outenb_core;
82 wire [15:0] gpio_inenb_core;
83
84 // Mega-Project Control
85 wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb_n;
86 wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
87 wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
88 wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
89 wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
90 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
91 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
92 wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
93 wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
94 wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
95 wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
96
97 wire porb_h;
98 wire porb_l;
99 wire por;
100 wire SCK_core;
101 wire SDI_core;
102 wire CSB_core;
103 wire SDO_core;
104 wire SDO_enb;
105
106 chip_io padframe(
107 // Package Pins
108 .vdd(vdd),
109 .vdd1v8(vdd1v8),
110 .vss(vss),
111 .gpio(gpio),
112 .mprj_io(mprj_io),
113 .xi(xi),
114 .xo(xo),
115 .adc0_in(adc0_in),
116 .adc1_in(adc1_in),
117 .adc_high(adc_high),
118 .adc_low(adc_low),
119 .comp_inn(comp_inn),
120 .comp_inp(comp_inp),
121 .RSTB(RSTB),
122 .ser_rx(ser_rx),
123 .ser_tx(ser_tx),
124 .irq(irq),
125 .SDO(SDO),
126 .SDI(SDI),
127 .CSB(CSB),
128 .SCK(SCK),
129 .xclk(xclk),
130 .flash_csb(flash_csb),
131 .flash_clk(flash_clk),
132 .flash_io0(flash_io0),
133 .flash_io1(flash_io1),
134 .flash_io2(flash_io2),
135 .flash_io3(flash_io3),
136 // SoC Core Interface
137 .por(por),
138 .porb_h(porb_h),
139 .ext_clk_core(ext_clk_core),
140 .xi_core(xi_core),
141 .gpio_out_core(gpio_out_core),
142 .gpio_in_core(gpio_in_core),
143 .gpio_mode0_core(gpio_mode0_core),
144 .gpio_mode1_core(gpio_mode1_core),
145 .gpio_outenb_core(gpio_outenb_core),
146 .gpio_inenb_core(gpio_inenb_core),
147 .SCK_core(SCK_core),
148 .ser_rx_core(ser_rx_core),
149 .ser_tx_core(ser_tx_core),
150 .irq_pin_core(irq_pin_core),
151 .flash_csb_core(flash_csb_core),
152 .flash_clk_core(flash_clk_core),
153 .flash_csb_oeb_core(flash_csb_oeb_core),
154 .flash_clk_oeb_core(flash_clk_oeb_core),
155 .flash_io0_oeb_core(flash_io0_oeb_core),
156 .flash_io1_oeb_core(flash_io1_oeb_core),
157 .flash_io2_oeb_core(flash_io2_oeb_core),
158 .flash_io3_oeb_core(flash_io3_oeb_core),
159 .flash_csb_ieb_core(flash_csb_ieb_core),
160 .flash_clk_ieb_core(flash_clk_ieb_core),
161 .flash_io0_ieb_core(flash_io0_ieb_core),
162 .flash_io1_ieb_core(flash_io1_ieb_core),
163 .flash_io2_ieb_core(flash_io2_ieb_core),
164 .flash_io3_ieb_core(flash_io3_ieb_core),
165 .flash_io0_do_core(flash_io0_do_core),
166 .flash_io1_do_core(flash_io1_do_core),
167 .flash_io2_do_core(flash_io2_do_core),
168 .flash_io3_do_core(flash_io3_do_core),
169 .flash_io0_di_core(flash_io0_di_core),
170 .flash_io1_di_core(flash_io1_di_core),
171 .flash_io2_di_core(flash_io2_di_core),
172 .flash_io3_di_core(flash_io3_di_core),
173 .SDI_core(SDI_core),
174 .CSB_core(CSB_core),
175 .pll_clk16(pll_clk16),
176 .SDO_core(SDO_core),
177 .mprj_io_in(mprj_io_in),
178 .mprj_io_out(mprj_io_out),
179 .mprj_io_oeb_n(mprj_io_oeb_n),
180 .mprj_io_hldh_n(mprj_io_hldh_n),
181 .mprj_io_enh(mprj_io_enh),
182 .mprj_io_inp_dis(mprj_io_inp_dis),
183 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
184 .mprj_io_analog_en(mprj_io_analog_en),
185 .mprj_io_analog_sel(mprj_io_analog_sel),
186 .mprj_io_analog_pol(mprj_io_analog_pol),
187 .mprj_io_dm(mprj_io_dm)
188 );
189
190 // SoC core
191 wire striVe_clk;
192 wire striVe_rstn;
193
194 wire [9:0] adc0_data_core;
195 wire [1:0] adc0_inputsrc_core;
196 wire [9:0] adc1_data_core;
197 wire [1:0] adc1_inputsrc_core;
198 wire [9:0] dac_value_core;
199 wire [1:0] comp_ninputsrc_core;
200 wire [1:0] comp_pinputsrc_core;
201 wire [7:0] spi_ro_config_core;
202
203 // LA signals
204 wire [127:0] la_output_core; // From CPU to MPRJ
205 wire [127:0] la_data_in_mprj; // From CPU to MPRJ
206 wire [127:0] la_data_out_mprj; // From CPU to MPRJ
207 wire [127:0] la_output_mprj; // From MPRJ to CPU
208 wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
209
210 // WB MI A (Mega Project)
211 wire mprj_cyc_o_core;
212 wire mprj_stb_o_core;
213 wire mprj_we_o_core;
214 wire [3:0] mprj_sel_o_core;
215 wire [31:0] mprj_adr_o_core;
216 wire [31:0] mprj_dat_o_core;
217 wire mprj_ack_i_core;
218 wire [31:0] mprj_dat_i_core;
219
220 // WB MI B (xbar)
221 wire xbar_cyc_o_core;
222 wire xbar_stb_o_core;
223 wire xbar_we_o_core;
224 wire [3:0] xbar_sel_o_core;
225 wire [31:0] xbar_adr_o_core;
226 wire [31:0] xbar_dat_o_core;
227 wire xbar_ack_i_core;
228 wire [31:0] xbar_dat_i_core;
229
230 mgmt_core soc (
231 `ifdef LVS
232 .vdd1v8(vdd1v8),
233 .vss(vss),
234 `endif
235 .ext_clk(ext_clk_core),
236 .gpio_out_pad(gpio_out_core),
237 .gpio_in_pad(gpio_in_core),
238 .gpio_mode0_pad(gpio_mode0_core),
239 .gpio_mode1_pad(gpio_mode1_core),
240 .gpio_outenb_pad(gpio_outenb_core),
241 .gpio_inenb_pad(gpio_inenb_core),
242 .adc0_ena(adc0_ena_core),
243 .adc0_convert(adc0_convert_core),
244 .adc0_data(adc0_data_core),
245 .adc0_done(adc0_done_core),
246 .adc0_clk(adc0_clk_core),
247 .adc0_inputsrc(adc0_inputsrc_core),
248 .adc1_ena(adc1_ena_core),
249 .adc1_convert(adc1_convert_core),
250 .adc1_clk(adc1_clk_core),
251 .adc1_inputsrc(adc1_inputsrc_core),
252 .adc1_data(adc1_data_core),
253 .adc1_done(adc1_done_core),
254 .dac_ena(dac_ena_core),
255 .dac_value(dac_value_core),
256 .analog_out_sel(analog_out_sel_core),
257 .opamp_ena(opamp_ena_core),
258 .opamp_bias_ena(opamp_bias_ena_core),
259 .bg_ena(bg_ena_core),
260 .comp_ena(comp_ena_core),
261 .comp_ninputsrc(comp_ninputsrc_core),
262 .comp_pinputsrc(comp_pinputsrc_core),
263 .rcosc_ena(rcosc_ena_core),
264 .overtemp_ena(overtemp_ena_core),
265 .overtemp(overtemp_core),
266 .rcosc_in(rcosc_in_core),
267 .xtal_in(xtal_in_core),
268 .comp_in(comp_in_core),
269 .spi_sck(SCK_core),
270 .spi_ro_config(spi_ro_config_core),
271 .ser_tx(ser_tx_core),
272 .ser_rx(ser_rx_core),
273 .irq_pin(irq_pin_core),
274 .flash_csb(flash_csb_core),
275 .flash_clk(flash_clk_core),
276 .flash_csb_oeb(flash_csb_oeb_core),
277 .flash_clk_oeb(flash_clk_oeb_core),
278 .flash_io0_oeb(flash_io0_oeb_core),
279 .flash_io1_oeb(flash_io1_oeb_core),
280 .flash_io2_oeb(flash_io2_oeb_core),
281 .flash_io3_oeb(flash_io3_oeb_core),
282 .flash_csb_ieb(flash_csb_ieb_core),
283 .flash_clk_ieb(flash_clk_ieb_core),
284 .flash_io0_ieb(flash_io0_ieb_core),
285 .flash_io1_ieb(flash_io1_ieb_core),
286 .flash_io2_ieb(flash_io2_ieb_core),
287 .flash_io3_ieb(flash_io3_ieb_core),
288 .flash_io0_do(flash_io0_do_core),
289 .flash_io1_do(flash_io1_do_core),
290 .flash_io2_do(flash_io2_do_core),
291 .flash_io3_do(flash_io3_do_core),
292 .flash_io0_di(flash_io0_di_core),
293 .flash_io1_di(flash_io1_di_core),
294 .flash_io2_di(flash_io2_di_core),
295 .flash_io3_di(flash_io3_di_core),
296 .por(por),
297 .porb_l(porb_l),
298 .xi(xi_core),
299 .pll_clk16(pll_clk16),
300 .SDI_core(SDI_core),
301 .CSB_core(CSB_core),
302 .SDO_core(SDO_core),
303 .SDO_enb(SDO_enb),
304 .striVe_clk(striVe_clk),
305 .striVe_rstn(striVe_rstn),
306 // Logic Analyzer
307 .la_input(la_data_out_mprj),
308 .la_output(la_output_core),
309 .la_oen(la_oen),
310 // Mega Project IO Control
311 .mprj_io_oeb_n(mprj_io_oeb_n),
312 .mprj_io_enh(mprj_io_enh),
313 .mprj_io_hldh_n(mprj_io_hldh_n),
314 .mprj_io_inp_dis(mprj_io_inp_dis),
315 .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
316 .mprj_io_analog_en(mprj_io_analog_en),
317 .mprj_io_analog_sel(mprj_io_analog_sel),
318 .mprj_io_analog_pol(mprj_io_analog_pol),
319 .mprj_io_dm(mprj_io_dm),
320 // Mega Project Slave ports (WB MI A)
321 .mprj_cyc_o(mprj_cyc_o_core),
322 .mprj_stb_o(mprj_stb_o_core),
323 .mprj_we_o(mprj_we_o_core),
324 .mprj_sel_o(mprj_sel_o_core),
325 .mprj_adr_o(mprj_adr_o_core),
326 .mprj_dat_o(mprj_dat_o_core),
327 .mprj_ack_i(mprj_ack_i_core),
328 .mprj_dat_i(mprj_dat_i_core),
329 // Xbar Switch (WB MI B)
330 .xbar_cyc_o(xbar_cyc_o_core),
331 .xbar_stb_o(xbar_stb_o_core),
332 .xbar_we_o (xbar_we_o_core),
333 .xbar_sel_o(xbar_sel_o_core),
334 .xbar_adr_o(xbar_adr_o_core),
335 .xbar_dat_o(xbar_dat_o_core),
336 .xbar_ack_i(xbar_ack_i_core),
337 .xbar_dat_i(xbar_dat_i_core)
338 );
339
340 scs8hd_ebufn_8 la_buf[127:0](
341 .Z(la_data_in_mprj),
342 .A(la_output_core),
343 .TEB(la_oen)
344 );
345
346 mega_project mprj (
347 .wb_clk_i(striVe_clk),
348 .wb_rst_i(!striVe_rstn),
349 // MGMT SoC Wishbone Slave
350 .wbs_cyc_i(mprj_cyc_o_core),
351 .wbs_stb_i(mprj_stb_o_core),
352 .wbs_we_i(mprj_we_o_core),
353 .wbs_sel_i(mprj_sel_o_core),
354 .wbs_adr_i(mprj_adr_o_core),
355 .wbs_dat_i(mprj_dat_o_core),
356 .wbs_ack_o(mprj_ack_i_core),
357 .wbs_dat_o(mprj_dat_i_core),
358 // Logic Analyzer
359 .la_data_in(la_data_in_mprj),
360 .la_data_out(la_data_out_mprj),
361 .la_oen (la_oen),
362 // IO Pads
363 .io_out(mprj_io_out),
364 .io_in (mprj_io_in)
365 );
366
367 lvlshiftdown porb_level_shift (
368 `ifdef LVS
369 .vpwr(vdd1v8),
370 .vpb(vdd1v8),
371 .vnb(vss),
372 .vgnd(vss),
373 `endif
374 .A(porb_h),
375 .X(porb_l)
376 );
377
378endmodule