| /*----------------------------------------------------------*/ |
| /* 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 |