blob: fba4a0de263ecdc4359fe9aa1d7e9d54fb8ad69e [file] [log] [blame] [edit]
/*----------------------------------------------------------*/
/* striVe, a raven/ravenna-like architecture in SkyWater s8 */
/* */
/* 1st edition, test of SkyWater s8 process */
/* This version is missing all analog functionality, */
/* including crystal oscillator, voltage regulator, and PLL */
/* For simplicity, the pad arrangement of Raven has been */
/* retained, even though many pads have no internal */
/* connection. */
/* */
/* This version uses custom open-source standard cell and */
/* I/O libraries. */
/* */
/* Copyright 2020 efabless, Inc. */
/* Written by Tim Edwards, December 2019 */
/* This file is open source hardware released under the */
/* Apache 2.0 license. See file LICENSE. */
/* */
/* Library efs8_pads, Copyright 2020 efabless, Inc. */
/*----------------------------------------------------------*/
`timescale 1 ns / 1 ps
/* Always define USE_PG_PIN (used by SkyWater cells) */
`define USE_PG_PIN
/* Define LVS (equivalent to USE_PG_PIN, used by qflow) */
/* `define LVS */
/* Must define functional for now because otherwise the timing delays */
/* are assumed, but they have been stripped out because some are not */
/* parsed by iverilog. */
/* `define functional */
// I/O padframe cells
`include "efs8_pads.v"
// `include "/home/tim/projects/efabless/tech/SkyWater/EFS8A/libs.ref/verilog/efs8_pads/efs8_pads.v"
// Core cells, functional source versions
`include "openstriVe_soc.v"
`include "striVe_spi.v"
`include "digital_pll.v"
module striVe (vdd, vdd1v8, vss, gpio, xi, xo, adc0_in, adc1_in, adc_high, adc_low,
comp_inn, comp_inp, RSTB, ser_rx, ser_tx, irq, SDO, SDI, CSB, SCK,
xclk, flash_csb, flash_clk, flash_io0, flash_io1, flash_io2, flash_io3);
input vdd;
input vdd1v8;
input vss;
inout [15:0] gpio;
input xi; // CMOS clock input, not a crystal
output xo; // divide-by-16 clock output
input adc0_in;
input adc1_in;
input adc_high;
input adc_low;
input comp_inn;
input comp_inp;
input RSTB; // NOTE: Replaces analog_out pin from raven chip
input ser_rx;
output ser_tx;
input irq;
output SDO;
input SDI;
input CSB;
input SCK;
input xclk;
output flash_csb;
output flash_clk;
output flash_io0;
output flash_io1;
output flash_io2;
output flash_io3;
wire vdd, vdd1v8, vss;
wire [15:0] gpio_out_core;
wire [15:0] gpio_in_core;
wire [15:0] gpio_pullupb_core;
wire [15:0] gpio_pulldownb_core;
wire [15:0] gpio_outenb_core;
// Instantiate power cells for VDD3V3 domain (4 total)
/*
vdd3v3_pad vdd3v3pad [3:0] (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
// Instantiate power cells for VDD3V3 ESD domain (4 total)
vddio_pad vddiopad [3:0] (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
// Instantiate the core voltage supply (since it is not generated on-chip)
// (1.8V) (4 total)
vdd1v8_pad vdd1v8pad [7:0] (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
// Instantiate ground cells (4 total)
vss_pad vsspad [3:0] (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
// Instantiate ground cells for ESD domain (3 total)
vssio_pad vssiopad [2:0] (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
*/
// Instantiate digital bidirectional cell
// 37 instances: 16 general purpose digital, 2 for the crystal oscillator,
// 4 for the ADC, 1 for the analog out, 2 for the comparator inputs,
// one for the IRQ input, one for the xclk input, 6 for the SPI flash
// signals, and 4 for the housekeeping SPI signals.
// GPIO pads
digital_out_pad gpio_pad [15:0] (
.out(gpio_out_core), // Signal from core to pad
.outenb(gpio_outenb_core), // Output enable (sense inverted)
.pulldownb(gpio_pulldownb_core),
.pullupb(gpio_pullupb_core),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(gpio),
.in(gpio_in_core), // Signal from pad to core
.in3v() // VDDA domain signal (unused)
);
digital_in_pad xi_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(xi),
.in(xi_core), // Signal from pad to core
.in3v() // VDDA domain signal (unused)
);
digital_out_pad xo_pad (
.out(pll_clk16), // Signal from core to pad
.outenb(vss), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(xo),
.in(), // Signal from pad to core (unused)
.in3v() // VDDA domain signal (unused)
);
/*
analog200ohm_pad adc0_in_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(adc0_in),
.core(adc0_in_core) // Not used (yet)
);
analog200ohm_pad adc1_in_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(adc1_in),
.core(adc1_in_core) // Not used (yet)
);
analog_pad adc_high_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(adc_high),
.core(adc_high_core) // Not used (yet)
);
analog_pad adc_low_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(adc_low),
.core(adc_low_core) // Not used (yet)
);
analog200ohm_pad comp_inn_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(comp_inn),
.core(comp_inn_core) // Not used (yet)
);
analog200ohm_pad comp_inp_pad (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
// .PAD(comp_inp),
.core(comp_inp_core) // Not used (yet)
);
*/
// NOTE: The analog_out pad from the raven chip has been replaced by
// the digital reset input RSTB on striVe due to the lack of an on-board
// power-on-reset circuit.
digital_in_pad RSTB_pad (
// .PAD(RSTB),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
.in(porb), // Signal from pad to core
.in3v(porb_h) // VDDA domain signal
);
digital_in_pad irq_pad (
// .PAD(irq),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss),
.in(irq_pin_core), // Signal from pad to core
.in3v() // VDDA domain signal (unused)
);
digital_out_pad SDO_pad (
.out(SDO_core), // Signal from core to pad
.outenb(SDO_enb), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(), // Input (unused)
.in3v() // VDD3V3 domain input (unused)
// .PAD(SDO),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_in_pad SDI_pad (
.in(SDI_core), // Signal from pad to core
.in3v(SDI_core_h)
// .PAD(SDI),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_in_pad CSB_pad (
.in(CSB_core), // Signal from pad to core
.in3v(CSB_core_h)
// .PAD(CSB),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_in_pad SCK_pad (
.in(SCK_core), // Signal from pad to core
.in3v(SCK_core_h)
// .PAD(SCK),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_in_pad xclk_pad (
.in(ext_clk_core), // Signal from pad to core
.in3v()
// .PAD(xclk),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad flash_csb_pad (
.out(flash_csb_core), // Signal from core to pad
.outenb(vss), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(), // Input
.in3v() // VDD3V3 domain input (unused)
// .PAD(flash_csb),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad flash_clk_pad (
.out(flash_clk_core), // Signal from core to pad
.outenb(vss), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(), // Input
.in3v() // VDD3V3 domain input (unused)
// .PAD(flash_clk),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad flash_io0_pad (
.out(flash_io0_do_core), // Signal from core to pad
.outenb(flash_io0_oeb_core), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(flash_io0_di_core), // Input
.in3v() // VDD3V3 domain input (unused)
// .PAD(flash_io0),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad flash_io1_pad (
.out(flash_io1_do_core), // Signal from core to pad
.outenb(flash_io1_oeb_core), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(flash_io1_di_core), // Input
.in3v() // VDD3V3 domain input (unused)
// .PAD(flash_io1),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad flash_io2_pad (
.out(flash_io2_do_core), // Signal from core to pad
.outenb(flash_io2_oeb_core), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(flash_io2_di_core), // Input
.in3v() // VDD3V3 domain input (unused)
// .PAD(flash_io2),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad flash_io3_pad (
.out(flash_io3_do_core), // Signal from core to pad
.outenb(flash_io3_oeb_core), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(flash_io3_di_core), // Input
.in3v() // VDD3V3 domain input (unused)
// .PAD(flash_io3),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_in_pad ser_rx_pad (
.in(ser_rx_core), // Signal from pad to core
.in3v()
// .PAD(ser_rx),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
digital_out_pad ser_tx_pad (
.out(ser_tx_core), // Signal from core to pad
.outenb(vss), // Output enable (sense inverted)
.pulldownb(vdd),
.pullupb(vdd),
.in(), // Input (unused)
.in3v() // VDD3V3 domain input (unused)
// .PAD(ser_tx),
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
/*
// Corner cells
corner_pad corner [3:0] (
// .VDDIO(vdd),
// .VDD3V3(vdd),
// .VDD1V8(vdd1v8),
// .VSS(vss),
// .VSSIO(vss)
);
*/
// SoC core
wire [9:0] adc0_data_core;
wire [1:0] adc0_inputsrc_core;
wire [9:0] adc1_data_core;
wire [1:0] adc1_inputsrc_core;
wire [9:0] dac_value_core;
wire [1:0] comp_ninputsrc_core;
wire [1:0] comp_pinputsrc_core;
wire [7:0] spi_ro_config_core;
wire [3:0] spi_ro_pll_trim_core;
wire [11:0] spi_ro_mfgr_id_core;
wire [7:0] spi_ro_prod_id_core;
wire [3:0] spi_ro_mask_rev_core;
openstriVe_soc core (
`ifdef LVS
.vdd1v8(vdd1v8),
.vss(vss),
`endif
.pll_clk(pll_clk_core),
.ext_clk(ext_clk_core),
.ext_clk_sel(ext_clk_sel_core),
.ext_reset(ext_reset_core),
.reset(por),
.gpio_out(gpio_out_core),
.gpio_in(gpio_in_core),
.gpio_pullupb(gpio_pullupb_core),
.gpio_pulldownb(gpio_pulldownb_core),
.gpio_outenb(gpio_outenb_core),
.adc0_ena(adc0_ena_core),
.adc0_convert(adc0_convert_core),
.adc0_data(adc0_data_core),
.adc0_done(adc0_done_core),
.adc0_clk(adc0_clk_core),
.adc0_inputsrc(adc0_inputsrc_core),
.adc1_ena(adc1_ena_core),
.adc1_convert(adc1_convert_core),
.adc1_clk(adc1_clk_core),
.adc1_inputsrc(adc1_inputsrc_core),
.adc1_data(adc1_data_core),
.adc1_done(adc1_done_core),
.dac_ena(dac_ena_core),
.dac_value(dac_value_core),
.analog_out_sel(analog_out_sel_core),
.opamp_ena(opamp_ena_core),
.opamp_bias_ena(opamp_bias_ena_core),
.bg_ena(bg_ena_core),
.comp_ena(comp_ena_core),
.comp_ninputsrc(comp_ninputsrc_core),
.comp_pinputsrc(comp_pinputsrc_core),
.rcosc_ena(rcosc_ena_core),
.overtemp_ena(overtemp_ena_core),
.overtemp(overtemp_core),
.rcosc_in(rcosc_in_core),
.xtal_in(xtal_in_core),
.comp_in(comp_in_core),
.spi_sck(SCK_core),
.spi_ro_config(spi_ro_config_core),
.spi_ro_xtal_ena(spi_ro_xtal_ena_core),
.spi_ro_reg_ena(spi_ro_reg_ena_core),
.spi_ro_pll_cp_ena(spi_ro_pll_cp_ena_core),
.spi_ro_pll_vco_ena(spi_ro_pll_vco_ena_core),
.spi_ro_pll_bias_ena(spi_ro_pll_bias_ena_core),
.spi_ro_pll_trim(spi_ro_pll_trim_core),
.spi_ro_mfgr_id(spi_ro_mfgr_id_core),
.spi_ro_prod_id(spi_ro_prod_id_core),
.spi_ro_mask_rev(spi_ro_mask_rev_core),
.ser_tx(ser_tx_core),
.ser_rx(ser_rx_core),
.irq_pin(irq_pin_core),
.irq_spi(irq_spi_core),
.trap(trap_core),
.flash_csb(flash_csb_core),
.flash_clk(flash_clk_core),
.flash_csb_oeb(flash_csb_oeb_core),
.flash_clk_oeb(flash_clk_oeb_core),
.flash_io0_oeb(flash_io0_oeb_core),
.flash_io1_oeb(flash_io1_oeb_core),
.flash_io2_oeb(flash_io2_oeb_core),
.flash_io3_oeb(flash_io3_oeb_core),
.flash_io0_do(flash_io0_do_core),
.flash_io1_do(flash_io1_do_core),
.flash_io2_do(flash_io2_do_core),
.flash_io3_do(flash_io3_do_core),
.flash_io0_di(flash_io0_di_core),
.flash_io1_di(flash_io1_di_core),
.flash_io2_di(flash_io2_di_core),
.flash_io3_di(flash_io3_di_core)
);
// For the mask revision input, use an array of digital constant logic cells
wire [3:0] mask_rev;
efs8hd_conb_1 mask_rev_value [3:0] (
`ifdef LVS
.vpwr(vdd1v8),
.vpb(vdd1v8),
.vnb(vss),
.vgnd(vss),
`endif
.HI(),
.LO(mask_rev)
);
// Housekeeping SPI (at 1.8V).
striVe_spi housekeeping (
`ifdef LVS
.vdd(vdd1v8),
.vss(vss),
`endif
.RSTB(porb),
.SCK(SCK_core),
.SDI(SDI_core),
.CSB(CSB_core),
.SDO(SDO_core),
.sdo_enb(SDO_enb), // NOTE: 1.8V domain
.xtal_ena(spi_ro_xtal_ena_core),
.reg_ena(spi_ro_reg_ena_core),
.pll_vco_ena(spi_ro_pll_vco_ena_core),
.pll_cp_ena(spi_ro_pll_cp_ena_core),
.pll_bias_ena(spi_ro_pll_bias_ena_core), // Use bit for 5th trim value
.pll_trim(spi_ro_pll_trim_core), // ADPLL trim (lower four bits)
.pll_bypass(ext_clk_sel_core),
.irq(irq_spi_core),
.RST(por),
.reset(ext_reset_core),
.trap(trap_core),
.mfgr_id(spi_ro_mfgr_id_core),
.prod_id(spi_ro_prod_id_core),
.mask_rev_in(mask_rev),
.mask_rev(spi_ro_mask_rev_core)
);
// On-board experimental digital PLL
// Use xi_core, assumed to be a CMOS digital clock signal. xo_core
// is used as an output and set from pll_clk16.
digital_pll pll (
`ifdef LVS
.vdd(vdd1v8),
.vss(vss),
`endif
.reset(ext_clk_sel_core),
.osc(xi_core),
.clockp({pll_clk_core, pll_clk_core90}),
.clockd({pll_clk2, pll_clk4, pll_clk8, pll_clk16}),
.div({spi_ro_pll_bias_ena_core, spi_ro_pll_trim_core})
);
endmodule
(* blackbox *)
module efs8hd_conb_1 (
output HI,
output LO
);
endmodule