harness phase1 initial commit
diff --git a/verilog/rtl/chip_io.v b/verilog/rtl/chip_io.v
new file mode 100644
index 0000000..0203ede
--- /dev/null
+++ b/verilog/rtl/chip_io.v
@@ -0,0 +1,300 @@
+module chip_io(
+ // Package Pins
+ inout vdd,
+ inout vdd1v8,
+ inout vss,
+ input [15:0] gpio,
+ inout xi,
+ output xo,
+ inout adc0_in,
+ inout adc1_in,
+ inout adc_high,
+ inout adc_low,
+ inout comp_inn,
+ inout comp_inp,
+ inout RSTB,
+ inout ser_rx,
+ output ser_tx,
+ inout irq,
+ output SDO,
+ inout SDI,
+ inout CSB,
+ inout SCK,
+ inout xclk,
+ output flash_csb,
+ output flash_clk,
+ output flash_io0,
+ output flash_io1,
+ output flash_io2,
+ output flash_io3,
+ // Chip Core Interface
+ input por,
+ output porb_h,
+ output ext_clk_core,
+ output xi_core,
+ input [15:0] gpio_out_core,
+ output [15:0] gpio_in_core,
+ input [15:0] gpio_mode0_core,
+ input [15:0] gpio_mode1_core,
+ input [15:0] gpio_outenb_core,
+ input [15:0] gpio_inenb_core,
+ output SCK_core,
+ output ser_rx_core,
+ inout ser_tx_core,
+ output irq_pin_core,
+ input flash_csb_core,
+ input flash_clk_core,
+ input flash_csb_oeb_core,
+ input flash_clk_oeb_core,
+ input flash_io0_oeb_core,
+ input flash_io1_oeb_core,
+ input flash_io2_oeb_core,
+ input flash_io3_oeb_core,
+ input flash_csb_ieb_core,
+ input flash_clk_ieb_core,
+ input flash_io0_ieb_core,
+ input flash_io1_ieb_core,
+ input flash_io2_ieb_core,
+ input flash_io3_ieb_core,
+ input flash_io0_do_core,
+ input flash_io1_do_core,
+ input flash_io2_do_core,
+ input flash_io3_do_core,
+ output flash_io0_di_core,
+ output flash_io1_di_core,
+ output flash_io2_di_core,
+ output flash_io3_di_core,
+ output SDI_core,
+ output CSB_core,
+ input pll_clk16,
+ input SDO_core,
+ // Mega-project IOs
+ input [`MPRJ_IO_PADS-1:0] mprj_io,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_out,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_oeb_n,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_enh,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_analog_en,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel,
+ input [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol,
+ input [`MPRJ_IO_PADS*3-1:0] mprj_io_dm,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_in
+);
+ wire analog_a, analog_b;
+ wire vddio_q, vssio_q;
+ // Instantiate power cells for VDD3V3 domain (8 total; 4 high clamps and
+ // 4 low clamps)
+ s8iom0_vdda_hvc_pad vdd3v3hclamp [1:0] (
+ `ABUTMENT_PINS
+ .drn_hvc(),
+ .src_bdy_hvc()
+ );
+
+ s8iom0_vddio_hvc_pad vddiohclamp [1:0] (
+ `ABUTMENT_PINS
+ .drn_hvc(),
+ .src_bdy_hvc()
+ );
+
+ s8iom0_vdda_lvc_pad vdd3v3lclamp [3:0] (
+ `ABUTMENT_PINS
+ .bdy2_b2b(),
+ .drn_lvc1(),
+ .drn_lvc2(),
+ .src_bdy_lvc1(),
+ .src_bdy_lvc2()
+ );
+
+ // Instantiate the core voltage supply (since it is not generated on-chip)
+ // (1.8V) (4 total, 2 high and 2 low clamps)
+ s8iom0_vccd_hvc_pad vdd1v8hclamp [1:0] (
+ `ABUTMENT_PINS
+ .drn_hvc(),
+ .src_bdy_hvc()
+ );
+
+ s8iom0_vccd_lvc_pad vdd1v8lclamp [1:0] (
+ `ABUTMENT_PINS
+ .bdy2_b2b(),
+ .drn_lvc1(),
+ .drn_lvc2(),
+ .src_bdy_lvc1(),
+ .src_bdy_lvc2()
+ );
+
+ // Instantiate ground cells (7 total, 4 high clamps and 3 low clamps)
+ s8iom0_vssa_hvc_pad vsshclamp [3:0] (
+ `ABUTMENT_PINS
+ .drn_hvc(),
+ .src_bdy_hvc()
+ );
+
+ s8iom0_vssa_lvc_pad vssalclamp (
+ `ABUTMENT_PINS
+ .bdy2_b2b(),
+ .drn_lvc1(),
+ .drn_lvc2(),
+ .src_bdy_lvc1(),
+ .src_bdy_lvc2()
+ );
+
+ s8iom0_vssd_lvc_pad vssdlclamp (
+ `ABUTMENT_PINS
+ .bdy2_b2b(),
+ .drn_lvc1(),
+ .drn_lvc2(),
+ .src_bdy_lvc1(),
+ .src_bdy_lvc2()
+ );
+
+ s8iom0_vssio_lvc_pad vssiolclamp (
+ `ABUTMENT_PINS
+ .bdy2_b2b(),
+ .drn_lvc1(),
+ .drn_lvc2(),
+ .src_bdy_lvc1(),
+ .src_bdy_lvc2()
+ );
+
+ wire [47:0] dm_all;
+ assign dm_all = {gpio_mode1_core[15], gpio_mode1_core[15], gpio_mode0_core[15],
+ gpio_mode1_core[14], gpio_mode1_core[14], gpio_mode0_core[14],
+ gpio_mode1_core[13], gpio_mode1_core[13], gpio_mode0_core[13],
+ gpio_mode1_core[12], gpio_mode1_core[12], gpio_mode0_core[12],
+ gpio_mode1_core[11], gpio_mode1_core[11], gpio_mode0_core[11],
+ gpio_mode1_core[10], gpio_mode1_core[10], gpio_mode0_core[10],
+ gpio_mode1_core[9], gpio_mode1_core[9], gpio_mode0_core[9],
+ gpio_mode1_core[8], gpio_mode1_core[8], gpio_mode0_core[8],
+ gpio_mode1_core[7], gpio_mode1_core[7], gpio_mode0_core[7],
+ gpio_mode1_core[6], gpio_mode1_core[6], gpio_mode0_core[6],
+ gpio_mode1_core[5], gpio_mode1_core[5], gpio_mode0_core[5],
+ gpio_mode1_core[4], gpio_mode1_core[4], gpio_mode0_core[4],
+ gpio_mode1_core[3], gpio_mode1_core[3], gpio_mode0_core[3],
+ gpio_mode1_core[2], gpio_mode1_core[2], gpio_mode0_core[2],
+ gpio_mode1_core[1], gpio_mode1_core[1], gpio_mode0_core[1],
+ gpio_mode1_core[0], gpio_mode1_core[0], gpio_mode0_core[0]};
+
+ wire[2:0] flash_io0_mode =
+ {flash_io0_ieb_core, flash_io0_ieb_core, flash_io0_oeb_core};
+ wire[2:0] flash_io1_mode =
+ {flash_io1_ieb_core, flash_io1_ieb_core, flash_io1_oeb_core};
+ wire[2:0] flash_io2_mode =
+ {flash_io2_ieb_core, flash_io2_ieb_core, flash_io2_oeb_core};
+ wire[2:0] flash_io3_mode =
+ {flash_io3_ieb_core, flash_io3_ieb_core, flash_io3_oeb_core};
+
+ // GPIO pads
+ `INOUT_PAD_V(
+ gpio, gpio_in_core, gpio_out_core, 16,
+ gpio_inenb_core, gpio_outenb_core, dm_all);
+
+ // Flash pads
+ `INOUT_PAD(
+ flash_io0, flash_io0_di_core, flash_io0_do_core,
+ flash_io0_ieb_core, flash_io0_oeb_core, flash_io0_mode);
+ `INOUT_PAD(
+ flash_io1, flash_io1_di_core, flash_io1_do_core,
+ flash_io1_ieb_core, flash_io1_oeb_core, flash_io1_mode);
+ `INOUT_PAD(
+ flash_io2, flash_io2_di_core, flash_io2_do_core,
+ flash_io2_ieb_core, flash_io2_oeb_core, flash_io2_mode);
+ `INOUT_PAD(
+ flash_io3, flash_io3_di_core, flash_io3_do_core,
+ flash_io3_ieb_core, flash_io3_oeb_core, flash_io3_mode);
+
+ `INPUT_PAD(xi, xi_core);
+ `INPUT_PAD(irq, irq_pin_core);
+ `INPUT_PAD(xclk,ext_clk_core);
+ `INPUT_PAD(SDI, SDI_core);
+ `INPUT_PAD(CSB, CSB_core);
+ `INPUT_PAD(SCK, SCK_core);
+
+ // Analog Pads
+ `INPUT_PAD_ANALOG(adc0_in,vss,vss);
+ `INPUT_PAD_ANALOG(adc1_in,vss,vss);
+ `INPUT_PAD_ANALOG(adc_high,vdd1v8,vdd1v8);
+ `INPUT_PAD_ANALOG(adc_low,vss,vss);
+ `INPUT_PAD_ANALOG(comp_inn,vss,vss);
+ `INPUT_PAD_ANALOG(comp_inp,vdd1v8,vss);
+
+ // Output Pads
+ `OUTPUT_PAD(xo,pll_clk16,vdd1v8,vss);
+ `OUTPUT_PAD(SDO,SDO_core,vdd1v8,SDO_enb);
+
+ `OUTPUT_PAD(flash_csb, flash_csb_core, flash_csb_ieb_core, flash_csb_oeb_core);
+ `OUTPUT_PAD(flash_clk, flash_clk_core, flash_clk_ieb_core, flash_clk_oeb_core);
+
+ // Instantiate GPIO overvoltage (I2C) compliant cell
+ // (Use this for ser_rx and ser_tx; no reason other than testing
+ // the use of the cell.) (Might be worth adding in the I2C IP from
+ // ravenna just to test on a proper I2C channel.)
+ `I2C_RX(ser_rx, ser_rx_core);
+ `I2C_TX(ser_tx, ser_tx_core);
+
+ // 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. The XRES pad is used for providing a glitch-
+ // free reset.
+ s8iom0s8_top_xres4v2 RSTB_pad (
+ `ABUTMENT_PINS
+`ifndef TOP_ROUTING
+ .pad(RSTB),
+`endif
+ .tie_weak_hi_h(xresloop), // Loop-back connection to pad through pad_a_esd_h
+ .tie_hi_esd(),
+ .tie_lo_esd(),
+ .pad_a_esd_h(xresloop),
+ .xres_h_n(porb_h),
+ .disable_pullup_h(vss), // 0 = enable pull-up on reset pad
+ .enable_h(vdd), // Power-on-reset to the power-on-reset input??
+ .en_vddio_sig_h(vss), // No idea.
+ .inp_sel_h(vss), // 1 = use filt_in_h else filter the pad input
+ .filt_in_h(vss), // Alternate input for glitch filter
+ .pullup_h(vss), // Pullup connection for alternate filter input
+ .enable_vddio(vdd1v8)
+ );
+
+ // Corner cells (These are overlay cells; it is not clear what is normally
+ // supposed to go under them.)
+ `ifndef TOP_ROUTING
+ s8iom0_corner_pad corner [3:0] (
+ .vssio(vss),
+ .vddio(vdd),
+ .vddio_q(vddio_q),
+ .vssio_q(vssio_q),
+ .amuxbus_a(analog_a),
+ .amuxbus_b(analog_b),
+ .vssd(vss),
+ .vssa(vss),
+ .vswitch(vdd),
+ .vdda(vdd),
+ .vccd(vdd1v8),
+ .vcchib(vdd1v8)
+ );
+`endif
+
+ mprj_io mprj_pads(
+ .vdd(vdd),
+ .vdd1v8(vdd1v8),
+ .vss(vss),
+ .vddio_q(vddio_q),
+ .vssio_q(vssio_q),
+ .analog_a(analog_a),
+ .analog_b(analog_b),
+ .io(mprj_io),
+ .io_out(mprj_io_out),
+ .oeb_n(mprj_io_oeb_n),
+ .hldh_n(mprj_io_hldh_n),
+ .enh(mprj_io_enh),
+ .inp_dis(mprj_io_inp_dis),
+ .ib_mode_sel(mprj_io_ib_mode_sel),
+ .analog_en(mprj_io_analog_en),
+ .analog_sel(mprj_io_analog_sel),
+ .analog_pol(mprj_io_analog_pol),
+ .dm(mprj_io_dm),
+ .io_in(mprj_io_in)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/harness.v b/verilog/rtl/harness.v
deleted file mode 100644
index b8403e1..0000000
--- a/verilog/rtl/harness.v
+++ /dev/null
@@ -1,1303 +0,0 @@
-/*----------------------------------------------------------*/
-/* 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. */
-/* */
-/* 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. */
-/* */
-/*----------------------------------------------------------*/
-
-`timescale 1 ns / 1 ps
-
-`define USE_OPENRAM
-`define USE_PG_PIN
-`define functional
-
-`ifdef SYNTH_OPENLANE
- `include "../stubs/scs8hd_conb_1.v"
- `include "../stubs/s8iom0s8.v"
- `include "../stubs/power_pads_lib.v"
-`else
-
- `ifndef LVS
- `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/s8iom0s8.v"
- `include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/power_pads_lib.v"
- `include "/ef/tech/SW/EFS8A/libs.ref/verilog/scs8hd/scs8hd.v"
-
- `include "lvlshiftdown.v"
- `include "mgmt_soc.v"
- `include "striVe_spi.v"
- `include "digital_pll.v"
- `include "striVe_clkrst.v"
- `include "../ip/crossbar.v"
- `include "../dv/dummy_slave.v"
-
- `endif
-`endif
-
-`ifdef USE_OPENRAM
- `include "sram_1rw1r_32_256_8_sky130.v"
-`endif
-
-//`define TOP_ROUTING
-`ifndef TOP_ROUTING
- `define ABUTMENT_PINS \
- .amuxbus_a(analog_a),\
- .amuxbus_b(analog_b),\
- .vssa(vss),\
- .vdda(vdd),\
- .vswitch(vdd),\
- .vddio_q(vddio_q),\
- .vcchib(vdd1v8),\
- .vddio(vdd),\
- .vccd(vdd1v8),\
- .vssio(vss),\
- .vssd(vss),\
- .vssio_q(vssio_q),
-`else
- `define ABUTMENT_PINS
-`endif
-
-// Crossbar Slaves
-`ifndef SLAVE_ADR
- `define SLAVE_ADR { \
- {8'hB0, {24{1'b0}}},\
- {8'hA0, {24{1'b0}}},\
- {8'h90, {24{1'b0}}},\
- {8'h80, {24{1'b0}}}\
- }\
-`endif
-
-`ifndef ADR_MASK
- `define ADR_MASK { \
- {8'hFF, {24{1'b0}}}, \
- {8'hFF, {24{1'b0}}}, \
- {8'hFF, {24{1'b0}}}, \
- {8'hFF, {24{1'b0}}} \
- }\
-`endif
-
-`define NM 2 // Crossbar switch number of masters
-`define NS 4 // Crossbar switch number of slaves
-`define DW 32
-`define AW 32
-
-module harness (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);
-
- inout vdd;
- inout vdd1v8;
- inout 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 [15:0] gpio_out_core;
- wire [15:0] gpio_in_core;
- wire [15:0] gpio_mode0_core;
- wire [15:0] gpio_mode1_core;
- wire [15:0] gpio_outenb_core;
- wire [15:0] gpio_inenb_core;
-
- wire analog_a, analog_b; /* Placeholders for analog signals */
-
- wire porb_h;
- wire porb_l;
- wire por_h;
- wire por;
- wire SCK_core;
- wire SDI_core;
- wire CSB_core;
- wire SDO_core;
- wire SDO_enb;
- wire spi_ro_xtal_ena_core;
- wire spi_ro_reg_ena_core;
- wire spi_ro_pll_dco_ena_core;
- wire [2:0] spi_ro_pll_sel_core;
- wire [4:0] spi_ro_pll_div_core;
- wire [25:0] spi_ro_pll_trim_core;
- wire ext_clk_sel_core;
- wire irq_spi_core;
- wire ext_reset_core;
- wire trap_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;
-
- // Instantiate power cells for VDD3V3 domain (8 total; 4 high clamps and
- // 4 low clamps)
- s8iom0_vdda_hvc_pad vdd3v3hclamp [1:0] (
- `ABUTMENT_PINS
- .drn_hvc(),
- .src_bdy_hvc()
- );
-
- s8iom0_vddio_hvc_pad vddiohclamp [1:0] (
- `ABUTMENT_PINS
- .drn_hvc(),
- .src_bdy_hvc()
- );
-
-
- s8iom0_vdda_lvc_pad vdd3v3lclamp [3:0] (
- `ABUTMENT_PINS
- .bdy2_b2b(),
- .drn_lvc1(),
- .drn_lvc2(),
- .src_bdy_lvc1(),
- .src_bdy_lvc2()
- );
-
- // Instantiate the core voltage supply (since it is not generated on-chip)
- // (1.8V) (4 total, 2 high and 2 low clamps)
-
- s8iom0_vccd_hvc_pad vdd1v8hclamp [1:0] (
- `ABUTMENT_PINS
- .drn_hvc(),
- .src_bdy_hvc()
- );
-
- s8iom0_vccd_lvc_pad vdd1v8lclamp [1:0] (
- `ABUTMENT_PINS
- .bdy2_b2b(),
- .drn_lvc1(),
- .drn_lvc2(),
- .src_bdy_lvc1(),
- .src_bdy_lvc2()
- );
-
- // Instantiate ground cells (7 total, 4 high clamps and 3 low clamps)
-
- s8iom0_vssa_hvc_pad vsshclamp [3:0] (
- `ABUTMENT_PINS
- .drn_hvc(),
- .src_bdy_hvc()
- );
-
- s8iom0_vssa_lvc_pad vssalclamp (
- `ABUTMENT_PINS
- .bdy2_b2b(),
- .drn_lvc1(),
- .drn_lvc2(),
- .src_bdy_lvc1(),
- .src_bdy_lvc2()
- );
-
- s8iom0_vssd_lvc_pad vssdlclamp (
- `ABUTMENT_PINS
- .bdy2_b2b(),
- .drn_lvc1(),
- .drn_lvc2(),
- .src_bdy_lvc1(),
- .src_bdy_lvc2()
- );
-
- s8iom0_vssio_lvc_pad vssiolclamp (
- `ABUTMENT_PINS
- .bdy2_b2b(),
- .drn_lvc1(),
- .drn_lvc2(),
- .src_bdy_lvc1(),
- .src_bdy_lvc2()
- );
-
- wire [47:0] dm_all;
-
- assign dm_all = {gpio_mode1_core[15], gpio_mode1_core[15], gpio_mode0_core[15],
- gpio_mode1_core[14], gpio_mode1_core[14], gpio_mode0_core[14],
- gpio_mode1_core[13], gpio_mode1_core[13], gpio_mode0_core[13],
- gpio_mode1_core[12], gpio_mode1_core[12], gpio_mode0_core[12],
- gpio_mode1_core[11], gpio_mode1_core[11], gpio_mode0_core[11],
- gpio_mode1_core[10], gpio_mode1_core[10], gpio_mode0_core[10],
- gpio_mode1_core[9], gpio_mode1_core[9], gpio_mode0_core[9],
- gpio_mode1_core[8], gpio_mode1_core[8], gpio_mode0_core[8],
- gpio_mode1_core[7], gpio_mode1_core[7], gpio_mode0_core[7],
- gpio_mode1_core[6], gpio_mode1_core[6], gpio_mode0_core[6],
- gpio_mode1_core[5], gpio_mode1_core[5], gpio_mode0_core[5],
- gpio_mode1_core[4], gpio_mode1_core[4], gpio_mode0_core[4],
- gpio_mode1_core[3], gpio_mode1_core[3], gpio_mode0_core[3],
- gpio_mode1_core[2], gpio_mode1_core[2], gpio_mode0_core[2],
- gpio_mode1_core[1], gpio_mode1_core[1], gpio_mode0_core[1],
- gpio_mode1_core[0], gpio_mode1_core[0], gpio_mode0_core[0]};
-
- // GPIO pads
- s8iom0_gpiov2_pad gpio_pad [15:0] (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(gpio),
-`endif
- .out(gpio_out_core), // Signal from core to pad
- .oe_n(gpio_outenb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold signals during deep sleep (sense inverted)
- .enable_h(porb_h), // Post-reset enable
- .enable_inp_h(loopb0), // Input buffer state when disabled
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(gpio_inenb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm(dm_all), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(gpio_in_core), // Signal from pad to core
- .in_h(), // VDDA domain signal (unused)
- .tie_hi_esd(),
- .tie_lo_esd(loopb0)
- );
-
- s8iom0_gpiov2_pad xi_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(xi),
-`endif
- .out(), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb1), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(por), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vdd1v8}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(xi_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb1)
- );
-
- s8iom0_gpiov2_pad xo_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(xo),
-`endif
- .out(pll_clk16), // Signal from core to pad
- .oe_n(vss), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb2), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vdd1v8, vdd1v8, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb2)
- );
-
- s8iom0_gpiov2_pad adc0_in_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(adc0_in),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb3), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vdd1v8), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad adc1_in_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(adc1_in),
-`endif
- .pad_a_noesd_h(), // Direct pad connection
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb4), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vdd1v8), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vss}), // (3 bits) Mode control
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad adc_high_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(adc_high),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb5), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vdd1v8), //
- .analog_sel(vdd1v8), //
- .analog_pol(vdd1v8), //
- .dm({vss, vss, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad adc_low_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(adc_low),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb6), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vdd1v8), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad comp_inn_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(comp_inn),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb7), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vdd1v8), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad comp_inp_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(comp_inp),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb8), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vdd1v8), //
- .analog_sel(vdd1v8), //
- .analog_pol(vss), //
- .dm({vss, vss, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- // 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. The XRES pad is used for providing a glitch-
- // free reset.
-
- s8iom0s8_top_xres4v2 RSTB_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(RSTB),
-`endif
- .tie_weak_hi_h(xresloop), // Loop-back connection to pad through pad_a_esd_h
- .tie_hi_esd(),
- .tie_lo_esd(),
- .pad_a_esd_h(xresloop),
- .xres_h_n(porb_h),
- .disable_pullup_h(vss), // 0 = enable pull-up on reset pad
- .enable_h(vdd), // Power-on-reset to the power-on-reset input??
- .en_vddio_sig_h(vss), // No idea.
- .inp_sel_h(vss), // 1 = use filt_in_h else filter the pad input
- .filt_in_h(vss), // Alternate input for glitch filter
- .pullup_h(vss), // Pullup connection for alternate filter input
- .enable_vddio(vdd1v8)
- );
-
- s8iom0_gpiov2_pad irq_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(irq),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb10), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(por), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vdd1v8}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(irq_pin_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb10)
- );
-
- s8iom0_gpiov2_pad SDO_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(SDO),
-`endif
- .out(SDO_core), // Signal from core to pad
- .oe_n(SDO_enb), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb11), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(vdd1v8), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vdd1v8, vdd1v8, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb11)
- );
-
- s8iom0_gpiov2_pad SDI_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(SDI),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb12), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(por), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vdd1v8}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(SDI_core), // Signal from pad to core
- .in_h(SDI_core_h),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad CSB_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(CSB),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb13), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(por), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vdd1v8}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(CSB_core), // Signal from pad to core
- .in_h(CSB_core_h),
- .tie_hi_esd(),
- .tie_lo_esd(loopb13)
- );
-
- s8iom0_gpiov2_pad SCK_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(SCK),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb14), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(por), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vdd1v8}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(SCK_core), // Signal from pad to core
- .in_h(SCK_core_h), // Signal in vdda domain (3.3V)
- .tie_hi_esd(),
- .tie_lo_esd(loopb14)
- );
-
- s8iom0_gpiov2_pad xclk_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(xclk),
-`endif
- .out(vss), // Signal from core to pad
- .oe_n(vdd1v8), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb15), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(por), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vss, vss, vdd1v8}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(ext_clk_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb15)
- );
-
- // assign flash_csb = (input) ?
- s8iom0_gpiov2_pad flash_csb_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(flash_csb),
-`endif
- .out(flash_csb_core), // Signal from core to pad
- .oe_n(flash_csb_oeb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb16), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(flash_csb_ieb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vdd1v8, vdd1v8, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad flash_clk_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(flash_clk),
-`endif
- .out(flash_clk_core), // Signal from core to pad
- .oe_n(flash_clk_oeb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb17), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(flash_clk_ieb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({vdd1v8, vdd1v8, vss}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0_gpiov2_pad flash_io0_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(flash_io0),
-`endif
- .out(flash_io0_do_core), // Signal from core to pad
- .oe_n(flash_io0_oeb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb18), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(flash_io0_ieb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({flash_io0_ieb_core, flash_io0_ieb_core, flash_io0_oeb_core}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(flash_io0_di_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb18)
- );
-
- s8iom0_gpiov2_pad flash_io1_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(flash_io1),
-`endif
- .out(flash_io1_do_core), // Signal from core to pad
- .oe_n(flash_io1_oeb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb19), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(flash_io1_ieb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({flash_io1_ieb_core, flash_io1_ieb_core, flash_io1_oeb_core}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(flash_io1_di_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb19)
- );
-
- s8iom0_gpiov2_pad flash_io2_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(flash_io2),
-`endif
- .out(flash_io2_do_core), // Signal from core to pad
- .oe_n(flash_io2_oeb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb20), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(flash_io2_ieb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({flash_io2_ieb_core, flash_io2_ieb_core, flash_io2_oeb_core}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(flash_io2_di_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb20)
- );
-
- s8iom0_gpiov2_pad flash_io3_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(flash_io3),
-`endif
- .out(flash_io3_do_core), // Signal from core to pad
- .oe_n(flash_io3_oeb_core), // Output enable (sense inverted)
- .hld_h_n(vdd), // Hold
- .enable_h(porb_h), // Enable
- .enable_inp_h(loopb21), // Enable input buffer
- .enable_vdda_h(porb_h), //
- .enable_vswitch_h(vss), //
- .enable_vddio(vdd1v8), //
- .inp_dis(flash_io3_ieb_core), // Disable input buffer
- .ib_mode_sel(vss), //
- .vtrip_sel(vss), //
- .slow(vss), //
- .hld_ovr(vss), //
- .analog_en(vss), //
- .analog_sel(vss), //
- .analog_pol(vss), //
- .dm({flash_io3_ieb_core, flash_io3_ieb_core, flash_io3_oeb_core}), // (3 bits) Mode control
- .pad_a_noesd_h(), // Direct pad connection
- .pad_a_esd_0_h(), // Pad connection through 150 ohms
- .pad_a_esd_1_h(), // Pad connection through 150 ohms
- .in(flash_io3_di_core), // Signal from pad to core
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd(loopb21)
- );
-
- // Instantiate GPIO overvoltage (I2C) compliant cell
- // (Use this for ser_rx and ser_tx; no reason other than testing
- // the use of the cell.) (Might be worth adding in the I2C IP from
- // ravenna just to test on a proper I2C channel.)
-
- s8iom0s8_top_gpio_ovtv2 ser_rx_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(ser_rx),
-`endif
- .out(vss),
- .oe_n(vdd1v8),
- .hld_h_n(vdd),
- .enable_h(porb_h),
- .enable_inp_h(loopb22),
- .enable_vdda_h(porb_h),
- .enable_vddio(vdd1v8),
- .enable_vswitch_h(vss),
- .inp_dis(por),
- .vtrip_sel(vss),
- .hys_trim(vdd1v8),
- .slow(vss),
- .slew_ctl({vss, vss}), // 2 bits
- .hld_ovr(vss),
- .analog_en(vss),
- .analog_sel(vss),
- .analog_pol(vss),
- .dm({vss, vss, vdd1v8}), // 3 bits
- .ib_mode_sel({vss, vss}), // 2 bits
- .vinref(vdd1v8),
- .pad_a_noesd_h(),
- .pad_a_esd_0_h(),
- .pad_a_esd_1_h(),
- .in(ser_rx_core),
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- s8iom0s8_top_gpio_ovtv2 ser_tx_pad (
- `ABUTMENT_PINS
-`ifndef TOP_ROUTING
- .pad(ser_tx),
-`endif
- .out(ser_tx_core),
- .oe_n(vss),
- .hld_h_n(vdd),
- .enable_h(porb_h),
- .enable_inp_h(loopb23),
- .enable_vdda_h(porb_h),
- .enable_vddio(vdd1v8),
- .enable_vswitch_h(vss),
- .inp_dis(vdd1v8),
- .vtrip_sel(vss),
- .hys_trim(vdd1v8),
- .slow(vss),
- .slew_ctl({vss, vss}), // 2 bits
- .hld_ovr(vss),
- .analog_en(vss),
- .analog_sel(vss),
- .analog_pol(vss),
- .dm({vdd1v8, vdd1v8, vss}), // 3 bits
- .ib_mode_sel({vss, vss}), // 2 bits
- .vinref(vdd1v8),
- .pad_a_noesd_h(),
- .pad_a_esd_0_h(),
- .pad_a_esd_1_h(),
- .in(),
- .in_h(),
- .tie_hi_esd(),
- .tie_lo_esd()
- );
-
- // Corner cells (These are overlay cells; it is not clear what is normally
- // supposed to go under them.)
- `ifndef TOP_ROUTING
- s8iom0_corner_pad corner [3:0] (
- .vssio(vss),
- .vddio(vdd),
- .vddio_q(vddio_q),
- .vssio_q(vssio_q),
- .amuxbus_a(analog_a),
- .amuxbus_b(analog_b),
- .vssd(vss),
- .vssa(vss),
- .vswitch(vdd),
- .vdda(vdd),
- .vccd(vdd1v8),
- .vcchib(vdd1v8)
- //`ABUTMENT_PINS
- );
-`endif
-
- // 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 xbar_cyc_o_core;
- wire xbar_stb_o_core;
- wire xbar_we_o_core;
- wire [3:0] xbar_sel_o_core;
- wire [31:0] xbar_adr_o_core;
- wire [31:0] xbar_dat_o_core;
- wire xbar_ack_i_core;
- wire [31:0] xbar_dat_i_core;
-
- wire striVe_clk, striVe_rstn;
-
- striVe_clkrst clkrst(
- `ifdef LVS
- .vdd1v8(vdd1v8),
- .vss(vss),
- `endif
- .ext_clk_sel(ext_clk_sel_core),
- .ext_clk(ext_clk_core),
- .pll_clk(pll_clk_core),
- .reset(por),
- .ext_reset(ext_reset_core),
- .clk(striVe_clk),
- .resetn(striVe_rstn)
- );
-
- mgmt_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),
- .clk(striVe_clk),
- .resetn(striVe_rstn),
- .gpio_out_pad(gpio_out_core),
- .gpio_in_pad(gpio_in_core),
- .gpio_mode0_pad(gpio_mode0_core),
- .gpio_mode1_pad(gpio_mode1_core),
- .gpio_outenb_pad(gpio_outenb_core),
- .gpio_inenb_pad(gpio_inenb_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),
- .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_dco_ena(spi_ro_pll_dco_ena_core),
- .spi_ro_pll_div(spi_ro_pll_div_core),
- .spi_ro_pll_sel(spi_ro_pll_sel_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_csb_ieb(flash_csb_ieb_core),
- .flash_clk_ieb(flash_clk_ieb_core),
- .flash_io0_ieb(flash_io0_ieb_core),
- .flash_io1_ieb(flash_io1_ieb_core),
- .flash_io2_ieb(flash_io2_ieb_core),
- .flash_io3_ieb(flash_io3_ieb_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),
- .xbar_cyc_o(xbar_cyc_o_core),
- .xbar_stb_o(xbar_stb_o_core),
- .xbar_we_o (xbar_we_o_core),
- .xbar_sel_o(xbar_sel_o_core),
- .xbar_adr_o(xbar_adr_o_core),
- .xbar_dat_o(xbar_dat_o_core),
- .xbar_ack_i(xbar_ack_i_core),
- .xbar_dat_i(xbar_dat_i_core)
- );
-
- // Mega-Project
- wire mega_cyc_o;
- wire mega_stb_o;
- wire mega_we_o;
- wire [3:0] mega_sel_o;
- wire [31:0] mega_adr_o;
- wire [31:0] mega_dat_o;
- wire mega_ack_i;
- wire [31:0] mega_dat_i;
-
- // Masters interface
- wire [`NM-1:0] wbm_cyc_i;
- wire [`NM-1:0] wbm_stb_i;
- wire [`NM-1:0] wbm_we_i;
- wire [(`NM*(`DW/8))-1:0] wbm_sel_i;
- wire [(`NM*`AW)-1:0] wbm_adr_i;
- wire [(`NM*`DW)-1:0] wbm_dat_i;
-
- wire [`NM-1:0] wbm_ack_o;
- wire [(`NM*`DW)-1:0] wbm_dat_o;
-
- // Slaves interfaces
- wire [`NS-1:0] wbs_ack_o;
- wire [(`NS*`DW)-1:0] wbs_dat_i;
- wire [`NS-1:0] wbs_cyc_o;
- wire [`NS-1:0] wbs_stb_o;
- wire [`NS-1:0] wbs_we_o;
- wire [(`NS*(`DW/8))-1:0] wbs_sel_o;
- wire [(`NS*`AW)-1:0] wbs_adr_o;
- wire [(`NS*`DW)-1:0] wbs_dat_o;
-
- assign wbm_cyc_i = {mega_cyc_o, xbar_cyc_o_core};
- assign wbm_stb_i = {mega_stb_o, xbar_stb_o_core};
- assign wbm_we_i = {mega_we_o , xbar_we_o_core};
- assign wbm_sel_i = {mega_sel_o, xbar_sel_o_core};
- assign wbm_adr_i = {mega_adr_o, xbar_adr_o_core};
- assign wbm_dat_i = {mega_dat_o, xbar_dat_o_core};
-
- assign xbar_ack_i_core = wbm_ack_o[0];
- assign mega_ack_i = wbm_ack_o[1];
- assign xbar_dat_i_core = wbm_dat_o[`DW-1:0];
- assign mega_dat_i = wbm_dat_o[`DW*2-1:`DW];
-
- // Instantiate four dummy slaves for testing (TO-BE-REMOVED)
- dummy_slave dummy_slaves [`NS-1:0](
- .wb_clk_i({`NS{striVe_clk}}),
- .wb_rst_i({`NS{~striVe_rstn}}),
- .wb_stb_i(wbs_stb_o),
- .wb_cyc_i(wbs_cyc_o),
- .wb_we_i(wbs_we_o),
- .wb_sel_i(wbs_sel_o),
- .wb_adr_i(wbs_adr_o),
- .wb_dat_i(wbs_dat_i),
- .wb_dat_o(wbs_dat_o),
- .wb_ack_o(wbs_ack_o)
- );
- // Crossbar Switch
- wb_xbar #(
- .NM(`NM),
- .NS(`NS),
- .AW(`AW),
- .DW(`DW),
- .SLAVE_ADR(`SLAVE_ADR),
- .ADR_MASK(`ADR_MASK)
- )
- wb_xbar(
- .wb_clk_i(striVe_clk),
- .wb_rst_i(~striVe_rstn),
-
- // Masters interface
- .wbm_cyc_i(wbm_cyc_i),
- .wbm_stb_i(wbm_stb_i),
- .wbm_we_i (wbm_we_i),
- .wbm_sel_i(wbm_sel_i),
- .wbm_adr_i(wbm_adr_i),
- .wbm_dat_i(wbm_dat_i),
- .wbm_ack_o(wbm_ack_o),
- .wbm_dat_o(wbm_dat_o),
-
- // Slaves interfaces
- .wbs_ack_i(wbs_ack_o),
- .wbs_dat_i(wbs_dat_o),
- .wbs_cyc_o(wbs_cyc_o),
- .wbs_stb_o(wbs_stb_o),
- .wbs_we_o (wbs_we_o),
- .wbs_sel_o(wbs_sel_o),
- .wbs_adr_o(wbs_adr_o),
- .wbs_dat_o(wbs_dat_i)
- );
-
- // For the mask revision input, use an array of digital constant logic cells
- wire [3:0] mask_rev;
- wire [3:0] no_connect;
- scs8hd_conb_1 mask_rev_value [3:0] (
- `ifdef LVS
- .vpwr(vdd1v8),
- .vpb(vdd1v8),
- .vnb(vss),
- .vgnd(vss),
- `endif
- .HI({no_connect[3:1], mask_rev[0]}),
- .LO({mask_rev[3:1], no_connect[0]})
- );
-
- // Housekeeping SPI at 1.8V.
-
- striVe_spi housekeeping (
- `ifdef LVS
- .vdd(vdd1v8),
- .vss(vss),
- `endif
- .RSTB(porb_l),
- .SCK(SCK_core),
- .SDI(SDI_core),
- .CSB(CSB_core),
- .SDO(SDO_core),
- .sdo_enb(SDO_enb),
-
- .xtal_ena(spi_ro_xtal_ena_core),
- .reg_ena(spi_ro_reg_ena_core),
- .pll_dco_ena(spi_ro_pll_dco_ena_core),
- .pll_sel(spi_ro_pll_sel_core),
- .pll_div(spi_ro_pll_div_core),
- .pll_trim(spi_ro_pll_trim_core),
- .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)
- );
-
- lvlshiftdown porb_level_shift (
- `ifdef LVS
- .vpwr(vdd1v8),
- .vpb(vdd1v8),
- .vnb(vss),
- .vgnd(vss),
- `endif
- .A(porb_h),
- .X(porb_l)
- );
-
- // 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(por),
- .extclk_sel(ext_clk_sel_core),
- .osc(xi_core),
- .clockc(pll_clk_core),
- .clockp({pll_clk_core0, pll_clk_core90}),
- .clockd({pll_clk2, pll_clk4, pll_clk8, pll_clk16}),
- .div(spi_ro_pll_div_core),
- .sel(spi_ro_pll_sel_core),
- .dco(spi_ro_pll_dco_ena_core),
- .ext_trim(spi_ro_pll_trim_core)
- );
-
-endmodule
diff --git a/verilog/rtl/harness_chip.v b/verilog/rtl/harness_chip.v
new file mode 100644
index 0000000..52992eb
--- /dev/null
+++ b/verilog/rtl/harness_chip.v
@@ -0,0 +1,378 @@
+/*----------------------------------------------------------*/
+/* 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. */
+/* */
+/* 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. */
+/* */
+/*----------------------------------------------------------*/
+
+`timescale 1 ns / 1 ps
+
+`define USE_OPENRAM
+`define USE_PG_PIN
+`define functional
+
+`define MPRJ_IO_PADS 32
+
+`include "pads.v"
+
+`include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/s8iom0s8.v"
+`include "/ef/tech/SW/EFS8A/libs.ref/verilog/s8iom0s8/power_pads_lib.v"
+`include "/ef/tech/SW/EFS8A/libs.ref/verilog/scs8hd/scs8hd.v"
+
+`include "lvlshiftdown.v"
+`include "mgmt_soc.v"
+`include "striVe_spi.v"
+`include "digital_pll.v"
+`include "striVe_clkrst.v"
+`include "mprj_counter.v"
+`include "mgmt_core.v"
+`include "mprj_io.v"
+`include "chip_io.v"
+
+`ifdef USE_OPENRAM
+ `include "sram_1rw1r_32_8192_8_sky130.v"
+`endif
+
+module harness_chip (
+ inout vdd,
+ inout vdd1v8,
+ inout vss,
+ inout [15:0] gpio,
+ inout [`MPRJ_IO_PADS-1:0] mprj_io,
+ 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 [15:0] gpio_out_core;
+ wire [15:0] gpio_in_core;
+ wire [15:0] gpio_mode0_core;
+ wire [15:0] gpio_mode1_core;
+ wire [15:0] gpio_outenb_core;
+ wire [15:0] gpio_inenb_core;
+
+ // Mega-Project Control
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_oeb_n;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_enh;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_en;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol;
+ wire [`MPRJ_IO_PADS*3-1:0] mprj_io_dm;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_in;
+ wire [`MPRJ_IO_PADS-1:0] mprj_io_out;
+
+ wire porb_h;
+ wire porb_l;
+ wire por;
+ wire SCK_core;
+ wire SDI_core;
+ wire CSB_core;
+ wire SDO_core;
+ wire SDO_enb;
+
+ chip_io padframe(
+ // Package Pins
+ .vdd(vdd),
+ .vdd1v8(vdd1v8),
+ .vss(vss),
+ .gpio(gpio),
+ .mprj_io(mprj_io),
+ .xi(xi),
+ .xo(xo),
+ .adc0_in(adc0_in),
+ .adc1_in(adc1_in),
+ .adc_high(adc_high),
+ .adc_low(adc_low),
+ .comp_inn(comp_inn),
+ .comp_inp(comp_inp),
+ .RSTB(RSTB),
+ .ser_rx(ser_rx),
+ .ser_tx(ser_tx),
+ .irq(irq),
+ .SDO(SDO),
+ .SDI(SDI),
+ .CSB(CSB),
+ .SCK(SCK),
+ .xclk(xclk),
+ .flash_csb(flash_csb),
+ .flash_clk(flash_clk),
+ .flash_io0(flash_io0),
+ .flash_io1(flash_io1),
+ .flash_io2(flash_io2),
+ .flash_io3(flash_io3),
+ // SoC Core Interface
+ .por(por),
+ .porb_h(porb_h),
+ .ext_clk_core(ext_clk_core),
+ .xi_core(xi_core),
+ .gpio_out_core(gpio_out_core),
+ .gpio_in_core(gpio_in_core),
+ .gpio_mode0_core(gpio_mode0_core),
+ .gpio_mode1_core(gpio_mode1_core),
+ .gpio_outenb_core(gpio_outenb_core),
+ .gpio_inenb_core(gpio_inenb_core),
+ .SCK_core(SCK_core),
+ .ser_rx_core(ser_rx_core),
+ .ser_tx_core(ser_tx_core),
+ .irq_pin_core(irq_pin_core),
+ .flash_csb_core(flash_csb_core),
+ .flash_clk_core(flash_clk_core),
+ .flash_csb_oeb_core(flash_csb_oeb_core),
+ .flash_clk_oeb_core(flash_clk_oeb_core),
+ .flash_io0_oeb_core(flash_io0_oeb_core),
+ .flash_io1_oeb_core(flash_io1_oeb_core),
+ .flash_io2_oeb_core(flash_io2_oeb_core),
+ .flash_io3_oeb_core(flash_io3_oeb_core),
+ .flash_csb_ieb_core(flash_csb_ieb_core),
+ .flash_clk_ieb_core(flash_clk_ieb_core),
+ .flash_io0_ieb_core(flash_io0_ieb_core),
+ .flash_io1_ieb_core(flash_io1_ieb_core),
+ .flash_io2_ieb_core(flash_io2_ieb_core),
+ .flash_io3_ieb_core(flash_io3_ieb_core),
+ .flash_io0_do_core(flash_io0_do_core),
+ .flash_io1_do_core(flash_io1_do_core),
+ .flash_io2_do_core(flash_io2_do_core),
+ .flash_io3_do_core(flash_io3_do_core),
+ .flash_io0_di_core(flash_io0_di_core),
+ .flash_io1_di_core(flash_io1_di_core),
+ .flash_io2_di_core(flash_io2_di_core),
+ .flash_io3_di_core(flash_io3_di_core),
+ .SDI_core(SDI_core),
+ .CSB_core(CSB_core),
+ .pll_clk16(pll_clk16),
+ .SDO_core(SDO_core),
+ .mprj_io_in(mprj_io_in),
+ .mprj_io_out(mprj_io_out),
+ .mprj_io_oeb_n(mprj_io_oeb_n),
+ .mprj_io_hldh_n(mprj_io_hldh_n),
+ .mprj_io_enh(mprj_io_enh),
+ .mprj_io_inp_dis(mprj_io_inp_dis),
+ .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
+ .mprj_io_analog_en(mprj_io_analog_en),
+ .mprj_io_analog_sel(mprj_io_analog_sel),
+ .mprj_io_analog_pol(mprj_io_analog_pol),
+ .mprj_io_dm(mprj_io_dm)
+ );
+
+ // SoC core
+ wire striVe_clk;
+ wire striVe_rstn;
+
+ 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;
+
+ // LA signals
+ wire [127:0] la_output_core; // From CPU to MPRJ
+ wire [127:0] la_data_in_mprj; // From CPU to MPRJ
+ wire [127:0] la_data_out_mprj; // From CPU to MPRJ
+ wire [127:0] la_output_mprj; // From MPRJ to CPU
+ wire [127:0] la_oen; // LA output enable from CPU perspective (active-low)
+
+ // WB MI A (Mega Project)
+ wire mprj_cyc_o_core;
+ wire mprj_stb_o_core;
+ wire mprj_we_o_core;
+ wire [3:0] mprj_sel_o_core;
+ wire [31:0] mprj_adr_o_core;
+ wire [31:0] mprj_dat_o_core;
+ wire mprj_ack_i_core;
+ wire [31:0] mprj_dat_i_core;
+
+ // WB MI B (xbar)
+ wire xbar_cyc_o_core;
+ wire xbar_stb_o_core;
+ wire xbar_we_o_core;
+ wire [3:0] xbar_sel_o_core;
+ wire [31:0] xbar_adr_o_core;
+ wire [31:0] xbar_dat_o_core;
+ wire xbar_ack_i_core;
+ wire [31:0] xbar_dat_i_core;
+
+ mgmt_core soc (
+ `ifdef LVS
+ .vdd1v8(vdd1v8),
+ .vss(vss),
+ `endif
+ .ext_clk(ext_clk_core),
+ .gpio_out_pad(gpio_out_core),
+ .gpio_in_pad(gpio_in_core),
+ .gpio_mode0_pad(gpio_mode0_core),
+ .gpio_mode1_pad(gpio_mode1_core),
+ .gpio_outenb_pad(gpio_outenb_core),
+ .gpio_inenb_pad(gpio_inenb_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),
+ .ser_tx(ser_tx_core),
+ .ser_rx(ser_rx_core),
+ .irq_pin(irq_pin_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_csb_ieb(flash_csb_ieb_core),
+ .flash_clk_ieb(flash_clk_ieb_core),
+ .flash_io0_ieb(flash_io0_ieb_core),
+ .flash_io1_ieb(flash_io1_ieb_core),
+ .flash_io2_ieb(flash_io2_ieb_core),
+ .flash_io3_ieb(flash_io3_ieb_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),
+ .por(por),
+ .porb_l(porb_l),
+ .xi(xi_core),
+ .pll_clk16(pll_clk16),
+ .SDI_core(SDI_core),
+ .CSB_core(CSB_core),
+ .SDO_core(SDO_core),
+ .SDO_enb(SDO_enb),
+ .striVe_clk(striVe_clk),
+ .striVe_rstn(striVe_rstn),
+ // Logic Analyzer
+ .la_input(la_data_out_mprj),
+ .la_output(la_output_core),
+ .la_oen(la_oen),
+ // Mega Project IO Control
+ .mprj_io_oeb_n(mprj_io_oeb_n),
+ .mprj_io_enh(mprj_io_enh),
+ .mprj_io_hldh_n(mprj_io_hldh_n),
+ .mprj_io_inp_dis(mprj_io_inp_dis),
+ .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
+ .mprj_io_analog_en(mprj_io_analog_en),
+ .mprj_io_analog_sel(mprj_io_analog_sel),
+ .mprj_io_analog_pol(mprj_io_analog_pol),
+ .mprj_io_dm(mprj_io_dm),
+ // Mega Project Slave ports (WB MI A)
+ .mprj_cyc_o(mprj_cyc_o_core),
+ .mprj_stb_o(mprj_stb_o_core),
+ .mprj_we_o(mprj_we_o_core),
+ .mprj_sel_o(mprj_sel_o_core),
+ .mprj_adr_o(mprj_adr_o_core),
+ .mprj_dat_o(mprj_dat_o_core),
+ .mprj_ack_i(mprj_ack_i_core),
+ .mprj_dat_i(mprj_dat_i_core),
+ // Xbar Switch (WB MI B)
+ .xbar_cyc_o(xbar_cyc_o_core),
+ .xbar_stb_o(xbar_stb_o_core),
+ .xbar_we_o (xbar_we_o_core),
+ .xbar_sel_o(xbar_sel_o_core),
+ .xbar_adr_o(xbar_adr_o_core),
+ .xbar_dat_o(xbar_dat_o_core),
+ .xbar_ack_i(xbar_ack_i_core),
+ .xbar_dat_i(xbar_dat_i_core)
+ );
+
+ scs8hd_ebufn_8 la_buf[127:0](
+ .Z(la_data_in_mprj),
+ .A(la_output_core),
+ .TEB(la_oen)
+ );
+
+ mega_project mprj (
+ .wb_clk_i(striVe_clk),
+ .wb_rst_i(!striVe_rstn),
+ // MGMT SoC Wishbone Slave
+ .wbs_cyc_i(mprj_cyc_o_core),
+ .wbs_stb_i(mprj_stb_o_core),
+ .wbs_we_i(mprj_we_o_core),
+ .wbs_sel_i(mprj_sel_o_core),
+ .wbs_adr_i(mprj_adr_o_core),
+ .wbs_dat_i(mprj_dat_o_core),
+ .wbs_ack_o(mprj_ack_i_core),
+ .wbs_dat_o(mprj_dat_i_core),
+ // Logic Analyzer
+ .la_data_in(la_data_in_mprj),
+ .la_data_out(la_data_out_mprj),
+ .la_oen (la_oen),
+ // IO Pads
+ .io_out(mprj_io_out),
+ .io_in (mprj_io_in)
+ );
+
+ lvlshiftdown porb_level_shift (
+ `ifdef LVS
+ .vpwr(vdd1v8),
+ .vpb(vdd1v8),
+ .vnb(vss),
+ .vgnd(vss),
+ `endif
+ .A(porb_h),
+ .X(porb_l)
+ );
+
+endmodule
diff --git a/verilog/rtl/la_wb.v b/verilog/rtl/la_wb.v
index fd713a4..68e0cc0 100644
--- a/verilog/rtl/la_wb.v
+++ b/verilog/rtl/la_wb.v
@@ -22,8 +22,9 @@
output [31:0] wb_dat_o,
output wb_ack_o,
+ input [127:0] la_data_in, // From MPRJ
output [127:0] la_data,
- output [127:0] la_ena
+ output [127:0] la_oen
);
wire resetn;
@@ -56,8 +57,9 @@
.iomem_wdata(wb_dat_i),
.iomem_rdata(wb_dat_o),
.iomem_ready(ready),
+ .la_data_in(la_data_in),
.la_data(la_data),
- .la_ena(la_ena)
+ .la_oen(la_oen)
);
endmodule
@@ -84,8 +86,9 @@
output reg [31:0] iomem_rdata,
output reg iomem_ready,
- output [127:0] la_data,
- output [127:0] la_ena
+ input [127:0] la_data_in, // From MPRJ
+ output [127:0] la_data, // To MPRJ
+ output [127:0] la_oen
);
reg [31:0] la_data_0;
@@ -102,7 +105,7 @@
wire [3:0] la_ena_sel;
assign la_data = {la_data_3, la_data_2, la_data_1, la_data_0};
- assign la_ena = {la_ena_3, la_ena_2, la_ena_1, la_ena_0};
+ assign la_oen = {la_ena_3, la_ena_2, la_ena_1, la_ena_0};
assign la_data_sel = {
(iomem_addr[7:0] == LA_DATA_3),
@@ -125,17 +128,17 @@
la_data_1 <= 0;
la_data_2 <= 0;
la_data_3 <= 0;
- la_ena_0 <= 0;
- la_ena_1 <= 0;
- la_ena_2 <= 0;
- la_ena_3 <= 0;
+ la_ena_0 <= 32'hFFFF_FFFF; // default is tri-state buff disabled
+ la_ena_1 <= 32'hFFFF_FFFF;
+ la_ena_2 <= 32'hFFFF_FFFF;
+ la_ena_3 <= 32'hFFFF_FFFF;
end else begin
iomem_ready <= 0;
if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
iomem_ready <= 1'b 1;
if (la_data_sel[0]) begin
- iomem_rdata <= la_data_0;
+ iomem_rdata <= la_data_0 | (la_data_in[31:0] & la_ena_0);
if (iomem_wstrb[0]) la_data_0[ 7: 0] <= iomem_wdata[ 7: 0];
if (iomem_wstrb[1]) la_data_0[15: 8] <= iomem_wdata[15: 8];
@@ -143,7 +146,7 @@
if (iomem_wstrb[3]) la_data_0[31:24] <= iomem_wdata[31:24];
end else if (la_data_sel[1]) begin
- iomem_rdata <= la_data_1;
+ iomem_rdata <= la_data_1 | (la_data_in[63:32] & la_ena_1);
if (iomem_wstrb[0]) la_data_1[ 7: 0] <= iomem_wdata[ 7: 0];
if (iomem_wstrb[1]) la_data_1[15: 8] <= iomem_wdata[15: 8];
@@ -151,7 +154,7 @@
if (iomem_wstrb[3]) la_data_1[31:24] <= iomem_wdata[31:24];
end else if (la_data_sel[2]) begin
- iomem_rdata <= la_data_2;
+ iomem_rdata <= la_data_2 | (la_data_in[95:64] & la_ena_2);
if (iomem_wstrb[0]) la_data_2[ 7: 0] <= iomem_wdata[ 7: 0];
if (iomem_wstrb[1]) la_data_2[15: 8] <= iomem_wdata[15: 8];
@@ -159,7 +162,7 @@
if (iomem_wstrb[3]) la_data_2[31:24] <= iomem_wdata[31:24];
end else if (la_data_sel[3]) begin
- iomem_rdata <= la_data_3;
+ iomem_rdata <= la_data_3 | (la_data_in[127:96] & la_ena_3);
if (iomem_wstrb[0]) la_data_3[ 7: 0] <= iomem_wdata[ 7: 0];
if (iomem_wstrb[1]) la_data_3[15: 8] <= iomem_wdata[15: 8];
diff --git a/verilog/rtl/mem_wb.v b/verilog/rtl/mem_wb.v
index e0b6599..bacf52c 100644
--- a/verilog/rtl/mem_wb.v
+++ b/verilog/rtl/mem_wb.v
@@ -34,15 +34,17 @@
- read transaction : asserted one clock cycle after receiving the adr_i & dat_i
*/
- reg [2:0] wb_ack_read;
-
- assign wb_ack_o = wb_we_i ? valid : &wb_ack_read;
+ reg wb_ack_read;
+ reg wb_ack_o;
always @(posedge wb_clk_i) begin
if (wb_rst_i == 1'b 1) begin
- wb_ack_read <= 3'b 00;
+ wb_ack_read <= 1'b0;
+ wb_ack_o <= 1'b0;
end else begin
- wb_ack_read <= {3{valid}} & {1'b1, wb_ack_read[2:1]};
+ // wb_ack_read <= {2{valid}} & {1'b1, wb_ack_read[1]};
+ wb_ack_o <= wb_we_i? (valid & !wb_ack_o): wb_ack_read;
+ wb_ack_read <= (valid & !wb_ack_o) & !wb_ack_read;
end
end
@@ -62,7 +64,7 @@
module soc_mem
`ifndef USE_OPENRAM
#(
- parameter integer WORDS = 256
+ parameter integer WORDS = 8192
)
`endif
(
@@ -91,12 +93,12 @@
/* Using Port 0 Only - Size: 1KB, 256x32 bits */
//sram_1rw1r_32_256_8_scn4m_subm
- sram_1rw1r_32_256_8_sky130 SRAM(
+ sram_1rw1r_32_8192_8_sky130 SRAM(
.clk0(clk),
.csb0(~ena),
.web0(~|wen),
.wmask0(wen),
- .addr0(addr[7:0]),
+ .addr0(addr[12:0]),
.din0(wdata),
.dout0(rdata)
);
diff --git a/verilog/rtl/mgmt_core.v b/verilog/rtl/mgmt_core.v
new file mode 100644
index 0000000..9fe3a79
--- /dev/null
+++ b/verilog/rtl/mgmt_core.v
@@ -0,0 +1,326 @@
+module mgmt_core(
+`ifdef LVS
+ inout vdd1v8,
+ inout vss,
+`endif
+ input ext_clk,
+ output[ 15:0] gpio_out_pad, // Connect to out on gpio pad
+ input [15:0] gpio_in_pad, // Connect to in on gpio pad
+ output [15:0] gpio_mode0_pad, // Connect to dm[0] on gpio pad
+ output [15:0] gpio_mode1_pad, // Connect to dm[2] on gpio pad
+ output [15:0] gpio_outenb_pad, // Connect to oe_n on gpio pad
+ output [15:0] gpio_inenb_pad, // Connect to inp_dis on gpio pad
+ output adc0_ena,
+ output adc0_convert,
+ input [9:0] adc0_data,
+ input adc0_done,
+ output adc0_clk,
+ output [1:0] adc0_inputsrc,
+ output adc1_ena,
+ output adc1_convert,
+ output adc1_clk,
+ output [1:0] adc1_inputsrc,
+ input [9:0] adc1_data,
+ input adc1_done,
+ output dac_ena,
+ output [9:0] dac_value,
+ output analog_out_sel, // Analog output select (DAC or bandgap)
+ output opamp_ena, // Op-amp enable for analog output
+ output opamp_bias_ena, // Op-amp bias enable for analog output
+ output bg_ena, // Bandgap enable
+ output comp_ena,
+ output [1:0] comp_ninputsrc,
+ output [1:0] comp_pinputsrc,
+ output rcosc_ena,
+ output overtemp_ena,
+ input overtemp,
+ input rcosc_in, // RC oscillator output
+ input xtal_in, // crystal oscillator output
+ input comp_in, // comparator output
+ input spi_sck,
+ input [7:0] spi_ro_config,
+ output ser_tx,
+ input ser_rx,
+ // IRQ
+ input irq_pin, // dedicated IRQ pin
+ // Flash memory control (SPI master)
+ output flash_csb,
+ output flash_clk,
+ output flash_csb_oeb,
+ output flash_clk_oeb,
+ output flash_io0_oeb,
+ output flash_io1_oeb,
+ output flash_io2_oeb,
+ output flash_io3_oeb,
+ output flash_csb_ieb,
+ output flash_clk_ieb,
+ output flash_io0_ieb,
+ output flash_io1_ieb,
+ output flash_io2_ieb,
+ output flash_io3_ieb,
+ output flash_io0_do,
+ output flash_io1_do,
+ output flash_io2_do,
+ output flash_io3_do,
+ input flash_io0_di,
+ input flash_io1_di,
+ input flash_io2_di,
+ input flash_io3_di,
+ output por,
+ input porb_l,
+ input xi,
+ output pll_clk16,
+ input SDI_core,
+ input CSB_core,
+ output SDO_core,
+ output SDO_enb,
+ // LA signals
+ input [127:0] la_input, // From Mega-Project to cpu
+ output [127:0] la_output, // From CPU to Mega-Project
+ output [127:0] la_oen, // LA output enable
+ // Mega-Project Control Signals
+ output [`MPRJ_IO_PADS-1:0] mprj_io_oeb_n,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_hldh_n,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_enh,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_inp_dis,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_analog_en,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_analog_sel,
+ output [`MPRJ_IO_PADS-1:0] mprj_io_analog_pol,
+ output [`MPRJ_IO_PADS*3-1:0] mprj_io_dm,
+ // WB MI A (Mega project)
+ input mprj_ack_i,
+ input [31:0] mprj_dat_i,
+ output mprj_cyc_o,
+ output mprj_stb_o,
+ output mprj_we_o,
+ output [3:0] mprj_sel_o,
+ output [31:0] mprj_adr_o,
+ output [31:0] mprj_dat_o,
+ // WB MI B Switch
+ input xbar_ack_i,
+ input [31:0] xbar_dat_i,
+ output xbar_cyc_o,
+ output xbar_stb_o,
+ output xbar_we_o,
+ output [3:0] xbar_sel_o,
+ output [31:0] xbar_adr_o,
+ output [31:0] xbar_dat_o,
+
+ output striVe_clk,
+ output striVe_rstn
+);
+ wire ext_clk_sel;
+ wire ext_clk;
+ wire pll_clk;
+ wire ext_reset;
+
+ striVe_clkrst clkrst(
+ `ifdef LVS
+ .vdd1v8(vdd1v8),
+ .vss(vss),
+ `endif
+ .ext_clk_sel(ext_clk_sel),
+ .ext_clk(ext_clk),
+ .pll_clk(pll_clk),
+ .reset(por),
+ .ext_reset(ext_reset),
+ .clk(striVe_clk),
+ .resetn(striVe_rstn)
+ );
+
+ // 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;
+
+ // HKSPI
+ wire [11:0] spi_ro_mfgr_id;
+ wire [7:0] spi_ro_prod_id;
+ wire [3:0] spi_ro_mask_rev;
+ wire [2:0] spi_ro_pll_sel;
+ wire [4:0] spi_ro_pll_div;
+ wire [25:0] spi_ro_pll_trim;
+
+ mgmt_soc soc (
+ `ifdef LVS
+ .vdd1v8(vdd1v8),
+ .vss(vss),
+ `endif
+ .pll_clk(pll_clk),
+ .ext_clk(ext_clk),
+ .ext_clk_sel(ext_clk_sel),
+ .clk(striVe_clk),
+ .resetn(striVe_rstn),
+ .gpio_out_pad(gpio_out_pad),
+ .gpio_in_pad(gpio_in_pad),
+ .gpio_mode0_pad(gpio_mode0_pad),
+ .gpio_mode1_pad(gpio_mode1_pad),
+ .gpio_outenb_pad(gpio_outenb_pad),
+ .gpio_inenb_pad(gpio_inenb_pad),
+ .adc0_ena(adc0_ena),
+ .adc0_convert(adc0_convert),
+ .adc0_data(adc0_data),
+ .adc0_done(adc0_done),
+ .adc0_clk(adc0_clk),
+ .adc0_inputsrc(adc0_inputsrc),
+ .adc1_ena(adc1_ena),
+ .adc1_convert(adc1_convert),
+ .adc1_clk(adc1_clk),
+ .adc1_inputsrc(adc1_inputsrc),
+ .adc1_data(adc1_data),
+ .adc1_done(adc1_done),
+ .dac_ena(dac_ena),
+ .dac_value(dac_value),
+ .analog_out_sel(analog_out_sel),
+ .opamp_ena(opamp_ena),
+ .opamp_bias_ena(opamp_bias_ena),
+ .bg_ena(bg_ena),
+ .comp_ena(comp_ena),
+ .comp_ninputsrc(comp_ninputsrc),
+ .comp_pinputsrc(comp_pinputsrc),
+ .rcosc_ena(rcosc_ena),
+ .overtemp_ena(overtemp_ena),
+ .overtemp(overtemp),
+ .rcosc_in(rcosc_in),
+ .xtal_in(xtal_in),
+ .comp_in(comp_in),
+ .spi_sck(spi_sck),
+ .spi_ro_config(spi_ro_config),
+ .spi_ro_xtal_ena(spi_ro_xtal_ena),
+ .spi_ro_reg_ena(spi_ro_reg_ena),
+ .spi_ro_pll_dco_ena(spi_ro_pll_dco_ena),
+ .spi_ro_pll_div(spi_ro_pll_div),
+ .spi_ro_pll_sel(spi_ro_pll_sel),
+ .spi_ro_pll_trim(spi_ro_pll_trim),
+ .spi_ro_mfgr_id(spi_ro_mfgr_id),
+ .spi_ro_prod_id(spi_ro_prod_id),
+ .spi_ro_mask_rev(spi_ro_mask_rev),
+ .ser_tx(ser_tx),
+ .ser_rx(ser_rx),
+ .irq_pin(irq_pin),
+ .irq_spi(irq_spi),
+ .trap(trap),
+ // Flash
+ .flash_csb(flash_csb),
+ .flash_clk(flash_clk),
+ .flash_csb_oeb(flash_csb_oeb),
+ .flash_clk_oeb(flash_clk_oeb),
+ .flash_io0_oeb(flash_io0_oeb),
+ .flash_io1_oeb(flash_io1_oeb),
+ .flash_io2_oeb(flash_io2_oeb),
+ .flash_io3_oeb(flash_io3_oeb),
+ .flash_csb_ieb(flash_csb_ieb),
+ .flash_clk_ieb(flash_clk_ieb),
+ .flash_io0_ieb(flash_io0_ieb),
+ .flash_io1_ieb(flash_io1_ieb),
+ .flash_io2_ieb(flash_io2_ieb),
+ .flash_io3_ieb(flash_io3_ieb),
+ .flash_io0_do(flash_io0_do),
+ .flash_io1_do(flash_io1_do),
+ .flash_io2_do(flash_io2_do),
+ .flash_io3_do(flash_io3_do),
+ .flash_io0_di(flash_io0_di),
+ .flash_io1_di(flash_io1_di),
+ .flash_io2_di(flash_io2_di),
+ .flash_io3_di(flash_io3_di),
+ // Logic Analyzer
+ .la_input(la_input),
+ .la_output(la_output),
+ .la_oen(la_oen),
+ // Mega-Project Control
+ .mprj_io_oeb_n(mprj_io_oeb_n),
+ .mprj_io_hldh_n(mprj_io_hldh_n),
+ .mprj_io_enh(mprj_io_enh),
+ .mprj_io_inp_dis(mprj_io_inp_dis),
+ .mprj_io_ib_mode_sel(mprj_io_ib_mode_sel),
+ .mprj_io_analog_en(mprj_io_analog_en),
+ .mprj_io_analog_sel(mprj_io_analog_sel),
+ .mprj_io_analog_pol(mprj_io_analog_pol),
+ .mprj_io_dm(mprj_io_dm),
+ // Mega Project Slave ports (WB MI A)
+ .mprj_cyc_o(mprj_cyc_o),
+ .mprj_stb_o(mprj_stb_o),
+ .mprj_we_o(mprj_we_o),
+ .mprj_sel_o(mprj_sel_o),
+ .mprj_adr_o(mprj_adr_o),
+ .mprj_dat_o(mprj_dat_o),
+ .mprj_ack_i(mprj_ack_i),
+ .mprj_dat_i(mprj_dat_i),
+ // Crossbar Switch
+ .xbar_cyc_o(xbar_cyc_o),
+ .xbar_stb_o(xbar_stb_o),
+ .xbar_we_o (xbar_we_o),
+ .xbar_sel_o(xbar_sel_o),
+ .xbar_adr_o(xbar_adr_o),
+ .xbar_dat_o(xbar_dat_o),
+ .xbar_ack_i(xbar_ack_i),
+ .xbar_dat_i(xbar_dat_i)
+ );
+
+ digital_pll pll (
+ `ifdef LVS
+ .vdd(vdd1v8),
+ .vss(vss),
+ `endif
+ .reset(por),
+ .extclk_sel(ext_clk_sel),
+ .osc(xi),
+ .clockc(pll_clk),
+ .clockp({pll_clk_core0, pll_clk_core90}),
+ .clockd({pll_clk2, pll_clk4, pll_clk8, pll_clk16}),
+ .div(spi_ro_pll_div),
+ .sel(spi_ro_pll_sel),
+ .dco(spi_ro_pll_dco_ena),
+ .ext_trim(spi_ro_pll_trim)
+ );
+
+ // For the mask revision input, use an array of digital constant logic cells
+ wire [3:0] mask_rev;
+ wire [3:0] no_connect;
+ scs8hd_conb_1 mask_rev_value [3:0] (
+ `ifdef LVS
+ .vpwr(vdd1v8),
+ .vpb(vdd1v8),
+ .vnb(vss),
+ .vgnd(vss),
+ `endif
+ .HI({no_connect[3:1], mask_rev[0]}),
+ .LO({mask_rev[3:1], no_connect[0]})
+ );
+
+ // Housekeeping SPI at 1.8V.
+ striVe_spi housekeeping (
+ `ifdef LVS
+ .vdd(vdd1v8),
+ .vss(vss),
+ `endif
+ .RSTB(porb_l),
+ .SCK(spi_sck),
+ .SDI(SDI_core),
+ .CSB(CSB_core),
+ .SDO(SDO_core),
+ .sdo_enb(SDO_enb),
+ .xtal_ena(spi_ro_xtal_ena),
+ .reg_ena(spi_ro_reg_ena),
+ .pll_dco_ena(spi_ro_pll_dco_ena),
+ .pll_sel(spi_ro_pll_sel),
+ .pll_div(spi_ro_pll_div),
+ .pll_trim(spi_ro_pll_trim),
+ .pll_bypass(ext_clk_sel),
+ .irq(irq_spi),
+ .RST(por),
+ .reset(ext_reset),
+ .trap(trap),
+ .mfgr_id(spi_ro_mfgr_id),
+ .prod_id(spi_ro_prod_id),
+ .mask_rev_in(mask_rev),
+ .mask_rev(spi_ro_mask_rev)
+ );
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/mgmt_soc.v b/verilog/rtl/mgmt_soc.v
index 007ca0f..af27f99 100644
--- a/verilog/rtl/mgmt_soc.v
+++ b/verilog/rtl/mgmt_soc.v
@@ -38,6 +38,7 @@
`include "spi_sysctrl.v"
`include "sysctrl.v"
`include "la_wb.v"
+`include "mprj_ctrl.v"
module mgmt_soc (
`ifdef LVS
@@ -62,7 +63,18 @@
// LA signals
input [127:0] la_input, // From Mega-Project to cpu
output [127:0] la_output, // From CPU to Mega-Project
- output [127:0] la_oe, // LA output enable (sensitiviy according to tri-state ?)
+ output [127:0] la_oen, // LA output enable (active low)
+
+ // Mega-Project Control
+ output [MPRJ_IO_PADS-1:0] mprj_io_oeb_n,
+ output [MPRJ_IO_PADS-1:0] mprj_io_hldh_n,
+ output [MPRJ_IO_PADS-1:0] mprj_io_enh,
+ output [MPRJ_IO_PADS-1:0] mprj_io_inp_dis,
+ output [MPRJ_IO_PADS-1:0] mprj_io_ib_mode_sel,
+ output [MPRJ_IO_PADS-1:0] mprj_io_analog_en,
+ output [MPRJ_IO_PADS-1:0] mprj_io_analog_sel,
+ output [MPRJ_IO_PADS-1:0] mprj_io_analog_pol,
+ output [MPRJ_IO_PADS*3-1:0] mprj_io_dm,
output adc0_ena,
output adc0_convert,
@@ -149,7 +161,17 @@
input flash_io2_di,
input flash_io3_di,
- // Crossbar Switch Slaves
+ // WB MI A (Mega project)
+ input mprj_ack_i,
+ input [31:0] mprj_dat_i,
+ output mprj_cyc_o,
+ output mprj_stb_o,
+ output mprj_we_o,
+ output [3:0] mprj_sel_o,
+ output [31:0] mprj_adr_o,
+ output [31:0] mprj_dat_o,
+
+ // WB MI B (xbar)
input [31:0] xbar_dat_i,
input xbar_ack_i,
output xbar_cyc_o,
@@ -160,7 +182,7 @@
output [31:0] xbar_dat_o
);
/* Memory reverted back to 256 words while memory has to be synthesized */
- parameter integer MEM_WORDS = 256;
+ parameter integer MEM_WORDS = 8192;
parameter [31:0] STACKADDR = (4*MEM_WORDS); // end of memory
parameter [31:0] PROGADDR_RESET = 32'h 1000_0000;
parameter [31:0] PROGADDR_IRQ = 32'h 0000_0000;
@@ -170,7 +192,9 @@
parameter FLASH_BASE_ADR = 32'h 1000_0000;
parameter UART_BASE_ADR = 32'h 2000_0000;
parameter GPIO_BASE_ADR = 32'h 2100_0000;
- parameter LA_BASE_ADR = 32'h 2200_0000;
+ parameter LA_BASE_ADR = 32'h 2200_0000;
+ parameter MPRJ_CTRL_ADR = 32'h 2300_0000;
+ parameter MPRJ_BASE_ADR = 32'h 3000_0000; // WB MI A
parameter SYS_BASE_ADR = 32'h 2F00_0000;
parameter SPI_BASE_ADR = 32'h 2E00_0000;
parameter FLASH_CTRL_CFG = 32'h 2D00_0000;
@@ -186,7 +210,7 @@
parameter GPIO_PU = 8'h08;
parameter GPIO_PD = 8'h0c;
- // LDO
+ // LA
parameter LA_DATA_0 = 8'h00;
parameter LA_DATA_1 = 8'h04;
parameter LA_DATA_2 = 8'h08;
@@ -196,6 +220,10 @@
parameter LA_ENA_2 = 8'h18;
parameter LA_ENA_3 = 8'h1c;
+ // Mega-Project Control
+ parameter MPRJ_IO_PADS = 32;
+ parameter MPRJ_PWR_CTRL = 32;
+
// SPI-Controlled Registers
parameter SPI_CFG = 8'h00;
parameter SPI_ENA = 8'h04;
@@ -220,7 +248,7 @@
// Wishbone Interconnect
localparam ADR_WIDTH = 32;
localparam DAT_WIDTH = 32;
- localparam NUM_SLAVES = 9;
+ localparam NUM_SLAVES = 11;
parameter [NUM_SLAVES*ADR_WIDTH-1: 0] ADR_MASK = {
{8'h80, {ADR_WIDTH-8{1'b0}}},
@@ -231,13 +259,18 @@
{8'hFF, {ADR_WIDTH-8{1'b0}}},
{8'hFF, {ADR_WIDTH-8{1'b0}}},
{8'hFF, {ADR_WIDTH-8{1'b0}}},
+ {8'hFF, {ADR_WIDTH-8{1'b0}}},
+ {8'hFF, {ADR_WIDTH-8{1'b0}}},
{8'hFF, {ADR_WIDTH-8{1'b0}}}
};
+
parameter [NUM_SLAVES*ADR_WIDTH-1: 0] SLAVE_ADR = {
{XBAR_BASE_ADR},
{SYS_BASE_ADR},
{SPI_BASE_ADR},
{FLASH_CTRL_CFG},
+ {MPRJ_BASE_ADR},
+ {MPRJ_CTRL_ADR},
{LA_BASE_ADR},
{GPIO_BASE_ADR},
{UART_BASE_ADR},
@@ -281,9 +314,9 @@
reg [1:0] comp_output_dest; // Comparator output destination
reg analog_out_sel; // Analog output select
- reg opamp_ena; // Analog output op-amp enable
- reg opamp_bias_ena; // Analog output op-amp bias enable
- reg bg_ena; // Bandgap enable
+ reg opamp_ena; // Analog output op-amp enable
+ reg opamp_bias_ena; // Analog output op-amp bias enable
+ reg bg_ena; // Bandgap enable
wire adc0_clk; // ADC0 clock (multiplexed)
wire adc1_clk; // ADC1 clock (multiplexed)
@@ -380,6 +413,19 @@
.gpio_mode0_pad(gpio_mode0_pad)
);
+ wire [7:0] mprj_io_oeb;
+ convert_gpio_sigs convert_io_bit [7:0] (
+ .gpio_out(),
+ .gpio_outenb(mprj_io_oeb),
+ .gpio_pu(mprj_io_pu),
+ .gpio_pd(mprj_io_pd),
+ .gpio_out_pad(),
+ .gpio_outenb_pad(mprj_io_outenb_pad),
+ .gpio_inenb_pad(mprj_io_inenb_pad),
+ .gpio_mode1_pad(mprj_io_mode1_pad),
+ .gpio_mode0_pad(mprj_io_mode0_pad)
+ );
+
reg [31:0] irq;
wire irq_7;
wire irq_8;
@@ -596,18 +642,15 @@
) gpio_wb (
.wb_clk_i(wb_clk_i),
.wb_rst_i(wb_rst_i),
-
.wb_adr_i(cpu_adr_o),
.wb_dat_i(cpu_dat_o),
.wb_sel_i(cpu_sel_o),
.wb_we_i(cpu_we_o),
.wb_cyc_i(cpu_cyc_o),
-
.wb_stb_i(gpio_stb_i),
.wb_ack_o(gpio_ack_o),
.wb_dat_o(gpio_dat_o),
.gpio_in_pad(gpio_in_pad),
-
.gpio(gpio),
.gpio_oeb(gpio_oeb),
.gpio_pu(gpio_pu),
@@ -729,9 +772,43 @@
.wb_dat_o(la_dat_o),
.la_data(la_output),
- .la_ena(la_oe)
+ .la_data_in(la_input),
+ .la_oen(la_oen)
);
+ // WB Slave Mega-Project Control
+ wire mprj_ctrl_stb_i;
+ wire mprj_ctrl_ack_o;
+ wire [31:0] mprj_ctrl_dat_o;
+
+ mprj_ctrl_wb #(
+ .BASE_ADR(MPRJ_CTRL_ADR),
+ .IO_PADS(MPRJ_IO_PADS),
+ .PWR_CTRL(MPRJ_PWR_CTRL)
+ ) mprj_ctrl (
+ .wb_clk_i(wb_clk_i),
+ .wb_rst_i(wb_rst_i),
+
+ .wb_adr_i(cpu_adr_o),
+ .wb_dat_i(cpu_dat_o),
+ .wb_sel_i(cpu_sel_o),
+ .wb_we_i(cpu_we_o),
+ .wb_cyc_i(cpu_cyc_o),
+ .wb_stb_i(mprj_ctrl_stb_i),
+ .wb_ack_o(mprj_ctrl_ack_o),
+ .wb_dat_o(mprj_ctrl_dat_o),
+
+ .output_en_n(mprj_io_oeb_n),
+ .holdh_n(mprj_io_hldh_n),
+ .enableh(mprj_io_enh),
+ .input_dis(mprj_io_inp_dis),
+ .ib_mode_sel(mprj_io_ib_mode_sel),
+ .analog_en(mprj_io_analog_en),
+ .analog_sel(mprj_io_analog_sel),
+ .analog_pol(mprj_io_analog_pol),
+ .digital_mode(mprj_io_dm)
+ );
+
// Wishbone Slave RAM
wire mem_stb_i;
wire mem_ack_o;
@@ -769,9 +846,9 @@
.wbm_ack_o(cpu_ack_i),
// Slaves Interface
- .wbs_stb_o({ xbar_stb_o, sys_stb_i, spi_sys_stb_i, spimemio_cfg_stb_i, la_stb_i, gpio_stb_i, uart_stb_i, spimemio_flash_stb_i, mem_stb_i }),
- .wbs_dat_i({ xbar_dat_i, sys_dat_o, spi_sys_dat_o, spimemio_cfg_dat_o, la_dat_o, gpio_dat_o, uart_dat_o, spimemio_flash_dat_o, mem_dat_o }),
- .wbs_ack_i({ xbar_ack_i, sys_ack_o, spi_sys_ack_o, spimemio_cfg_ack_o, la_ack_o, gpio_ack_o, uart_ack_o, spimemio_flash_ack_o, mem_ack_o })
+ .wbs_stb_o({ xbar_stb_o, sys_stb_i, spi_sys_stb_i, spimemio_cfg_stb_i, mprj_stb_o, mprj_ctrl_stb_i, la_stb_i, gpio_stb_i, uart_stb_i, spimemio_flash_stb_i, mem_stb_i }),
+ .wbs_dat_i({ xbar_dat_i, sys_dat_o, spi_sys_dat_o, spimemio_cfg_dat_o, mprj_dat_i, mprj_ctrl_dat_o, la_dat_o, gpio_dat_o, uart_dat_o, spimemio_flash_dat_o, mem_dat_o }),
+ .wbs_ack_i({ xbar_ack_i, sys_ack_o, spi_sys_ack_o, spimemio_cfg_ack_o, mprj_ack_i, mprj_ctrl_ack_o, la_ack_o, gpio_ack_o, uart_ack_o, spimemio_flash_ack_o, mem_ack_o })
);
// Akin to ram ack
diff --git a/verilog/rtl/mprj_counter.v b/verilog/rtl/mprj_counter.v
new file mode 100644
index 0000000..924a52c
--- /dev/null
+++ b/verilog/rtl/mprj_counter.v
@@ -0,0 +1,116 @@
+module mega_project #(
+ parameter IO_PADS = 32,
+ parameter BITS = 32
+)(
+ // Wishbone Slave ports (WB MI A)
+ input wb_clk_i,
+ input wb_rst_i,
+ input wbs_stb_i,
+ input wbs_cyc_i,
+ input wbs_we_i,
+ input [3:0] wbs_sel_i,
+ input [31:0] wbs_dat_i,
+ input [31:0] wbs_adr_i,
+ output wbs_ack_o,
+ output [31:0] wbs_dat_o,
+ // Logic Analyzer Signals
+ input [127:0] la_data_in,
+ output [127:0] la_data_out,
+ input [127:0] la_oen,
+ // IOs
+ input [IO_PADS-1:0] io_in,
+ output [IO_PADS-1:0] io_out
+);
+ wire clk;
+ wire rst;
+
+ wire [31:0] rdata;
+ wire [31:0] wdata;
+ wire [BITS-1:0] count;
+
+ wire valid;
+ wire [3:0] wstrb;
+ wire [31:0] la_write;
+
+ // WB MI A
+ assign valid = wbs_cyc_i && wbs_stb_i;
+ assign wstrb = wbs_sel_i & {4{wbs_we_i}};
+ assign wbs_dat_o = rdata;
+ assign wdata = wbs_dat_i;
+
+ // IO
+ assign io_out = count;
+
+ // LA
+ assign la_data_out = {{(127-BITS){1'b0}}, count};
+ // Assuming LA probes [63:32] are for controlling the count register
+ assign la_write = ~la_oen[63:32] & ~{BITS{valid}};
+ // Assuming LA probes [65:64] are for controlling the count clk & reset
+ assign clk = (~la_oen[64]) ? la_data_in[64]: wb_clk_i;
+ assign rst = (~la_oen[65]) ? la_data_in[65]: wb_rst_i;
+
+ counter #(
+ .BITS(BITS)
+ ) counter(
+ .clk(clk),
+ .reset(rst),
+ .ready(wbs_ack_i),
+ .valid(valid),
+ .rdata(rdata),
+ .wdata(wbs_dat_i),
+ .wstrb(wstrb),
+ .la_write(la_write),
+ .la_input(la_data_in[63:32]),
+ .count(count)
+ );
+
+endmodule
+
+module counter #(
+ parameter BITS = 32
+)(
+ input clk,
+ input reset,
+ input valid,
+ input [3:0] wstrb,
+ input [BITS-1:0] wdata,
+ input [BITS-1:0] la_write,
+ input [BITS-1:0] la_input,
+ output ready,
+ output [BITS-1:0] rdata,
+ output [BITS-1:0] count
+);
+ reg ready;
+ reg [BITS-1:0] count;
+ reg [BITS-1:0] rdata;
+
+ always @(posedge clk) begin
+ if (reset) begin
+ count <= 0;
+ ready <= 0;
+ end else begin
+ ready <= 1'b0;
+ if (~|la_write) begin
+ count <= count + 1;
+ end
+ if (valid && !ready) begin
+ ready <= 1'b1;
+ rdata <= count;
+ if (wstrb[0]) count[7:0] <= wdata[7:0];
+ if (wstrb[1]) count[15:8] <= wdata[15:8];
+ if (wstrb[2]) count[23:16] <= wdata[23:16];
+ if (wstrb[3]) count[31:24] <= wdata[31:24];
+ end
+ end
+ end
+
+ genvar i;
+ generate
+ for(i=0; i<BITS; i=i+1) begin
+ always @(posedge clk) begin
+ if (la_write[i]) count[i] <= la_input[i];
+ end
+ end
+ endgenerate
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/mprj_ctrl.v b/verilog/rtl/mprj_ctrl.v
new file mode 100644
index 0000000..9236beb
--- /dev/null
+++ b/verilog/rtl/mprj_ctrl.v
@@ -0,0 +1,193 @@
+module mprj_ctrl_wb #(
+ parameter BASE_ADR = 32'h 2300_0000,
+ parameter IO_PADS = 32, // Number of IO control registers
+ parameter PWR_CTRL = 32 // Number of power control registers
+)(
+ input wb_clk_i,
+ input wb_rst_i,
+
+ input [31:0] wb_dat_i,
+ input [31:0] wb_adr_i,
+ input [3:0] wb_sel_i,
+ input wb_cyc_i,
+ input wb_stb_i,
+ input wb_we_i,
+
+ output [31:0] wb_dat_o,
+ output wb_ack_o,
+
+ output [IO_PADS-1:0] output_en_n,
+ output [IO_PADS-1:0] holdh_n,
+ output [IO_PADS-1:0] enableh,
+ output [IO_PADS-1:0] input_dis,
+ output [IO_PADS-1:0] ib_mode_sel,
+ output [IO_PADS-1:0] analog_en,
+ output [IO_PADS-1:0] analog_sel,
+ output [IO_PADS-1:0] analog_pol,
+ output [IO_PADS*3-1:0] digital_mode
+);
+
+ wire resetn;
+ wire valid;
+ wire ready;
+ wire [3:0] iomem_we;
+
+ assign resetn = ~wb_rst_i;
+ assign valid = wb_stb_i && wb_cyc_i;
+
+ assign iomem_we = wb_sel_i & {4{wb_we_i}};
+ assign wb_ack_o = ready;
+
+ mprj_ctrl #(
+ .BASE_ADR(BASE_ADR),
+ .IO_PADS(IO_PADS),
+ .PWR_CTRL(PWR_CTRL)
+ ) mprj_ctrl (
+ .clk(wb_clk_i),
+ .resetn(resetn),
+ .iomem_addr(wb_adr_i),
+ .iomem_valid(valid),
+ .iomem_wstrb(iomem_we),
+ .iomem_wdata(wb_dat_i),
+ .iomem_rdata(wb_dat_o),
+ .iomem_ready(ready),
+ .output_en_n(output_en_n),
+ .holdh_n(holdh_n),
+ .enableh(enableh),
+ .input_dis(input_dis),
+ .ib_mode_sel(ib_mode_sel),
+ .analog_en(analog_en),
+ .analog_sel(analog_sel),
+ .analog_pol(analog_pol),
+ .digital_mode(digital_mode)
+ );
+
+endmodule
+
+module mprj_ctrl #(
+ parameter BASE_ADR = 32'h 2300_0000,
+ parameter IO_PADS = 32,
+ parameter PWR_CTRL = 32
+)(
+ input clk,
+ input resetn,
+
+ input [31:0] iomem_addr,
+ input iomem_valid,
+ input [3:0] iomem_wstrb,
+ input [31:0] iomem_wdata,
+
+ output reg [31:0] iomem_rdata,
+ output reg iomem_ready,
+
+ output [IO_PADS-1:0] output_en_n,
+ output [IO_PADS-1:0] holdh_n,
+ output [IO_PADS-1:0] enableh,
+ output [IO_PADS-1:0] input_dis,
+ output [IO_PADS-1:0] ib_mode_sel,
+ output [IO_PADS-1:0] analog_en,
+ output [IO_PADS-1:0] analog_sel,
+ output [IO_PADS-1:0] analog_pol,
+ output [IO_PADS*3-1:0] digital_mode
+);
+
+ localparam PWR_BASE_ADR = BASE_ADR + IO_PADS*4;
+ localparam OEB = 0;
+ localparam HLDH = 1;
+ localparam ENH = 2;
+ localparam INP_DIS = 3;
+ localparam MOD_SEL = 4;
+ localparam AN_EN = 5;
+ localparam AN_SEL = 6;
+ localparam AN_POL = 7;
+ localparam DM = 8;
+
+ reg [IO_PADS*32-1:0] io_ctrl;
+ reg [PWR_CTRL*32-1:0] pwr_ctrl;
+
+ wire [IO_PADS-1:0] io_ctrl_sel;
+ wire [PWR_CTRL-1:0] pwr_ctrl_sel;
+
+ genvar i;
+ generate
+ for (i=0; i<IO_PADS; i=i+1) begin
+ assign io_ctrl_sel[i] = (iomem_addr[7:0] == (BASE_ADR[7:0] + i*4));
+ assign output_en_n[i] = io_ctrl[i*32+OEB];
+ assign holdh_n[i] = io_ctrl[i*32+HLDH];
+ assign enableh[i] = io_ctrl[i*32+ENH];
+ assign input_dis[i] = io_ctrl[i*32+INP_DIS];
+ assign ib_mode_sel[i] = io_ctrl[i*32+MOD_SEL];
+ assign analog_en[i] = io_ctrl[i*32+AN_EN];
+ assign analog_sel[i] = io_ctrl[i*32+AN_SEL];
+ assign analog_pol[i] = io_ctrl[i*32+AN_POL];
+ assign digital_mode[(i+1)*3-1:i*3] = io_ctrl[i*32+DM+3-1:i*32+DM];
+ end
+ endgenerate
+
+ generate
+ for (i=0; i<PWR_CTRL; i=i+1) begin
+ assign pwr_ctrl_sel[i] = (iomem_addr[7:0] == (PWR_BASE_ADR[7:0] + i*4));
+ end
+ endgenerate
+
+ generate
+ for (i=0; i<IO_PADS; i=i+1) begin
+ always @(posedge clk) begin
+ if (!resetn) begin
+ io_ctrl[i*32+: 32] <= 0;
+ end else begin
+ iomem_ready <= 0;
+ if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
+ iomem_ready <= 1'b 1;
+
+ if (io_ctrl_sel[i]) begin
+ iomem_rdata <= io_ctrl[i*32+: 32];
+ if (iomem_wstrb[0])
+ io_ctrl[(i+1)*32-1-24:i*32] <= iomem_wdata[7:0];
+
+ if (iomem_wstrb[1])
+ io_ctrl[(i+1)*32-1-16:i*32+8] <= iomem_wdata[15:8];
+
+ if (iomem_wstrb[2])
+ io_ctrl[(i+1)*32-1-8:i*32+16] <= iomem_wdata[23:16];
+
+ if (iomem_wstrb[3])
+ io_ctrl[(i+1)*32-1:i*32+24] <= iomem_wdata[31:24];
+ end
+ end
+ end
+ end
+ end
+ endgenerate
+
+ generate
+ for (i=0; i<PWR_CTRL; i=i+1) begin
+ always @(posedge clk) begin
+ if (!resetn) begin
+ pwr_ctrl[i*32+: 32] <= 0;
+ end else begin
+ iomem_ready <= 0;
+ if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
+ iomem_ready <= 1'b 1;
+
+ if (pwr_ctrl_sel[i]) begin
+ iomem_rdata <= pwr_ctrl[i*32+: 32];
+ if (iomem_wstrb[0])
+ pwr_ctrl[(i+1)*32-1-24:i*32] <= iomem_wdata[7:0];
+
+ if (pwr_ctrl_sel[1])
+ pwr_ctrl[(i+1)*32-1-16:i*32+8] <= iomem_wdata[15:8];
+
+ if (pwr_ctrl_sel[2])
+ pwr_ctrl[(i+1)*32-1-8:i*32+16] <= iomem_wdata[23:16];
+
+ if (pwr_ctrl_sel[3])
+ pwr_ctrl[(i+1)*32-1:i*32+24] <= iomem_wdata[31:24];
+ end
+ end
+ end
+ end
+ end
+ endgenerate
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/mprj_io.v b/verilog/rtl/mprj_io.v
new file mode 100644
index 0000000..e168b67
--- /dev/null
+++ b/verilog/rtl/mprj_io.v
@@ -0,0 +1,27 @@
+module mprj_io(
+ inout vdd,
+ inout vdd1v8,
+ inout vss,
+ input vddio_q,
+ input vssio_q,
+ input analog_a,
+ input analog_b,
+ input [`MPRJ_IO_PADS-1:0] io,
+ input [`MPRJ_IO_PADS-1:0] io_out,
+ input [`MPRJ_IO_PADS-1:0] oeb_n,
+ input [`MPRJ_IO_PADS-1:0] hldh_n,
+ input [`MPRJ_IO_PADS-1:0] enh,
+ input [`MPRJ_IO_PADS-1:0] inp_dis,
+ input [`MPRJ_IO_PADS-1:0] ib_mode_sel,
+ input [`MPRJ_IO_PADS-1:0] analog_en,
+ input [`MPRJ_IO_PADS-1:0] analog_sel,
+ input [`MPRJ_IO_PADS-1:0] analog_pol,
+ input [`MPRJ_IO_PADS*3-1:0] dm,
+ output [`MPRJ_IO_PADS-1:0] io_in
+);
+
+ `MPRJ_IO_PAD_V(io, io_in, io_out, `MPRJ_IO_PADS,
+ oeb_n, hldh_n, enh, inp_dis, ib_mode_sel,
+ analog_en, analog_sel, analog_pol, dm);
+
+endmodule
\ No newline at end of file
diff --git a/verilog/rtl/pads.v b/verilog/rtl/pads.v
new file mode 100644
index 0000000..640216b
--- /dev/null
+++ b/verilog/rtl/pads.v
@@ -0,0 +1,310 @@
+`ifndef TOP_ROUTING
+ `define ABUTMENT_PINS \
+ .amuxbus_a(analog_a),\
+ .amuxbus_b(analog_b),\
+ .vssa(vss),\
+ .vdda(vdd),\
+ .vswitch(vdd),\
+ .vddio_q(vddio_q),\
+ .vcchib(vdd1v8),\
+ .vddio(vdd),\
+ .vccd(vdd1v8),\
+ .vssio(vss),\
+ .vssd(vss),\
+ .vssio_q(vssio_q),
+`else
+ `define ABUTMENT_PINS
+`endif
+
+`define INPUT_PAD(X,Y) \
+ wire loop_``X; \
+ s8iom0_gpiov2_pad X``_pad ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X), \
+ `endif \
+ .out(vss), \
+ .oe_n(vdd1v8), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(por), \
+ .ib_mode_sel(vss), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm({vss, vss, vdd1v8}), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(Y), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd(loop_``X) )
+
+`define INPUT_PAD_ANALOG(X,SEL,POL) \
+ wire loop_``X; \
+ s8iom0_gpiov2_pad X``_pad ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X), \
+ `endif \
+ .out(vss), \
+ .oe_n(vdd1v8), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(vdd1v8), \
+ .ib_mode_sel(vss), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(vdd1v8), \
+ .analog_sel(SEL), \
+ .analog_pol(POL), \
+ .dm({vss, vss, vss}), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd() )
+
+`define INPUT_PAD_V(X,Y,V) \
+ wire [V-1:0] loop_``X; \
+ s8iom0_gpiov2_pad X``_pad [V-1:0] ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X),\
+ `endif \
+ .out(), \
+ .oe_n(vdd1v8), \
+ .hld_h_n(vdd), \
+ .enable_h(vdd), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(vdd), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(por), \
+ .ib_mode_sel(vss), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm({vss, vss, vdd1v8}), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(Y), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd(loop_``X) )
+
+`define OUTPUT_PAD(X,Y,INP_DIS,OUT_EN_N) \
+ wire loop_``X; \
+ s8iom0_gpiov2_pad X``_pad ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X), \
+ `endif \
+ .out(Y), \
+ .oe_n(OUT_EN_N), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(INP_DIS), \
+ .ib_mode_sel(vss), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm({vdd1v8, vdd1v8, vss}), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd(loop_``X))
+
+`define INOUT_PAD_V(X,Y,Y_OUT,V,INP_DIS,OUT_EN_N,MODE) \
+ wire [V-1:0] loop_``X; \
+ s8iom0_gpiov2_pad X``_pad [V-1:0] ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X),\
+ `endif \
+ .out(Y_OUT), \
+ .oe_n(OUT_EN_N), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(INP_DIS), \
+ .ib_mode_sel(vss), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm(MODE), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(Y), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd(loop_``X) )
+
+`define INOUT_PAD(X,Y,Y_OUT,INP_DIS,OUT_EN_N,MODE) \
+ s8iom0_gpiov2_pad X``_pad ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X),\
+ `endif \
+ .out(Y_OUT), \
+ .oe_n(OUT_EN_N), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(INP_DIS), \
+ .ib_mode_sel(vss), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm(MODE), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(Y), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd(loop_``X) )
+
+`define MPRJ_IO_PAD_V(X,Y,Y_OUT,V,OUT_EN_N,HLD_N, ENH, INP_DIS, MODE_SEL, AN_EN, AN_SEL, AN_POL, MODE) \
+ wire [V-1:0] loop_``X; \
+ s8iom0_gpiov2_pad X``_pad [V-1:0] ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X),\
+ `endif \
+ .out(Y_OUT), \
+ .oe_n(OUT_EN_N), \
+ .hld_h_n(HLD_N), \
+ .enable_h(ENH), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vswitch_h(vss), \
+ .enable_vddio(vdd1v8), \
+ .inp_dis(INP_DIS), \
+ .ib_mode_sel(MODE_SEL), \
+ .vtrip_sel(vss), \
+ .slow(vss), \
+ .hld_ovr(vss), \
+ .analog_en(AN_EN), \
+ .analog_sel(AN_SEL), \
+ .analog_pol(AN_POL), \
+ .dm(MODE), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(Y), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd(loop_``X) )
+
+`define I2C_RX(X,Y) \
+ wire loop_``X; \
+ s8iom0s8_top_gpio_ovtv2 X``_pad ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X), \
+ `endif \
+ .out(vss), \
+ .oe_n(vdd1v8), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vddio(vdd1v8), \
+ .enable_vswitch_h(vss), \
+ .inp_dis(por), \
+ .vtrip_sel(vss), \
+ .hys_trim(vdd1v8), \
+ .slow(vss), \
+ .slew_ctl({vss, vss}), \ // 2 bits
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm({vss, vss, vdd1v8}), \ // 3 bits
+ .ib_mode_sel({vss, vss}), \ // 2 bits
+ .vinref(vdd1v8), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(Y), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd() )
+
+`define I2C_TX(X,Y) \
+ wire loop_``X; \
+ s8iom0s8_top_gpio_ovtv2 X``_pad ( \
+ `ABUTMENT_PINS \
+ `ifndef TOP_ROUTING \
+ .pad(X), \
+ `endif \
+ .out(Y), \
+ .oe_n(vss), \
+ .hld_h_n(vdd), \
+ .enable_h(porb_h), \
+ .enable_inp_h(loop_``X), \
+ .enable_vdda_h(porb_h), \
+ .enable_vddio(vdd1v8), \
+ .enable_vswitch_h(vss), \
+ .inp_dis(vdd1v8), \
+ .vtrip_sel(vss), \
+ .hys_trim(vdd1v8), \
+ .slow(vss), \
+ .slew_ctl({vss, vss}), \ // 2 bits
+ .hld_ovr(vss), \
+ .analog_en(vss), \
+ .analog_sel(vss), \
+ .analog_pol(vss), \
+ .dm({vdd1v8, vdd1v8, vss}), \ // 3 bits
+ .ib_mode_sel({vss, vss}), \ // 2 bits
+ .vinref(vdd1v8), \
+ .pad_a_noesd_h(), \
+ .pad_a_esd_0_h(), \
+ .pad_a_esd_1_h(), \
+ .in(), \
+ .in_h(), \
+ .tie_hi_esd(), \
+ .tie_lo_esd())
diff --git a/verilog/rtl/sram_1rw1r_32_256_8_sky130.v b/verilog/rtl/sram_1rw1r_32_8192_8_sky130.v
similarity index 96%
rename from verilog/rtl/sram_1rw1r_32_256_8_sky130.v
rename to verilog/rtl/sram_1rw1r_32_8192_8_sky130.v
index 2dd1c62..dfd9a45 100644
--- a/verilog/rtl/sram_1rw1r_32_256_8_sky130.v
+++ b/verilog/rtl/sram_1rw1r_32_8192_8_sky130.v
@@ -1,9 +1,9 @@
// OpenRAM SRAM model
-// Words: 256
+// Words: 8192
// Word size: 32
// Write size: 8
-module sram_1rw1r_32_256_8_sky130(
+module sram_1rw1r_32_8192_8_sky130(
// Port 0: RW
clk0,csb0,web0,wmask0,addr0,din0,dout0,
// Port 1: R
@@ -12,7 +12,7 @@
parameter NUM_WMASKS = 4 ;
parameter DATA_WIDTH = 32 ;
- parameter ADDR_WIDTH = 8 ;
+ parameter ADDR_WIDTH = 13 ;
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
// FIXME: This delay is arbitrary.
parameter DELAY = 1 ;