From 6e8c794f6011058304f459f5c1e88c7d0804fa23 Mon Sep 17 00:00:00 2001
From: dam1n19 <dam1n19@soton.ac.uk>
Date: Tue, 20 Jun 2023 14:46:20 +0100
Subject: [PATCH] Wired Chip Level and made changes

---
 flist/nanosoc.flist                           |   34 +
 .../nanosoc_chip/chip/verilog/nanosoc_chip.v  | 1760 ++---------------
 .../verilog/nanosoc_ss_systemctrl.v           |    4 +-
 .../nanosoc_system/verilog/nanosoc_system.v   |   24 +-
 4 files changed, 225 insertions(+), 1597 deletions(-)
 create mode 100644 flist/nanosoc.flist

diff --git a/flist/nanosoc.flist b/flist/nanosoc.flist
new file mode 100644
index 0000000..fc7bb4a
--- /dev/null
+++ b/flist/nanosoc.flist
@@ -0,0 +1,34 @@
+//-----------------------------------------------------------------------------
+// NanoSoC Chip Related IP Filelist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for NanoSoC Bus Matrix IP
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    NanoSoC Bus Matrix IP search path    =============
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_chip.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_chip_pads.v
+
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_cpu.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_sysio.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_sys_ahb_decode.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_apb_subsystem.v
+
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_ahb_cs_rom_table.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_mcu_pin_mux.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_mcu_stclkctrl.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_mcu_clkctrl.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_mcu_sysctrl.v
+
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_apb_usrt.v
+$(SOCLABS_NANOSOC_TECH_DIR)/system/src/verilog/nanosoc_ahb_bootrom.v
\ No newline at end of file
diff --git a/system/nanosoc_chip/chip/verilog/nanosoc_chip.v b/system/nanosoc_chip/chip/verilog/nanosoc_chip.v
index 77721ca..8c4f729 100644
--- a/system/nanosoc_chip/chip/verilog/nanosoc_chip.v
+++ b/system/nanosoc_chip/chip/verilog/nanosoc_chip.v
@@ -1,1606 +1,196 @@
-//-----------------------------------------------------------------------------
-// customised top-level Cortex-M0 'nanosoc' controller
-// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
-//
-// Contributors
-//
-// David Flynn (d.w.flynn@soton.ac.uk)
-//
-// Copyright (C) 2021-3, SoC Labs (www.soclabs.org)
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
-// The confidential and proprietary information contained in this file may
-// only be used by a person authorised under and to the extent permitted
-// by a subsisting licensing agreement from Arm Limited or its affiliates.
-//
-//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
-//                ALL RIGHTS RESERVED
-//
-// This entire notice must be reproduced on all copies of this file
-// and copies of this file may only be made by a person if such person is
-// permitted to do so under the terms of a subsisting license agreement
-// from Arm Limited or its affiliates.
-//
-//      SVN Information
-//
-//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
-//
-//      Revision            : $Revision: 371321 $
-//
-//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
-//
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller
-//-----------------------------------------------------------------------------
-//
-
-//param ADDR_WIDTH_RAM = 9;  // 512B
-//param ADDR_WIDTH_RAM = 10; // 1024B
-//param ADDR_WIDTH_RAM = 11; // 2KB
-//param ADDR_WIDTH_RAM = 12; // 4KB
-//param ADDR_WIDTH_RAM = 13; // 8KB
-//param ADDR_WIDTH_RAM = 14; // 16KB
-//param ADDR_WIDTH_RAM = 15; // 32KB
-//param ADDR_WIDTH_RAM = 16; // 64KB
-
 module nanosoc_chip #(
-    parameter SYS_ADDR_W = 32,
-    parameter SYS_DATA_W = 32,
-    parameter RAM_ADDR_W = 14,
-    parameter RAM_DATA_W = 32
-  )(
-  `ifdef POWER_PINS
-    inout  wire          VDDIO,
-    inout  wire          VSSIO,
-    inout  wire          VDD,
-    inout  wire          VSS,
-  `endif
-    input  wire          xtal_clk_i,
-    output wire          xtal_clk_o,
-    input  wire          nrst_i,
-    input  wire  [15:0]  p0_i, // level-shifted input from pad
-    output wire  [15:0]  p0_o, // output port drive
-    output wire  [15:0]  p0_e, // active high output drive enable (pad tech dependent)
-    output wire  [15:0]  p0_z, // active low output drive enable (pad tech dependent)
-    input  wire  [15:0]  p1_i, // level-shifted input from pad
-    output wire  [15:0]  p1_o, // output port drive
-    output wire  [15:0]  p1_e, // active high output drive enable (pad tech dependent)
-    output wire  [15:0]  p1_z, // active low output drive enable (pad tech dependent)
-    input  wire          swdio_i,
-    output wire          swdio_o,
-    output wire          swdio_e,
-    output wire          swdio_z,
-    input  wire          swdclk_i
-  );
-
-  localparam    CLKGATE_PRESENT = 0;
-  localparam    DMA_CHANNEL_NUM = 2;
-  localparam    INCLUDE_DMA = 1;
-  localparam    CORTEX_M0 = 1;
-
-//------------------------------------
-// CMSDK internal wire naming preserved
-//------------------------------------
+  parameter integer FT1248_WIDTH	  = 1 // FTDI Interface 1,2,4 width supported
+)(
+`ifdef POWER_PINS
+  inout  wire          VDDIO,
+  inout  wire          VSSIO,
+  inout  wire          VDD,
+  inout  wire          VSS,
+`endif
+  input  wire          xtal_clk_i,
+  output wire          xtal_clk_o,
+  input  wire          nrst_i,
+  input  wire  [15:0]  p0_i, // level-shifted input from pad
+  output wire  [15:0]  p0_o, // output port drive
+  output wire  [15:0]  p0_e, // active high output drive enable (pad tech dependent)
+  output wire  [15:0]  p0_z, // active low output drive enable (pad tech dependent)
+  input  wire  [15:0]  p1_i, // level-shifted input from pad
+  output wire  [15:0]  p1_o, // output port drive
+  output wire  [15:0]  p1_e, // active high output drive enable (pad tech dependent)
+  output wire  [15:0]  p1_z, // active low output drive enable (pad tech dependent)
+  input  wire          swdio_i,
+  output wire          swdio_o,
+  output wire          swdio_e,
+  output wire          swdio_z,
+  input  wire          swdclk_i
+);
 
-  wire          xtal_clk_in = xtal_clk_i;
-  wire          xtal_clk_out;
-  wire          pll_clk;
-  wire          CLK;
+  //--------------------------
+  // System Wiring
+  //--------------------------
+  // Free-running and Crystal Clock Output
+  wire                     SYS_CLK;              // System Input Clock
+  wire                     PLL_CLK;              // Phase-Locked Loop Clock
+  wire                     SYS_XTALCLK_OUT;      // Crystal Clock Output
   
-  assign        xtal_clk_o = xtal_clk_out;
-  wire          SYSRESETn = nrst_i;
-  wire  [15:0]  p0_in;             // level-shifted input from pad
-  wire  [15:0]  p0_out;            // output port drive
-  wire  [15:0]  p0_out_en;         // active high output drive enable (pad tech dependent)
-  wire  [15:0]  p0_out_nen;        // active low output drive enable (pad tech dependent)
-
-  wire  [15:0]  p1_in;            // level-shifted input from pad
-  wire  [15:0]  p1_out;           // output port drive
-  wire  [15:0]  p1_out_en;        // active high output drive enable (pad tech dependent)
-  wire  [15:0]  p1_out_nen;       // active low output drive enable (pad tech dependent)
-  wire  [15:0]  p1_in_mux;        // level-shifted input from pad
-  wire  [15:0]  p1_out_mux;       // output port drive
-  wire  [15:0]  p1_out_en_mux;    // active high output drive enable (pad tech dependent)
-  wire  [15:0]  p1_out_nen_mux;   // active low output drive enable (pad tech dependent)
-
-  wire          swdio_in;
-  wire          swdio_out;
-  wire          swdio_out_en;
-  wire          swdio_out_nen;
-  wire          swdclk_in;
-
-  wire          ft_clk_o;
-  wire          ft_ssn_o;
-  wire          ft_miso_i;
-  wire          ft_miosio_o;
-  wire          ft_miosio_e;
-  wire          ft_miosio_z;
-  wire          ft_miosio_i;
-
- // --------------------------------------------------------------------------------
- // Port-0 IO pad driver mapping
- // --------------------------------------------------------------------------------
-
-  assign        p0_in = p0_i;      // level-shifted input from pad
-  assign        p0_o = p0_out;     // output port drive
-  assign        p0_e = p0_out_en;  // active high output drive enable (pad tech dependent)
-  assign        p0_z = p0_out_nen; // active low output drive enable (pad tech dependent)
-
-
- // --------------------------------------------------------------------------------
- // Port-1 IO pad driver mapping
- // --------------------------------------------------------------------------------
-
-// modify p1_mux [3:0] for ft1248 interface
-//  assign        p1_in_mux[3:0] = p1_i[3:0]; // IO MUX controlled bidirectionals
-//  assign        p1_o[3:0] = p1_out_mux[3:0];    
-//  assign        p1_e[3:0] = p1_out_en_mux[3:0];
-//  assign        p1_z[3:0] = p1_out_nen_mux[3:0];
-
-  assign        ft_miso_i = p1_i[0]; // FT_MISO INPUT pad configuration
-  assign        p1_in_mux[0] = p1_i[0];
-  assign        p1_o[0] = 1'b0;    
-  assign        p1_e[0] = 1'b0;
-  assign        p1_z[0] = 1'b1;
+  // Scan Wiring
+  wire                     SYS_SCANENABLE;      // Scan Mode Enable
+  wire                     SYS_TESTMODE;        // Test Mode Enable (Override Synchronisers)
+  wire                     INC_SCANINHCLK;      // HCLK scan wire
+  wire                     INC_SCANOUTHCLK;     // Scan Chain Output
   
-  assign        p1_in_mux[1] = p1_i[1]; // FT_CLK OUTPUT pad configuration
-  assign        p1_o[1] = ft_clk_o;    
-  assign        p1_e[1] = 1'b1; 
-  assign        p1_z[1] = 1'b0;
-
-  assign        ft_miosio_i = p1_i[2]; // FT_MIOSIO INOUT pad configuration
-  assign        p1_in_mux[2] = p1_i[2];
-  assign        p1_o[2] = ft_miosio_o;    
-  assign        p1_e[2] = ft_miosio_e;
-  assign        p1_z[2] = ft_miosio_z;
-
-  assign        p1_in_mux[3] = p1_i[3]; // FT_SSN OUTPUT pad configuration
-  assign        p1_o[3] = ft_ssn_o;    
-  assign        p1_e[3] = 1'b1; 
-  assign        p1_z[3] = 1'b0;
-
-  assign        p1_in_mux[15:4] = p1_i[15:4]; // IO MUX controlled bidirectionals
-  assign        p1_o[15:4] = p1_out_mux[15:4];    
-  assign        p1_e[15:4] = p1_out_en_mux[15:4];
-  assign        p1_z[15:4] = p1_out_nen_mux[15:4];
-
-
-//TIE_HI uTIEHI (.tiehi(tiehi));
- wire tiehi = 1'b1;
-//TIE_LO uTIELO (.tielo(tielo));
- wire tielo = 1'b0;
-
-//----------------------------------------
-// SoC Clock and Reset Management
-//----------------------------------------
-  wire         PORESETn;// Power on reset
-  wire         HRESETn; // AHB reset
-  wire         PRESETn; // APB and peripheral reset
-  wire         DBGRESETn; // Debug system reset
-  wire         FCLK;    // Free running system clock
-  wire         HCLK;    // System clock from PMU
-  wire         DCLK;
-  wire         SCLK;
-  wire         PCLK;    // Peripheral clock
-  wire         PCLKG;   // Gated PCLK for APB
-  wire         PCLKEN;  // Clock divider for AHB to APB bridge
-  wire         APBACTIVE;
+  // Serial-Wire Debug
+  wire                     CPU_0_SWDI;         // SWD data input
+  wire                     CPU_0_SWCLK;        // SWD clock
+  wire                     CPU_0_SWDO;         // SWD data output
+  wire                     CPU_0_SWDOEN;       // SWD data enable
   
-  // event signals
-  wire         TXEV;
-  wire         RXEV;
-  wire         nTRST;            // JTAG - Test reset (active low)
-  wire         SWDI;          // JTAG/SWD - TMS / SWD data input
-  wire         SWCLK;         // JTAG/SWD - TCK / SWCLK
-  wire         SWDO;             // SWD - SWD data output
-  wire         SWDOEN;           // SWD - SWD data output enable
-  wire         SYSRESETREQ;    // processor system reset request
-  wire         WDOGRESETREQ;   // watchdog system reset request
-  wire         HRESETREQ;      // Combined system reset request
-  wire         NANOSOC_SYSRESETREQ; // Combined system reset request
-  wire         CCTRLRESETREQ;
-  wire         PMUHRESETREQ;
-  wire         PMUDBGRESETREQ;
-  wire         LOCKUP;
-  wire         LOCKUPRESET;
-  wire         SLEEPING;
-  wire         GATEHCLK;         // Processor status - safe to gate HCLK
-  wire         WAKEUP;           // Wake up request from WIC
-  wire         WICENREQ;         // WIC enable request from PMU
-  wire         WICENACK;         // WIC enable ack to PMU
-  wire         PMUENABLE;
-  wire         CDBGPWRUPREQ;     // Debug Power Up request to PMU
-  wire         CDBGPWRUPACK;     // Debug Power Up ACK from PMU
-  wire         SLEEPHOLDREQn;    // Sleep extension request from PMU
-  wire         SLEEPHOLDACKn;    // Sleep extension request to PMU
-  wire         SYSPWRDOWNACK;
-  wire         DBGPWRDOWNACK;
-  wire         SYSPWRDOWN;
-  wire         DBGPWRDOWN;
-  wire         SYSISOLATEn;
-  wire         SYSRETAINn;
-  wire         DBGISOLATEn;
-  wire         SLEEPDEEP;
-  wire         ADPRESETREQ;
-  // Scan test dummy signals; not connected until scan insertion
-  wire          TESTMODE;        // Test mode enable signal (override synchronizers etc)
-  wire          SCANENABLE;      // Scan enable signal
-  wire          SCANINHCLK;      // HCLK scan input
-  wire          SCANOUTHCLK;     // Scan Chain wire  
-
-// not required for FPGA
-    assign        TESTMODE = 1'b0; 
-    assign        SCANENABLE = 1'b0; 
-    assign        SCANINHCLK = 1'b0; 
-    assign        SCANOUTHCLK = 1'b0;
-
-// Technology-specific PLL/Frequecy synthesizer would generate
-//   CLK, FCLK (Free running system clock)
-// from
-//    xtal_clk_in
-
-    assign  pll_clk = xtal_clk_in; // default to no PLL
-    
-    assign  CLK = (TESTMODE) ? xtal_clk_in : pll_clk;
+  // FT1248 Interace - FT1248
+  wire                     FT_CLK_O;    // SCLK
+  wire                     FT_SSN_O;    // SS_N
+  wire                     FT_MISO_I;   // MISO
+  wire  [FT1248_WIDTH-1:0] FT_MIOSIO_O; // MIOSIO tristate when enabled
+  wire  [FT1248_WIDTH-1:0] FT_MIOSIO_E; // MIOSIO tristate enable (active hi)
+  wire  [FT1248_WIDTH-1:0] FT_MIOSIO_Z; // MIOSIO tristate enable (active lo)
+  wire  [FT1248_WIDTH-1:0] FT_MIOSIO_I; // MIOSIO tristate input
+  wire               [7:0] FT_CLKDIV;   // divider prescaler to ensure SCLK <1MHz
   
-
-//?    assign   HCLKSYS  = (INCLUDE_DMA!=0) ? SCLK : HCLK;
-    assign   HCLK  = FCLK;
+  // GPIO interface
+  wire               [7:0] GPO8;
+  wire               [7:0] GPI8;
   
-   // System Reset request can be from processor or watchdog
-   // or when lockup happens and the control flag is set.
-   assign  NANOSOC_SYSRESETREQ = SYSRESETREQ | WDOGRESETREQ |
-                               ADPRESETREQ |
-                               (LOCKUP & LOCKUPRESET);
-   assign CCTRLRESETREQ = PMUHRESETREQ | HRESETREQ;
-
-  // Clock controller to generate reset and clock signals
-  nanosoc_mcu_clkctrl
-   #(.CLKGATE_PRESENT(CLKGATE_PRESENT))
-   u_nanosoc_mcu_clkctrl(
-     // inputs
-    .XTAL1            (CLK),
-    .NRST             (SYSRESETn),
-
-    .APBACTIVE        (APBACTIVE),
-    .SLEEPING         (SLEEPING),
-    .SLEEPDEEP        (SLEEPDEEP),
-    .LOCKUP           (LOCKUP),
-    .LOCKUPRESET      (LOCKUPRESET),
-    .SYSRESETREQ      (CCTRLRESETREQ),
-    .DBGRESETREQ      (PMUDBGRESETREQ),
-    .CGBYPASS         (TESTMODE),
-    .RSTBYPASS        (TESTMODE),
-
-     // outputs
-    .XTAL2            (xtal_clk_out),
-
-    .FCLK             (FCLK),
-
-    .PCLK             (PCLK),
-    .PCLKG            (PCLKG),
-    .PCLKEN           (PCLKEN),
-//?`ifdef CORTEX_M0DESIGNSTART
-//?    .PORESETn         (PORESETn),  // for cm0 designstart
-//?    .HRESETn          (HRESETn),   // for cm0 designstart
-//?`endif
-    .PRESETn          (PRESETn)
-    );
-
-    wire   HCLKG;
-    wire   DCLKG;
-    wire   SCLKG;
-
-  cortexm0_rst_ctl u_rst_ctl
-  (// Inputs
-   .GLOBALRESETn      (SYSRESETn),
-   .FCLK              (FCLK),
-   .HCLK              (HCLKG),
-   .DCLK              (DCLKG),
-   .SYSRESETREQ       (NANOSOC_SYSRESETREQ),
-   .PMUHRESETREQ      (PMUHRESETREQ),
-   .PMUDBGRESETREQ    (PMUDBGRESETREQ),
-   .RSTBYPASS         (TESTMODE),
-   .SE                (SCANENABLE),
-
-   // Outputs
-   .PORESETn          (PORESETn),
-   .HRESETn           (HRESETn),
-   .DBGRESETn         (DBGRESETn),
-   .HRESETREQ         (HRESETREQ));
-
-
-  // Cortex-M0 Power management unit
-  cortexm0_pmu u_cortexm0_pmu
-  ( // Inputs
-    .FCLK             (FCLK),
-    .PORESETn         (PORESETn),
-    .HRESETREQ        (NANOSOC_SYSRESETREQ), // from processor / watchdog
-    .PMUENABLE        (PMUENABLE),       // from System Controller
-    .WICENACK         (WICENACK),        // from WIC in integration
-
-    .WAKEUP           (WAKEUP),          // from WIC in integration
-    .CDBGPWRUPREQ     (CDBGPWRUPREQ),
-
-    .SLEEPDEEP        (SLEEPDEEP),
-    .SLEEPHOLDACKn    (SLEEPHOLDACKn),
-    .GATEHCLK         (GATEHCLK),
-    .SYSPWRDOWNACK    (SYSPWRDOWNACK),
-    .DBGPWRDOWNACK    (DBGPWRDOWNACK),
-    .CGBYPASS         (TESTMODE),
-
-   // Outputs
-    .HCLK             (HCLKG),
-    .DCLK             (DCLKG),
-    .SCLK             (SCLKG),
-    .WICENREQ         (WICENREQ),
-    .CDBGPWRUPACK     (CDBGPWRUPACK),
-    .SYSISOLATEn      (SYSISOLATEn),
-    .SYSRETAINn       (SYSRETAINn),
-    .SYSPWRDOWN       (SYSPWRDOWN),
-    .DBGISOLATEn      (DBGISOLATEn),
-    .DBGPWRDOWN       (DBGPWRDOWN),
-    .SLEEPHOLDREQn    (SLEEPHOLDREQn),
-    .PMUDBGRESETREQ   (PMUDBGRESETREQ),
-    .PMUHRESETREQ     (PMUHRESETREQ)
-   );
-
-  // Bypass clock gating cell in PMU if CLKGATE_PRESENT is 0
-  assign  HCLK = (CLKGATE_PRESENT==0) ? FCLK : HCLKG;
-  assign  DCLK = (CLKGATE_PRESENT==0) ? FCLK : DCLKG;
-  assign  SCLK = (CLKGATE_PRESENT==0) ? FCLK : SCLKG;
-
-
-  // In this example system, power control takes place immediately.
-  // In a real circuit you might need to add delays in the next two
-  // signal assignments for correct operation.
-  assign   SYSPWRDOWNACK = SYSPWRDOWN;
-  assign   DBGPWRDOWNACK = DBGPWRDOWN;
-
-  wire              exp_penable;
-  wire              exp_pwrite;
-  wire  [11:0]      exp_paddr;
-  wire  [31:0]      exp_pwdata;
-  wire              exp12_psel;
-  wire              exp12_pready;
-  wire              exp12_pslverr;
-  wire     [31:0]   exp12_prdata;
-  wire              exp13_psel;
-  wire              exp13_pready;
-  wire              exp13_pslverr;
-  wire     [31:0]   exp13_prdata;
-  wire              exp14_psel;
-  wire              exp14_pready;
-  wire              exp14_pslverr;
-  wire     [31:0]   exp14_prdata;
-  wire              exp15_psel;
-  wire              exp15_pready;
-  wire              exp15_pslverr;
-  wire     [31:0]   exp15_prdata;
-
-
-  // internal peripheral signals
-  wire               uart0_rxd;
-  wire               uart0_txd;
-  wire               uart0_txen;
-  wire               uart1_rxd;
-  wire               uart1_txd;
-  wire               uart1_txen;
-  wire               uart2_rxd;
-  wire               uart2_txd;
-  wire               uart2_txen;
-  wire               timer0_extin;
-  wire               timer1_extin;
-
-  wire  [15:0]       p0_altfunc;
-
-  wire  [15:0]       p1_altfunc;
-
-  wire               exp_irq0;
-  wire               exp_irq1;
-  wire               exp_irq2;
-  wire               exp_irq3;
-  wire               exp_irqB;
-  wire               exp_irqC;
-  wire               exp_irqD;
+  // GPIO
+  wire              [15:0] P0_IN;            // GPIO 0 inputs
+  wire              [15:0] P0_OUT;           // GPIO 0 outputs
+  wire              [15:0] P0_OUTEN;         // GPIO 0 output enables
+  wire              [15:0] P0_ALTFUNC;       // GPIO 0 alternate function (pin mux)
   
-// -----------------------------------------------------------------------------
-// AHB Interconnect declarations
-// Upper-case AMBA naming convention maintained
-// -----------------------------------------------------------------------------
-
-    // System Address Remap control
-    wire    [3:0] REMAP;           // System Address REMAP control, bit-0 set on POR
-    wire          ROM_MAP;
-    
-    // Manager port SI0 (inputs from master 0)
-    wire  [SYS_ADDR_W-1:0] HADDR_adp;         // Address bus
-    wire             [1:0] HTRANS_adp;        // Transfer type
-    wire                   HWRITE_adp;        // Transfer direction
-    wire             [2:0] HSIZE_adp;         // Transfer size
-    wire             [2:0] HBURST_adp;        // Burst type
-    wire             [3:0] HPROT_adp;         // Protection control
-    wire  [SYS_DATA_W-1:0] HWDATA_adp;        // Write data
-    wire                   HMASTLOCK_adp;     // Locked Sequence
-    wire             [1:0] HAUSER_adp;        // Address USER signals
-    wire             [1:0] HWUSER_adp;        // Write-data USER signals
-    // Manager port SI0 (outputs to master 0)
-    wire  [SYS_DATA_W-1:0] HRDATA_adp;        // Read data bus
-    wire                   HREADY_adp;        // HREADY feedback
-    wire                    HRESP_adp;         // Transfer response
-    wire             [1:0] HRUSER_adp;        // Read-data USER signals
-
-    // Manager port SI1 (inputs from master 1)
-    wire   [SYS_ADDR_W-1:0] HADDR_dma;         // Address bus
-    wire              [1:0] HTRANS_dma;        // Transfer type
-    wire                    HWRITE_dma;        // Transfer direction
-    wire              [2:0] HSIZE_dma;         // Transfer size
-    wire              [2:0] HBURST_dma;        // Burst type
-    wire              [3:0] HPROT_dma;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_dma;        // Write data
-    wire                    HMASTLOCK_dma;     // Locked Sequence
-    wire              [1:0] HAUSER_dma;        // Address USER signals
-    wire              [1:0] HWUSER_dma;        // Write-data USER signals
-    // Manager port SI1 (outputs to master 1)
-    wire   [SYS_DATA_W-1:0] HRDATA_dma;        // Read data bus
-    wire                    HREADY_dma;        // HREADY feedback
-    wire                    HRESP_dma;         // Transfer response
-    wire              [1:0] HRUSER_dma;        // Read-data USER signals
-
-    // Manager port SI2 (inputs from master 2)
-    wire   [SYS_ADDR_W-1:0] HADDR_dma2;         // Address bus
-    wire              [1:0] HTRANS_dma2;        // Transfer type
-    wire                    HWRITE_dma2;        // Transfer direction
-    wire              [2:0] HSIZE_dma2;         // Transfer size
-    wire              [2:0] HBURST_dma2;        // Burst type
-    wire              [3:0] HPROT_dma2;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_dma2;        // Write data
-    wire                    HMASTLOCK_dma2;     // Locked Sequence
-    wire              [1:0] HAUSER_dma2;        // Address USER signals
-    wire              [1:0] HWUSER_dma2;        // Write-data USER signals
-    // Manager port SI2 (outputs to master 2)
-    wire   [SYS_DATA_W-1:0] HRDATA_dma2;        // Read data bus
-    wire                    HREADY_dma2;        // HREADY feedback
-    wire                    HRESP_dma2;         // Transfer response
-    wire              [1:0] HRUSER_dma2;        // Read-data USER signals
-
-    // Manager port SI3 (inputs from master 3)
-    wire   [SYS_ADDR_W-1:0] HADDR_cpu;         // Address bus
-    wire              [1:0] HTRANS_cpu;        // Transfer type
-    wire                    HWRITE_cpu;        // Transfer direction
-    wire              [2:0] HSIZE_cpu;         // Transfer size
-    wire              [2:0] HBURST_cpu;        // Burst type
-    wire              [3:0] HPROT_cpu;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_cpu;        // Write data
-    wire                    HMASTLOCK_cpu;     // Locked Sequence
-    wire              [1:0] HAUSER_cpu;        // Address USER signals
-    wire              [1:0] HWUSER_cpu;        // Write-data USER signals
-    // Manager port SI3 (outputs to master 3)
-    wire   [SYS_DATA_W-1:0] HRDATA_cpu;        // Read data bus
-    wire                    HREADY_cpu;        // HREADY feedback
-    wire                    HRESP_cpu;         // Transfer response
-    wire              [1:0] HRUSER_cpu;        // Read-data USER signals
-
-    // Subordinate port MI0 (outputs to slave 0)
-    wire                    HSEL_bootrom;          // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_bootrom;         // Address bus
-    wire              [1:0] HTRANS_bootrom;        // Transfer type
-    wire                    HWRITE_bootrom;        // Transfer direction
-    wire              [2:0] HSIZE_bootrom;         // Transfer size
-    wire              [2:0] HBURST_bootrom;        // Burst type
-    wire              [3:0] HPROT_bootrom;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_bootrom;        // Write data
-    wire                    HMASTLOCK_bootrom;     // Locked Sequence
-    wire                    HREADYMUX_bootrom;     // Transfer done
-    wire              [1:0] HAUSER_bootrom;        // Address USER signals
-    wire              [1:0] HWUSER_bootrom;        // Write-data USER signals
-    // Subordinate port MI0 (inputs from slave 0)
-    wire   [SYS_DATA_W-1:0] HRDATA_bootrom;        // Read data bus
-    wire                    HREADYOUT_bootrom;     // HREADY feedback
-    wire                    HRESP_bootrom;         // Transfer response
-    wire              [1:0] HRUSER_bootrom;        // Read-data USER signals
-
-    // Subordinate port MI1 (outputs to slave 1)
-    wire                    HSEL_imem;          // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_imem;         // Address bus
-    wire              [1:0] HTRANS_imem;        // Transfer type
-    wire                    HWRITE_imem;        // Transfer direction
-    wire              [2:0] HSIZE_imem;         // Transfer size
-    wire              [2:0] HBURST_imem;        // Burst type
-    wire              [3:0] HPROT_imem;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_imem;        // Write data
-    wire                    HMASTLOCK_imem;     // Locked Sequence
-    wire                    HREADYMUX_imem;     // Transfer done
-    wire              [1:0] HAUSER_imem;        // Address USER signals
-    wire              [1:0] HWUSER_imem;        // Write-data USER signals
-    // Subordinate port MI1 (inputs from slave 1)
-    wire   [SYS_DATA_W-1:0] HRDATA_imem;        // Read data bus
-    wire                    HREADYOUT_imem;     // HREADY feedback
-    wire                    HRESP_imem;         // Transfer response
-    wire              [1:0] HRUSER_imem;        // Read-data USER signals
-
-    // Subordinate port MI2 (outputs to slave 2)
-    wire                    HSEL_dmem;          // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_dmem;         // Address bus
-    wire              [1:0] HTRANS_dmem;        // Transfer type
-    wire                    HWRITE_dmem;        // Transfer direction
-    wire              [2:0] HSIZE_dmem;         // Transfer size
-    wire              [2:0] HBURST_dmem;        // Burst type
-    wire              [3:0] HPROT_dmem;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_dmem;        // Write data
-    wire                    HMASTLOCK_dmem;     // Locked Sequence
-    wire                    HREADYMUX_dmem;     // Transfer done
-    wire              [1:0] HAUSER_dmem;        // Address USER signals
-    wire              [1:0] HWUSER_dmem;        // Write-data USER signals
-    // Subordinate port MI2 (inputs from slave 2)
-    wire   [SYS_DATA_W-1:0] HRDATA_dmem;        // Read data bus
-    wire                    HREADYOUT_dmem;     // HREADY feedback
-    wire                    HRESP_dmem;         // Transfer response
-    wire              [1:0] HRUSER_dmem;        // Read-data USER signals
-
-    // Subordinate port MI3 (outputs to slave 3)
-    wire                    HSEL_sysio;          // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_sysio;         // Address bus
-    wire              [1:0] HTRANS_sysio;        // Transfer type
-    wire                    HWRITE_sysio;        // Transfer direction
-    wire              [2:0] HSIZE_sysio;         // Transfer size
-    wire              [2:0] HBURST_sysio;        // Burst type
-    wire              [3:0] HPROT_sysio;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_sysio;        // Write data
-    wire                    HMASTLOCK_sysio;     // Locked Sequence
-    wire                    HREADYMUX_sysio;     // Transfer done
-    wire              [1:0] HAUSER_sysio;        // Address USER signals
-    wire              [1:0] HWUSER_sysio;        // Write-data USER signals
-    // Subordinate port MI3 (inputs from slave 3)
-    wire   [SYS_DATA_W-1:0] HRDATA_sysio;        // Read data bus
-    wire                    HREADYOUT_sysio;     // HREADY feedback
-    wire                    HRESP_sysio;         // Transfer response
-    wire              [1:0] HRUSER_sysio;        // Read-data USER signals
-
-    // Subordinate port MI4 (outputs to slave 4)
-    wire                    HSEL_expram_l;          // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_expram_l;         // Address bus
-    wire              [1:0] HTRANS_expram_l;        // Transfer type
-    wire                    HWRITE_expram_l;        // Transfer direction
-    wire              [2:0] HSIZE_expram_l;         // Transfer size
-    wire              [2:0] HBURST_expram_l;        // Burst type
-    wire              [3:0] HPROT_expram_l;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_expram_l;        // Write data
-    wire                    HMASTLOCK_expram_l;     // Locked Sequence
-    wire                    HREADYMUX_expram_l;     // Transfer done
-    wire              [1:0] HAUSER_expram_l;        // Address USER signals
-    wire              [1:0] HWUSER_expram_l;        // Write-data USER signals
-    // Subordinate port MI4 (inputs from slave 4)
-    wire   [SYS_DATA_W-1:0] HRDATA_expram_l;        // Read data bus
-    wire                    HREADYOUT_expram_l;     // HREADY feedback
-    wire                    HRESP_expram_l;         // Transfer response
-    wire              [1:0] HRUSER_expram_l;        // Read-data USER signals
-
-    // Subordinate   port MI5 (outputs to slave 5)
-    wire                    HSEL_expram_h;          // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_expram_h;         // Address bus
-    wire              [1:0] HTRANS_expram_h;        // Transfer type
-    wire                    HWRITE_expram_h;        // Transfer direction
-    wire              [2:0] HSIZE_expram_h;         // Transfer size
-    wire              [2:0] HBURST_expram_h;        // Burst type
-    wire              [3:0] HPROT_expram_h;         // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_expram_h;        // Write data
-    wire                    HMASTLOCK_expram_h;     // Locked Sequence
-    wire                    HREADYMUX_expram_h;     // Transfer done
-    wire              [1:0] HAUSER_expram_h;        // Address USER signals
-    wire              [1:0] HWUSER_expram_h;        // Write-data USER signals
-    // Subordinate port MI5 (inputs from slave 5)
-    wire   [SYS_DATA_W-1:0] HRDATA_expram_h;        // Read data bus
-    wire                    HREADYOUT_expram_h;     // HREADY feedback
-    wire                    HRESP_expram_h;         // Transfer response
-    wire              [1:0] HRUSER_expram_h;        // Read-data USER signals
-
-    // Subordinate   port MI6 (outputs to slave 6)
-    wire                    HSEL_exp;           // Slave Select
-    wire   [SYS_ADDR_W-1:0] HADDR_exp;          // Address bus
-    wire              [1:0] HTRANS_exp;         // Transfer type
-    wire                    HWRITE_exp;         // Transfer direction
-    wire              [2:0] HSIZE_exp;          // Transfer size
-    wire              [2:0] HBURST_exp;         // Burst type
-    wire              [3:0] HPROT_exp;          // Protection control
-    wire   [SYS_DATA_W-1:0] HWDATA_exp;         // Write data
-    wire                    HMASTLOCK_exp;      // Locked Sequence
-    wire                    HREADYMUX_exp;      // Transfer done
-    wire              [1:0] HAUSER_exp;         // Address USER signals
-    wire              [1:0] HWUSER_exp;         // Write-data USER signals
-    // Subordinate port MI5 (inputs from slave 6)
-    wire   [SYS_DATA_W-1:0] HRDATA_exp;         // Read data bus
-    wire                    HREADYOUT_exp;      // HREADY feedback
-    wire                    HRESP_exp;          // Transfer response
-    wire              [1:0] HRUSER_exp;         // Read-data USER signals
-
-
-//------------------------------------------------------------------------------
-//------------------------------------------------------------------------------
-// Interconnect matrix
-// 4 AHB-lite managers, 7 AHB-lite layer interfaces
-//------------------------------------------------------------------------------
-
-// BusMatrix instance
-  nanosoc_ahb32_4x7_busmatrix_lite u_nanosoc_ahb32_4x7_busmatrix_lite (
-    .HCLK       (HCLK),
-    .HRESETn    (HRESETn),
-    .REMAP      (REMAP),
-
-    // Input port SI0 signals
-    .HADDR_adp       (HADDR_adp),
-    .HTRANS_adp      (HTRANS_adp),
-    .HWRITE_adp      (HWRITE_adp),
-    .HSIZE_adp       (HSIZE_adp),
-    .HBURST_adp      (HBURST_adp),
-    .HPROT_adp       (HPROT_adp),
-    .HWDATA_adp      (HWDATA_adp),
-    .HMASTLOCK_adp   (HMASTLOCK_adp),
-    .HREADY_adp      (HREADY_adp),
-    .HAUSER_adp      (HAUSER_adp),
-    .HWUSER_adp      (HWUSER_adp),
-    .HRDATA_adp      (HRDATA_adp),
-    .HRESP_adp       (HRESP_adp),
-    .HRUSER_adp      (HRUSER_adp),
-
-    // Input port SI1 signals
-    .HADDR_dma       (HADDR_dma),
-    .HTRANS_dma      (HTRANS_dma),
-    .HWRITE_dma      (HWRITE_dma),
-    .HSIZE_dma       (HSIZE_dma),
-    .HBURST_dma      (HBURST_dma),
-    .HPROT_dma       (HPROT_dma),
-    .HWDATA_dma      (HWDATA_dma),
-    .HMASTLOCK_dma   (HMASTLOCK_dma),
-    .HREADY_dma      (HREADY_dma),
-    .HAUSER_dma      (HAUSER_dma),
-    .HWUSER_dma      (HWUSER_dma),
-    .HRDATA_dma      (HRDATA_dma),
-    .HRESP_dma       (HRESP_dma),
-    .HRUSER_dma      (HRUSER_dma),
-
-    // Input port SI2 signals
-    .HADDR_dma2      (HADDR_dma2),
-    .HTRANS_dma2     (HTRANS_dma2),
-    .HWRITE_dma2     (HWRITE_dma2),
-    .HSIZE_dma2      (HSIZE_dma2),
-    .HBURST_dma2     (HBURST_dma2),
-    .HPROT_dma2      (HPROT_dma2),
-    .HWDATA_dma2     (HWDATA_dma2),
-    .HMASTLOCK_dma2  (HMASTLOCK_dma2),
-    .HREADY_dma2     (HREADY_dma2),
-    .HAUSER_dma2     (HAUSER_dma2),
-    .HWUSER_dma2     (HWUSER_dma2),
-    .HRDATA_dma2     (HRDATA_dma2),
-    .HRESP_dma2      (HRESP_dma2),
-    .HRUSER_dma2     (HRUSER_dma2),
-
-    // Input port SI3 signals
-    .HADDR_cpu       (HADDR_cpu),
-    .HTRANS_cpu      (HTRANS_cpu),
-    .HWRITE_cpu      (HWRITE_cpu),
-    .HSIZE_cpu       (HSIZE_cpu),
-    .HBURST_cpu      (HBURST_cpu),
-    .HPROT_cpu       (HPROT_cpu),
-    .HWDATA_cpu      (HWDATA_cpu),
-    .HMASTLOCK_cpu   (HMASTLOCK_cpu),
-    .HREADY_cpu      (HREADY_cpu),
-    .HAUSER_cpu      (HAUSER_cpu),
-    .HWUSER_cpu      (HWUSER_cpu),
-    .HRDATA_cpu      (HRDATA_cpu),
-    .HRESP_cpu       (HRESP_cpu),
-    .HRUSER_cpu      (HRUSER_cpu),
-
-    // Output port MI0 signals
-    .HSEL_bootrom       (HSEL_bootrom),
-    .HADDR_bootrom      (HADDR_bootrom),
-    .HTRANS_bootrom     (HTRANS_bootrom),
-    .HWRITE_bootrom     (HWRITE_bootrom),
-    .HSIZE_bootrom      (HSIZE_bootrom),
-    .HBURST_bootrom     (HBURST_bootrom),
-    .HPROT_bootrom      (HPROT_bootrom),
-    .HWDATA_bootrom     (HWDATA_bootrom),
-    .HMASTLOCK_bootrom  (HMASTLOCK_bootrom),
-    .HREADYMUX_bootrom  (HREADYMUX_bootrom),
-    .HAUSER_bootrom     (HAUSER_bootrom),
-    .HWUSER_bootrom     (HWUSER_bootrom),
-    .HRDATA_bootrom     (HRDATA_bootrom),
-    .HREADYOUT_bootrom  (HREADYOUT_bootrom),
-    .HRESP_bootrom      (HRESP_bootrom),
-    .HRUSER_bootrom     (HRUSER_bootrom),
-
-    // Output port MI1 signals
-    .HSEL_imem       (HSEL_imem),
-    .HADDR_imem      (HADDR_imem),
-    .HTRANS_imem     (HTRANS_imem),
-    .HWRITE_imem     (HWRITE_imem),
-    .HSIZE_imem      (HSIZE_imem),
-    .HBURST_imem     (HBURST_imem),
-    .HPROT_imem      (HPROT_imem),
-    .HWDATA_imem     (HWDATA_imem),
-    .HMASTLOCK_imem  (HMASTLOCK_imem),
-    .HREADYMUX_imem  (HREADYMUX_imem),
-    .HAUSER_imem     (HAUSER_imem),
-    .HWUSER_imem     (HWUSER_imem),
-    .HRDATA_imem     (HRDATA_imem),
-    .HREADYOUT_imem  (HREADYOUT_imem),
-    .HRESP_imem      (HRESP_imem),
-    .HRUSER_imem     (HRUSER_imem),
-
-    // Output port MI2 signals
-    .HSEL_dmem       (HSEL_dmem),
-    .HADDR_dmem      (HADDR_dmem),
-    .HTRANS_dmem     (HTRANS_dmem),
-    .HWRITE_dmem     (HWRITE_dmem),
-    .HSIZE_dmem      (HSIZE_dmem),
-    .HBURST_dmem     (HBURST_dmem),
-    .HPROT_dmem      (HPROT_dmem),
-    .HWDATA_dmem     (HWDATA_dmem),
-    .HMASTLOCK_dmem  (HMASTLOCK_dmem),
-    .HREADYMUX_dmem  (HREADYMUX_dmem),
-    .HAUSER_dmem     (HAUSER_dmem),
-    .HWUSER_dmem     (HWUSER_dmem),
-    .HRDATA_dmem     (HRDATA_dmem),
-    .HREADYOUT_dmem  (HREADYOUT_dmem),
-    .HRESP_dmem      (HRESP_dmem),
-    .HRUSER_dmem     (HRUSER_dmem),
-
-    // Output port MI3 signals
-    .HSEL_sysio        (HSEL_sysio),
-    .HADDR_sysio       (HADDR_sysio),
-    .HTRANS_sysio      (HTRANS_sysio),
-    .HWRITE_sysio      (HWRITE_sysio),
-    .HSIZE_sysio       (HSIZE_sysio),
-    .HBURST_sysio      (HBURST_sysio),
-    .HPROT_sysio       (HPROT_sysio),
-    .HWDATA_sysio      (HWDATA_sysio),
-    .HMASTLOCK_sysio   (HMASTLOCK_sysio),
-    .HREADYMUX_sysio   (HREADYMUX_sysio),
-    .HAUSER_sysio      (HAUSER_sysio),
-    .HWUSER_sysio      (HWUSER_sysio),
-    .HRDATA_sysio      (HRDATA_sysio),
-    .HREADYOUT_sysio   (HREADYOUT_sysio),
-    .HRESP_sysio       (HRESP_sysio),
-    .HRUSER_sysio      (HRUSER_sysio),
-
-    // Output port MI4 signals
-    .HSEL_expram_l       (HSEL_expram_l),
-    .HADDR_expram_l      (HADDR_expram_l),
-    .HTRANS_expram_l     (HTRANS_expram_l),
-    .HWRITE_expram_l     (HWRITE_expram_l),
-    .HSIZE_expram_l      (HSIZE_expram_l),
-    .HBURST_expram_l     (HBURST_expram_l),
-    .HPROT_expram_l      (HPROT_expram_l),
-    .HWDATA_expram_l     (HWDATA_expram_l),
-    .HMASTLOCK_expram_l  (HMASTLOCK_expram_l),
-    .HREADYMUX_expram_l  (HREADYMUX_expram_l),
-    .HAUSER_expram_l     (HAUSER_expram_l),
-    .HWUSER_expram_l     (HWUSER_expram_l),
-    .HRDATA_expram_l     (HRDATA_expram_l),
-    .HREADYOUT_expram_l  (HREADYOUT_expram_l),
-    .HRESP_expram_l      (HRESP_expram_l),
-    .HRUSER_expram_l     (HRUSER_expram_l),
-
-    // Output port MI5 signals
-    .HSEL_expram_h       (HSEL_expram_h),
-    .HADDR_expram_h      (HADDR_expram_h),
-    .HTRANS_expram_h     (HTRANS_expram_h),
-    .HWRITE_expram_h     (HWRITE_expram_h),
-    .HSIZE_expram_h      (HSIZE_expram_h),
-    .HBURST_expram_h     (HBURST_expram_h),
-    .HPROT_expram_h      (HPROT_expram_h),
-    .HWDATA_expram_h     (HWDATA_expram_h),
-    .HMASTLOCK_expram_h  (HMASTLOCK_expram_h),
-    .HREADYMUX_expram_h  (HREADYMUX_expram_h),
-    .HAUSER_expram_h     (HAUSER_expram_h),
-    .HWUSER_expram_h     (HWUSER_expram_h),
-    .HRDATA_expram_h     (HRDATA_expram_h),
-    .HREADYOUT_expram_h  (HREADYOUT_expram_h),
-    .HRESP_expram_h      (HRESP_expram_h),
-    .HRUSER_expram_h     (HRUSER_expram_h),
-
-    // Output port MI6 signals
-    .HSEL_exp        (HSEL_exp),
-    .HADDR_exp       (HADDR_exp),
-    .HTRANS_exp      (HTRANS_exp),
-    .HWRITE_exp      (HWRITE_exp),
-    .HSIZE_exp       (HSIZE_exp),
-    .HBURST_exp      (HBURST_exp),
-    .HPROT_exp       (HPROT_exp),
-    .HWDATA_exp      (HWDATA_exp),
-    .HMASTLOCK_exp   (HMASTLOCK_exp),
-    .HREADYMUX_exp   (HREADYMUX_exp),
-    .HAUSER_exp      (HAUSER_exp),
-    .HWUSER_exp      (HWUSER_exp),
-    .HRDATA_exp      (HRDATA_exp),
-    .HREADYOUT_exp   (HREADYOUT_exp),
-    .HRESP_exp       (HRESP_exp),
-    .HRUSER_exp      (HRUSER_exp),
-
-    // Scan test dummy signals; not connected until scan insertion
-    .SCANENABLE      (SCANENABLE),
-    .SCANINHCLK      (SCANINHCLK),
-    .SCANOUTHCLK     (SCANOUTHCLK)
-  );
-
-//----------------------------------------
-// Bootrom Region (region_bootrom)
-//----------------------------------------
+  wire              [15:0] P1_IN;            // GPIO 1 inputs
+  wire              [15:0] P1_IN_MUX;        // level-shifted input from pad
+  wire              [15:0] P1_OUT;           // GPIO 1 outputs
+  wire              [15:0] P1_OUTEN;         // GPIO 1 output enables
+  wire              [15:0] P1_OUT_MUX;       // GPIO 1 aOutput Port Drive
+  wire              [15:0] P1_OUT_EN_MUX;    // Active High output drive enable (pad tech dependent)
+  wire              [15:0] P1_ALTFUNC;       // GPIO 1 alternate function (pin mux)
   
-  localparam BOOTROM_ADDR_W = 10;
+  //--------------------------
+  // FPGA-Specific Wiring - Should be own Module
+  //--------------------------
   
-  nanosoc_region_bootrom #(
-    .SYS_ADDR_W     (SYS_ADDR_W),
-    .SYS_DATA_W     (SYS_DATA_W),
-    .BOOTROM_ADDR_W (BOOTROM_ADDR_W)
-  ) u_nanosoc_region_bootrom (
-    .HCLK      (HCLK),
-    .HRESETn   (HRESETn),
-    .HSEL      (HSEL_bootrom),
-    .HADDR     (HADDR_bootrom),
-    .HTRANS    (HTRANS_bootrom),
-    .HSIZE     (HSIZE_bootrom),
-    .HPROT     (HPROT_bootrom),
-    .HWRITE    (HWRITE_bootrom),
-    .HREADY    (HREADYMUX_bootrom),
-    .HWDATA    (HWDATA_bootrom),
-    .HREADYOUT (HREADYOUTS_bootrom),
-    .HRESP     (HRESPS_bootrom),
-    .HRDATA    (HRDATA_bootrom)
-  );
+  // Technology-specific PLL/Frequecy synthesizer would generate
+  //   CLK, FCLK (Free running system clock)
+  // from
+  //    xtal_clk_i
   
-//----------------------------------------
-// Instruction Memory Region  (region_imem)
-//----------------------------------------
-
-  localparam IMEM_RAM_ADDR_W   = RAM_ADDR_W;
-  localparam IMEM_RAM_DATA_W   = RAM_DATA_W;
-  localparam IMEM_RAM_FPGA_IMG = "image.hex";
-
-  nanosoc_region_imem #(
-    .SYS_ADDR_W        (SYS_ADDR_W),
-    .SYS_DATA_W        (SYS_DATA_W),
-    .IMEM_RAM_ADDR_W   (IMEM_RAM_ADDR_W),
-    .IMEM_RAM_DATA_W   (IMEM_RAM_DATA_W),
-    .IMEM_RAM_FPGA_IMG (IMEM_RAM_FPGA_IMG)
-  ) u_nanosoc_region_imem (
-    .HCLK      (HCLK),
-    .HRESETn   (HRESETn),
-    .HSEL      (HSEL_imem),
-    .HADDR     (HADDR_imem),
-    .HTRANS    (HTRANS_imem),
-    .HSIZE     (HSIZE_imem),
-    .HPROT     (HPROT_imem),
-    .HWRITE    (HWRITE_imem),
-    .HREADY    (HREADYMUX_imem),
-    .HWDATA    (HWDATA_imem),
-    .HREADYOUT (HREADYOUTS_imem),
-    .HRESP     (HRESPS_imem),
-    .HRDATA    (HRDATA_imem)
-  );
+  assign PLL_CLK    = xtal_clk_i; // Default to no PLL
   
-//----------------------------------------
-// Data Memory Region  (region_dmem)
-//----------------------------------------
-
-  localparam DMEM_RAM_ADDR_W   = RAM_ADDR_W;
-  localparam DMEM_RAM_DATA_W   = RAM_DATA_W;
-
-  nanosoc_region_dmem #(
-    .SYS_ADDR_W        (SYS_ADDR_W),
-    .SYS_DATA_W        (SYS_DATA_W),
-    .DMEM_RAM_ADDR_W   (DMEM_RAM_ADDR_W),
-    .DMEM_RAM_DATA_W   (DMEM_RAM_DATA_W)
-  ) u_nanosoc_region_dmem (
-    .HCLK      (HCLK),
-    .HRESETn   (HRESETn),
-    .HSEL      (HSEL_dmem),
-    .HADDR     (HADDR_dmem),
-    .HTRANS    (HTRANS_dmem),
-    .HSIZE     (HSIZE_dmem),
-    .HPROT     (HPROT_dmem),
-    .HWRITE    (HWRITE_dmem),
-    .HREADY    (HREADYMUX_dmem),
-    .HWDATA    (HWDATA_dmem),
-    .HREADYOUT (HREADYOUTS_dmem),
-    .HRESP     (HRESPS_dmem),
-    .HRDATA    (HRDATA_dmem)
-  );
-
-//----------------------------------------
-// System Peripheral Region  (region_sysio)
-//----------------------------------------
-
-//---------------------------------------------
-// Expansion SRAM Low Region  (region_expram_l)
-//---------------------------------------------
-
-//----------------------------------------------
-// Expansion SRAM High Region  (region_expram_h)
-//----------------------------------------------
-
-// ************************************************
-// ************************************************
-//
-//  ADD YOUR EXPERIMENTAL AHB-MAPPED WRAPPER HERE
-//
-//
-// ************************************************
-
-  wire   exp_drq_ip;
-  wire   exp_drq_op;
-  wire   [3:0] exp_irq;
-  wire   exp_merged_irq;
-  assign exp_irq0 = exp_irq[0];
-  assign exp_irq1 = exp_irq[1];
-  assign exp_irq2 = exp_irq[2];
-  assign exp_irq3 = exp_irq[3];
-
-//----------------------------------------
-// Expansion Region "exp" instance
-//----------------------------------------
-
-`ifdef NANOSOC_EXPANSION_REGION
-
-nanosoc_exp_wrapper #(
-  .AHBADDRWIDTH(29),
-  .INPACKETWIDTH(16),
-  .CFGSIZEWIDTH(32),
-  .CFGSCHEMEWIDTH(1),
-  .OUTPACKETWIDTH(16),
-  .CFGNUMIRQ(4)
-) u_nanosoc_exp_wrapper (
-  .HCLK          (HCLK),
-  .HRESETn       (HRESETn),
-  //  AHB port: 32 bit data bus interface
-  .HSEL_i        (HSEL_exp),
-  .HADDR_i       (HADDR_exp[28:0]),
-  .HTRANS_i      (HTRANS_exp),
-  .HSIZE_i       (HSIZE_exp),
-  .HPROT_i       (HPROT_exp),
-  .HWRITE_i      (HWRITE_exp),
-  .HREADY_i      (HREADYMUX_exp),
-  .HWDATA_i      (HWDATA_exp),
-  .HREADYOUT_o   (HREADYOUT_exp),
-  .HRESP_o       (HRESP_exp),
-  .HRDATA_o      (HRDATA_exp),
-  .exp_drq_ip_o  (exp_drq_ip),
-  .exp_dlast_ip_i(1'b0),
-  .exp_drq_op_o  (exp_drq_op),
-  .exp_dlast_op_i(1'b0),
-  .exp_irq_o     (exp_irq)
-);
-
-`else
-
- // Default slave - if no expansion region
- cmsdk_ahb_default_slave u_ahb_exp (
-   .HCLK         (HCLK),
-   .HRESETn      (HRESETn),
-   .HSEL         (HSEL_exp),
-   .HTRANS       (HTRANS_exp),
-   .HREADY       (HREADYMUX_exp),
-   .HREADYOUT    (HREADYOUT_exp),
-   .HRESP        (HRESP_exp)
-);
- assign   HRDATA_exp = 32'heaedeaed; // Tie off Expansion Address Expansion Data
-
-`endif
-
-  assign   HRUSER_exp = 2'b00;
+  assign SYS_SCANENABLE  = 1'b0; 
+  assign SYS_TESTMODE    = 1'b0;   
+  assign INC_SCANINHCLK  = 1'b0; 
+  assign INC_SCANOUTHCLK = 1'b0;
   
-//----------------------------------------
-// Expansion/DMA "ram8,ram9" RAM instances
-//----------------------------------------
-
-localparam AWRAM8 = ADDR_WIDTH_RAM; // Address width - to match RAM instance size
-  wire  [AWRAM8-3:0] addr_expram_l;
-  wire    [31:0] wdata_expram_l;
-  wire    [31:0] rdata_expram_l;
-  wire     [3:0] wen_expram_l;
-  wire           cs_expram_l;
-
-  // AHB to SRAM bridge
-  cmsdk_ahb_to_sram #(.AW(AWRAM8)) u_ahb_to_sram8
-  (
-    // AHB Inputs
-    .HCLK       (HCLK),
-    .HRESETn    (HRESETn),
-    .HSEL       (HSEL_expram_l),  // AHB inputs
-    .HADDR      (HADDR_expram_l[AWRAM8-1:0]),
-    .HTRANS     (HTRANS_expram_l),
-    .HSIZE      (HSIZE_expram_l),
-    .HWRITE     (HWRITE_expram_l),
-    .HWDATA     (HWDATA_expram_l),
-    .HREADY     (HREADYMUX_expram_l),
-
-    // AHB Outputs
-    .HREADYOUT  (HREADYOUT_expram_l), // Outputs
-    .HRDATA     (HRDATA_expram_l),
-    .HRESP      (HRESP_expram_l),
-
-   // SRAM input
-    .SRAMRDATA  (rdata_expram_l),
-   // SRAM Outputs
-    .SRAMADDR   (addr_expram_l),
-    .SRAMWDATA  (wdata_expram_l),
-    .SRAMWEN    (wen_expram_l),
-    .SRAMCS     (cs_expram_l)
-   );
-
-  // SRAM model
-  cmsdk_fpga_sram #(.AW(AWRAM8)) u_fpga_expram_l
-   (
-   // SRAM Inputs
-    .CLK        (HCLK),
-    .ADDR       (addr_expram_l),
-    .WDATA      (wdata_expram_l),
-    .WREN       (wen_expram_l),
-    .CS         (cs_expram_l),
-   // SRAM Output
-    .RDATA      (rdata_expram_l)
-   );
-
-// instandiate expansion RAM instance to appear at 0x90000000
-
-  localparam AWRAM9 = ADDR_WIDTH_RAM; // Address width - to match RAM instance size
-  wire  [AWRAM9-3:0] addr_expram_h;
-  wire    [31:0] wdata_expram_h;
-  wire    [31:0] rdata_expram_h;
-  wire     [3:0] wen_expram_h;
-  wire           cs_expram_h;
-
-  // AHB to SRAM bridge
-  cmsdk_ahb_to_sram #(.AW(AWRAM9)) u_ahb_to_sram9
-  (
-    // AHB Inputs
-    .HCLK       (HCLK),
-    .HRESETn    (HRESETn),
-    .HSEL       (HSEL_expram_h),  // AHB inputs
-    .HADDR      (HADDR_expram_h[AWRAM9-1:0]),
-    .HTRANS     (HTRANS_expram_h),
-    .HSIZE      (HSIZE_expram_h),
-    .HWRITE     (HWRITE_expram_h),
-    .HWDATA     (HWDATA_expram_h),
-    .HREADY     (HREADYMUX_expram_h),
-
-    // AHB Outputs
-    .HREADYOUT  (HREADYOUT_expram_h), // Outputs
-    .HRDATA     (HRDATA_expram_h),
-    .HRESP      (HRESP_expram_h),
-
-   // SRAM input
-    .SRAMRDATA  (rdata_expram_h),
-   // SRAM Outputs
-    .SRAMADDR   (addr_expram_h),
-    .SRAMWDATA  (wdata_expram_h),
-    .SRAMWEN    (wen_expram_h),
-    .SRAMCS     (cs_expram_h)
-   );
-
-  // SRAM model
-  cmsdk_fpga_sram #(.AW(AWRAM9)) u_fpga_expram_h
-   (
-   // SRAM Inputs
-    .CLK        (HCLK),
-    .ADDR       (addr_expram_h),
-    .WDATA      (wdata_expram_h),
-    .WREN       (wen_expram_h),
-    .CS         (cs_expram_h),
-   // SRAM Output
-    .RDATA      (rdata_expram_h)
-   );
-
-//    assign   [31:0] HRDATA_expram_l = 32'hdead8888; // Read data bus
-//    assign          HREADYOUT_expram_l = 1'b1;      // HREADY feedback
-//    assign          HRESP_expram_l = 1'b0;          // Transfer response
-//    assign    [1:0] HRUSER_expram_l = 00;            // Read-data USER signals
-//
-//    assign   [31:0] HRDATA_expram_h = 32'hdead9999; // Read data bus
-//    assign          HREADYOUT_expram_h = 1'b1;      // HREADY feedback
-//    assign          HRESP_expram_h = 1'b0;          // Transfer response
-//    assign    [1:0] HRUSER_expram_h = 00;            // Read-data USER signals
-
-
-//----------------------------------------
-// ADP ASCII DEBUG PROTOCOL controller
-// AHB MANAGER 0
-//----------------------------------------
-
-  // -------------------------------
-  // ADP engine stream and control interfaces
-  // -------------------------------
-
-  wire        comio_tx_ready;
-  wire [7:0]  comio_tx_data8;
-  wire        comio_tx_valid;
-
-  wire        comio_rx_ready;
-  wire [7:0]  comio_rx_data8;
-  wire        comio_rx_valid;
+  //--------------------------
+  // Clock Wiring
+  //--------------------------
   
-  wire        stdio_tx_ready;
-  wire [7:0]  stdio_tx_data8;
-  wire        stdio_tx_valid;
-
-  wire        stdio_rx_ready;
-  wire [7:0]  stdio_rx_data8;
-  wire        stdio_rx_valid;
-
-  wire [7:0]  adp_gpo8;
-  wire [7:0]  adp_gpi8;
-
-  assign adp_gpi8 = adp_gpo8;
-  assign ADPRESETREQ = adp_gpo8[0];
-
-  // ADP debug controller present
-  nanosoc_adp_control_v1_0 u_adp_control (
-  // Clock and Reset
-    .ahb_hclk          (HCLK),
-    .ahb_hresetn       (HRESETn),
-  // DMA Control
-    .com_rx_tready     (comio_rx_ready),
-    .com_rx_tdata      (comio_rx_data8),
-    .com_rx_tvalid     (comio_rx_valid),
-    .com_tx_tready     (comio_tx_ready),
-    .com_tx_tdata      (comio_tx_data8),
-    .com_tx_tvalid     (comio_tx_valid),
-    .stdio_rx_tready   (stdio_rx_ready),
-    .stdio_rx_tdata    (stdio_rx_data8),
-    .stdio_rx_tvalid   (stdio_rx_valid),
-    .stdio_tx_tready   (stdio_tx_ready),
-    .stdio_tx_tdata    (stdio_tx_data8),
-    .stdio_tx_tvalid   (stdio_tx_valid),
-    .gpo8              (adp_gpo8),
-    .gpi8              (adp_gpi8),
-  // AHB-Lite Master Interface
-    .ahb_hready        (HREADY_adp),
-    .ahb_hresp         (HRESP_adp),
-    .ahb_hrdata        (HRDATA_adp),
-    .ahb_htrans        (HTRANS_adp),
-    .ahb_hwrite        (HWRITE_adp),
-    .ahb_haddr         (HADDR_adp),
-    .ahb_hsize         (HSIZE_adp),
-    .ahb_hburst        (HBURST_adp),
-    .ahb_hmastlock     (HMASTLOCK_adp),
-    .ahb_hprot         (HPROT_adp),
-    .ahb_hwdata        (HWDATA_adp)
-  );
-    assign HAUSER_adp [1:0] = 2'b00;        // Address USER signals
-    assign HWUSER_adp [1:0] = 2'b00;        // Write-data USER signals
-
-   nanosoc_apb_usrt u_apb_usrt_com (
-    .PCLK              (PCLK),     // Peripheral clock
-    .PCLKG             (PCLKG),    // Gated PCLK for bus
-    .PRESETn           (PRESETn),  // Reset
-
-    .PSEL              (exp14_psel),     // APB interface inputs
-    .PADDR             (exp_paddr[11:2]),
-    .PENABLE           (exp_penable),
-    .PWRITE            (exp_pwrite),
-    .PWDATA            (exp_pwdata),
-
-    .PRDATA            (exp14_prdata),   // APB interface outputs
-    .PREADY            (exp14_pready),
-    .PSLVERR           (exp14_pslverr),
-
-    .ECOREVNUM         (4'h0),// Engineering-change-order revision bits
-
-    .TX_VALID_o        (stdio_rx_valid),
-    .TX_DATA8_o        (stdio_rx_data8),
-    .TX_READY_i        (stdio_rx_ready),
-
-    .RX_VALID_i        (stdio_tx_valid),
-    .RX_DATA8_i        (stdio_tx_data8),
-    .RX_READY_o        (stdio_tx_ready),
-
-    .TXINT             ( ),       // Transmit Interrupt
-    .RXINT             ( ),       // Receive  Interrupt
-    .TXOVRINT          ( ),    // Transmit Overrun Interrupt
-    .RXOVRINT          ( ),    // Receive  Overrun Interrupt
-    .UARTINT           ( ) // Combined Interrupt
-  );
+  assign SYS_CLK    = (SYS_TESTMODE) ? xtal_clk_i : PLL_CLK;
+  assign xtal_clk_o = SYS_XTALCLK_OUT;
   
-  wire        [7:0]  ft_clkdiv = 8'd03;
-
-  nanosoc_ft1248_stream_io_v1_0 #(
-    .FT1248_WIDTH (1),
-    .FT1248_CLKON (0) 
-  ) u_ftdio_com (
-    .clk              (HCLK),
-    .resetn           (HRESETn),
-    .ft_clkdiv        (ft_clkdiv    ),
-    .ft_clk_o         (ft_clk_o     ),
-    .ft_ssn_o         (ft_ssn_o     ),
-    .ft_miso_i        (ft_miso_i    ),
-    .ft_miosio_o      (ft_miosio_o  ),
-    .ft_miosio_e      (ft_miosio_e  ),
-    .ft_miosio_z      (ft_miosio_z  ),
-    .ft_miosio_i      (ft_miosio_i  ),
-    .rxd_tready       (comio_tx_ready),
-    .rxd_tdata        (comio_tx_data8),
-    .rxd_tvalid       (comio_tx_valid),
-    .rxd_tlast        (1'b0),
-    .txd_tready       (comio_rx_ready),
-    .txd_tdata        (comio_rx_data8),
-    .txd_tvalid       (comio_rx_valid),
-    .txd_tlast        ( )
-  );
- 
- 
-//----------------------------------------
-// DIRECT MEMORY ACCESS controller
-// AHB MANAGER 1
-//----------------------------------------
-
-  // DMA interface not used in this example system
-  wire  [DMA_CHANNEL_NUM-1:0] dma230_req;  // tie off signal.
-  wire  [DMA_CHANNEL_NUM-1:0] dma230_tie0 = {DMA_CHANNEL_NUM{1'b0}};
-
-  assign dma230_req[0] = exp_drq_ip;
-  assign dma230_req[1] = exp_drq_op;
-
-
-  // DMA done per channel
-  wire  [DMA_CHANNEL_NUM-1:0] dma230_done_ch;
-  wire dmac_done;
-  wire dmac_err;
+  //--------------------------
+  // SWD Wiring
+  //--------------------------
   
-  ///generate if (INCLUDE_DMA != 0) begin : gen_dma
-  // DMA controller present
-  pl230_udma u_pl230_udma (
-    // Clock and Reset
-    .hclk          (HCLK),
-    .hresetn       (HRESETn),
-    
-    // DMA Control
-    .dma_req       (dma230_req),
-    .dma_sreq      (dma230_req),
-    .dma_waitonreq (dma230_tie0),
-    .dma_stall     (1'b0),
-    .dma_active    (),
-    .dma_done      (dma230_done_ch),
-    .dma_err       (dmac_err),
-    
-    // AHB-Lite Master Interface
-    .hready        (HREADY_dma),
-    .hresp         (HRESP_dma),
-    .hrdata        (HRDATA_dma),
-    .htrans        (HTRANS_dma),
-    .hwrite        (HWRITE_dma),
-    .haddr         (HADDR_dma),
-    .hsize         (HSIZE_dma),
-    .hburst        (HBURST_dma),
-    .hmastlock     (HMASTLOCK_dma),
-    .hprot         (HPROT_dma),
-    .hwdata        (HWDATA_dma),
-    
-    // APB Slave Interface
-    .pclken        (PCLKEN),
-    .psel          (exp15_psel),
-    .pen           (exp_penable),
-    .pwrite        (exp_pwrite),
-    .paddr         (exp_paddr[11:0]),
-    .pwdata        (exp_pwdata[31:0]),
-    .prdata        (exp15_prdata)
-  );
-
-    assign exp15_pready  = 1'b1;
-    assign exp15_pslverr = 1'b0;
-    assign dmac_done    = |dma230_done_ch; // OR all the DMA done together
-
-/*  end else begin : gen_no_pl230_udma
-    // DMA controller not present
-    assign HADDR_dma      [31:0] = 32'ha2a2a2a2; // Address bus
-    assign HTRANS_dma      [1:0] = 2'b00;        // Transfer type
-    assign HWRITE_dma            = 1'b0;         // Transfer direction
-    assign HSIZE_dma       [2:0] = 3'b010;       // Transfer size
-    assign HBURST_dma      [2:0] = 3'b001;       // Burst type
-    assign HPROT_dma       [3:0] = 4'b0010;      // Protection control
-    assign HWDATA_dma     [31:0] = 32'hd2d2d2d2; // Write data
-    assign HMASTLOCK_dma         = 1'b0;         // Locked Sequence
-    assign HAUSER_dma      [1:0] = 2'b00;        // Address USER signals
-    assign HWUSER_dma      [1:0] = 2'b00;        // Write-data USER signals
-
-    assign dmac_done = 1'b0;
-    assign dmac_err  = 1'b0;
-    assign exp15_pready  = 1'b1;
-    assign exp15_pslverr = 1'b0;
-    assign exp15_prdata  = 32'h00000000;
-    assign dma230_done_ch = {DMA_CHANNEL_NUM{1'b0}};
-
-  end endgenerate
-*/
-
-//----------------------------------------
-// DIRECT MEMORY ACCESS controller 2
-// AHB MANAGER 2
-//----------------------------------------
-
-    // Manager port SI2 (inputs from master 2)
-    assign HADDR_dma2     [31:0] = 32'ha2a2a2a2; // Address bus
-    assign HTRANS_dma2     [1:0] = 2'b00;        // Transfer type
-    assign HWRITE_dma2           = 1'b0;         // Transfer direction
-    assign HSIZE_dma2      [2:0] = 3'b010;       // Transfer size
-    assign HBURST_dma2     [2:0] = 3'b000;       // Burst type
-    assign HPROT_dma2      [3:0] = 4'b0010;      // Protection control
-    assign HWDATA_dma2    [31:0] = 32'hd2d2d2d2; // Write data
-    assign HMASTLOCK_dma2        = 1'b0;         // Locked Sequence
-    assign HAUSER_dma2     [1:0] = 2'b00;        // Address USER signals
-    assign HWUSER_dma2     [1:0] = 2'b00;        // Write-data USER signals
-
-//----------------------------------------
-// CORTEX-M0 CPU controller
-// AHB MANAGER 3
-//----------------------------------------
-
-    wire         SYS_NMI;                   // Watchdog nin-maskable interrupt
-    wire  [31:0] SYS_APB_IRQ;               // APB subsystem IRQs
-    wire  [15:0] SYS_GPIO0_IRQ;             // GPIO-0 IRQs
-    wire  [15:0] SYS_GPIO1_IRQ;             // GPIO-1 IRQs
-
-    wire         gpio0_combintr;
-    wire         gpio1_combintr;
-    assign       gpio0_combintr = |SYS_GPIO0_IRQ[15:0];
-    assign       gpio1_combintr = |SYS_GPIO1_IRQ[15:0];
-
-    wire         intnmi_cm0;
-    wire  [31:0] intisr_cm0;
-
-// match interrupts to CMSDK for validation code reuse
-
-  assign intnmi_cm0        = SYS_NMI;
-  //assign intisr_cm0[ 5: 0] = SYS_APB_IRQ[ 5: 0];
-  assign intisr_cm0[ 0]    = exp_irq0;
-  assign intisr_cm0[ 1]    = exp_irq1;
-  assign intisr_cm0[ 2]    = exp_irq2;
-  assign intisr_cm0[ 3]    = exp_irq3;
-  assign intisr_cm0[ 5: 4] = SYS_APB_IRQ[ 5: 4];
-  assign intisr_cm0[ 6]    = SYS_APB_IRQ[ 6]   | gpio0_combintr;
-  assign intisr_cm0[ 7]    = SYS_APB_IRQ[ 7]   | gpio1_combintr;
-  assign intisr_cm0[14: 8] = SYS_APB_IRQ[14: 8];
-  assign intisr_cm0[15]    = SYS_APB_IRQ[15]   | dmac_done | dmac_err;
-  assign intisr_cm0[31:16] = SYS_APB_IRQ[31:16]| SYS_GPIO0_IRQ[15:0];
-    
-    assign HAUSER_cpu [1:0] = 2'b00;        // Address USER signals
-    assign HWUSER_cpu [1:0] = 2'b00;        // Write-data USER signals
-
-
-  // Cortex-M0 integration level
-  nanosoc_cpu u_nanosoc_cpu (
-    .HCLK             (HCLKG), //HCLK),
-    .FCLK             (FCLK),
-    .DCLK             (DCLK),
-    .SCLK             (SCLK),
-    .HRESETn          (HRESETn),
-    .PORESETn         (PORESETn),
-    .DBGRESETn        (DBGRESETn),
-    .RSTBYPASS        (TESTMODE),
-    .DFTSE            (SCANENABLE),
-    // AHB port
-    .HADDR           (HADDR_cpu),
-    .HTRANS          (HTRANS_cpu),
-    .HWRITE          (HWRITE_cpu),
-    .HSIZE           (HSIZE_cpu),
-    .HBURST          (HBURST_cpu),
-    .HPROT           (HPROT_cpu),
-    .HWDATA          (HWDATA_cpu),
-    .HMASTLOCK       (HMASTLOCK_cpu),
-    .HREADY          (HREADY_cpu),
-//    .HAUSER          (HAUSER_cpu),
-//    .HWUSER          (HWUSER_cpu),
-    .HRDATA          (HRDATA_cpu),
-    .HRESP           (HRESP_cpu),
-//    .HRUSER          (HRUSER_cpu),
-  // sideband signals
-     .NMI            (intnmi_cm0),        // Non-maskable interrupt input
-     .IRQ            (intisr_cm0[31:0]),  // Interrupt request inputs
-     .TXEV           (TXEV),              // Event output (SEV executed)
-     .RXEV           (RXEV),              // Event input
-  // MISCELLANEOUS ---------------------
-     .SLEEPING       (SLEEPING),
-     .SLEEPDEEP      (SLEEPDEEP),
-     .WAKEUP         (WAKEUP       ), // Wake up request from WIC
-     .WICENREQ       (WICENREQ     ), // WIC enable request from PMU
-     .WICENACK       (WICENACK     ), // WIC enable ack to PMU
-     .SLEEPHOLDREQn  (SLEEPHOLDREQn),
-     .SLEEPHOLDACKn  (SLEEPHOLDACKn),
-     .CDBGPWRUPACK   (CDBGPWRUPACK),
-     .CDBGPWRUPREQ   (CDBGPWRUPREQ),
-     .LOCKUP         (LOCKUP),            // Core is locked-up
-     .GATEHCLK       (GATEHCLK),
-     .SYSRESETREQ    (SYSRESETREQ),       // System reset request
-     .WDOGRESETREQ   (WDOGRESETREQ),      // Watchdog HW reset request
-     .ADPRESETREQ    (ADPRESETREQ),       // ADP debugger reset request
-     
-  // Debug - JTAG or Serial wire
-     // inputs
-    .SWDI            (SWDI),
-    .SWCLK           (SWCLK),
-     // outputs
-    .SWDO            (SWDO),
-    .SWDOEN          (SWDOEN)
-  );
-
-  assign   RXEV = dmac_done;  // Generate event when a DMA operation completed.
-
-
-//------------------------------------
-// internal wires
-
-  assign p0_out_nen     = ~p0_out_en;     //active low pad drive option
-  assign p1_out_nen_mux = ~p1_out_en_mux; //active low pad drive option
-
-  localparam BASEADDR_GPIO0       = 32'h4001_0000;
-  localparam BASEADDR_GPIO1       = 32'h4001_1000;
-  localparam BASEADDR_SYSROMTABLE = 32'hf000_0000;
-
-  nanosoc_sysio u_nanosoc_sysio (
-    .FCLK             (FCLK         ), // free-running clock
-    .PORESETn         (PORESETn     ), // Power-On-Reset (active-low)
-    .TESTMODE         (TESTMODE     ), // Test-mode override for testability
-    .HCLK             (HCLK         ), // AHB interconnect clock
-    .HRESETn          (HRESETn      ), // AHB interconnect reset (active-low)
-    // Common AHB signals
-    .HSEL             (HSEL_sysio     ),
-    .HADDR            (HADDR_sysio    ),
-    .HBURST           (HBURST_sysio   ),
-    .HMASTLOCK        (HMASTLOCK_sysio),
-    .HPROT            (HPROT_sysio    ),
-    .HSIZE            (HSIZE_sysio    ),
-    .HTRANS           (HTRANS_sysio   ),
-    .HWDATA           (HWDATA_sysio   ),
-    .HWRITE           (HWRITE_sysio   ),
-    .HREADY           (HREADYMUX_sysio),
-    .HRDATA           (HRDATA_sysio   ),
-    .HRESP            (HRESP_sysio    ),
-    .HREADYOUT        (HREADYOUT_sysio),
-    // APB clocking
-    .PCLK             (PCLK         ),
-    .PCLKG            (PCLKG        ),
-    .PRESETn          (PRESETn      ),
-    .PCLKEN           (PCLKEN       ),
-  // APB expansion select outputs
-    .exp12_psel       (exp12_psel   ),
-    .exp13_psel       (exp13_psel   ),
-    .exp14_psel       (exp14_psel   ),
-    .exp15_psel       (exp15_psel   ),
-    .exp_pwdata       (exp_pwdata   ),
-    .exp_paddr        (exp_paddr    ),
-    .exp_pwrite       (exp_pwrite   ),
-    .exp_penable      (exp_penable  ),
-  // APB expansion interface inputs
-    .exp12_prdata     (exp12_prdata ),
-    .exp12_pready     (exp12_pready ),
-    .exp12_pslverr    (exp12_pslverr),
-    .exp13_prdata     (exp13_prdata ),
-    .exp13_pready     (exp13_pready ),
-    .exp13_pslverr    (exp13_pslverr),
-    .exp14_prdata     (exp14_prdata ),
-    .exp14_pready     (exp14_pready ),
-    .exp14_pslverr    (exp14_pslverr),
-    .exp15_prdata     (exp15_prdata ),
-    .exp15_pready     (exp15_pready ),
-    .exp15_pslverr    (exp15_pslverr),
-    // CPU sideband signalling
-    .SYS_NMI          (SYS_NMI      ),
-    .SYS_APB_IRQ      (SYS_APB_IRQ  ),
-    // CPU specific power/reset control
-    .REMAP_CTRL       (ROM_MAP      ),
-    .APBACTIVE        (APBACTIVE    ),
-    .SYSRESETREQ      (SYSRESETREQ  ),
-    .WDOGRESETREQ     (WDOGRESETREQ ),
-    .LOCKUP           (LOCKUP       ),
-    .LOCKUPRESET      (LOCKUPRESET  ),
-    .PMUENABLE        (PMUENABLE    ),
-    // chip IO
-    .SYS_GPIO0_IRQ    (SYS_GPIO0_IRQ ),
-    .SYS_GPIO1_IRQ    (SYS_GPIO1_IRQ ),
-    // IO signalling
-    .uart0_rxd        (uart1_txd), //(uart0_rxd    ), // crossover
-    .uart0_txd        (uart0_txd    ),
-    .uart0_txen       (uart0_txen   ),
-    .uart1_rxd        (uart0_txd), //uart1_rxd    ), // crossover
-    .uart1_txd        (uart1_txd    ),
-    .uart1_txen       (uart1_txen   ),
-    .uart2_rxd        (uart2_rxd    ),
-    .uart2_txd        (uart2_txd    ),
-    .uart2_txen       (uart2_txen   ),
-    .timer0_extin     (timer0_extin ),  
-    .timer1_extin     (timer1_extin ),
-    // GPIO port signalling
-    .p0_in            (p0_in        ),
-    .p0_out           (p0_out       ),
-    .p0_outen         (p0_out_en    ),
-    .p0_altfunc       (p0_altfunc   ),
-
-    .p1_in            (p1_in        ),
-    .p1_out           (p1_out       ),
-    .p1_outen         (p1_out_en    ),
-    .p1_altfunc       (p1_altfunc   )
-    );
-
- assign REMAP[3] = 1'b0;
- assign REMAP[2] = 1'b0;
- assign REMAP[1] = 1'b0;
- assign REMAP[0] =!ROM_MAP;
- 
- assign exp12_pready = 1'b1;
- assign exp13_pready = 1'b1;
- assign exp12_pslverr = 1'b0;
- assign exp13_pslverr = 1'b0;
- assign exp12_prdata = 32'h0;
- assign exp13_prdata = 32'h0;
- 
-
-  // Serial wire debug is used.  nTRST, TDI and TDO are not needed
-
-
-//----------------------------------------
-// I/O port pin muxing and tristate
-//----------------------------------------
-
-  assign        SWCLK         =  swdclk_i;
-  assign        SWDI          =  swdio_i;
-  assign        swdio_o       =  SWDO;
-  assign        swdio_e       =  SWDOEN;
-  assign        swdio_z       =  !SWDOEN;
-
-  nanosoc_mcu_pin_mux u_pin_mux (
-    // UART
-    .uart0_rxd        (uart0_rxd),
-    .uart0_txd        (uart0_txd),
-    .uart0_txen       (uart0_txen),
-    .uart1_rxd        (uart1_rxd),
-    .uart1_txd        (uart1_txd),
-    .uart1_txen       (uart1_txen),
-    .uart2_rxd        (uart2_rxd),
-    .uart2_txd        (uart2_txd),
-    .uart2_txen       (uart2_txen),
-
-    // Timer
-    .timer0_extin     (timer0_extin),
-    .timer1_extin     (timer1_extin),
-
-
-    // IO Ports
-    .p0_in            ( ), // was (p0_in) now from pad inputs),
-    .p0_out           (p0_out),
-    .p0_outen         (p0_out_en),
-    .p0_altfunc       (p0_altfunc),
-
-    .p1_in            ( ), // was(p1_in) now from pad inputs),
-    .p1_out           (p1_out),
-    .p1_outen         (p1_out_en),
-    .p1_altfunc       (p1_altfunc),
-
-    // Debug
-    .i_trst_n         ( ),
-    .i_swditms        ( ), //i_swditms),
-    .i_swclktck       ( ), //i_swclktck),
-    .i_tdi            ( ),
-    .i_tdo            ( ),
-    .i_tdoen_n        ( ),
-    .i_swdo           ( ),
-    .i_swdoen         ( ),
+  assign CPU_0_SWCLK = swdclk_i;
+  assign CPU_0_SWDI  = swdio_i;
+  assign swdio_o     = CPU_0_SWDO;
+  assign swdio_z     = !CPU_0_SWDOEN;
+  
+  //--------------------------
+  // FT1248 Wiring
+  //--------------------------
+  
+  assign P0_IN = p0_i;
+  assign p0_o  = P0_OUT;
+  assign p0_e  = P0_OUTEN;
+  assign p0_z  = ~P0_OUTEN;
+  
+  assign        FT_MISO_I = p1_i[0]; // FT_MISO INPUT pad configuration
+  assign        P1_IN_MUX[0] = p1_i[0];
+  assign        p1_o[0] = 1'b0;    
+  assign        p1_e[0] = 1'b0;
+  assign        p1_z[0] = 1'b1;
+  
+  assign        P1_IN_MUX[1] = p1_i[1]; // FT_CLK OUTPUT pad configuration
+  assign        p1_o[1] = FT_CLK_O;    
+  assign        p1_e[1] = 1'b1; 
+  assign        p1_z[1] = 1'b0;
 
-    // IO pads
-    .p1_out_mux       (p1_out_mux),
-    .p1_out_en_mux    (p1_out_en_mux),
-    .P0               ( ), //P0),
-    .P1               ( ), //P1),
+  assign        FT_MIOSIO_I = p1_i[2]; // FT_MIOSIO INOUT pad configuration
+  assign        P1_IN_MUX[2] = p1_i[2];
+  assign        p1_o[2] = FT_MIOSIO_O;    
+  assign        p1_e[2] = FT_MIOSIO_E;
+  assign        p1_z[2] = FT_MIOSIO_Z;
 
-    .nTRST            (nTRST),  // Not needed if serial-wire debug is used
-    .TDI              (1'b0),    // Not needed if serial-wire debug is used
-    .SWDIOTMS         ( ), //SWDIOTMS),
-    .SWCLKTCK         ( ), //SWCLKTCK),
-    .TDO              ( )     // Not needed if serial-wire debug is used
+  assign        P1_IN_MUX[3] = p1_i[3]; // FT_SSN OUTPUT pad configuration
+  assign        p1_o[3] = FT_SSN_O;    
+  assign        p1_e[3] = 1'b1; 
+  assign        p1_z[3] = 1'b0;
 
+  assign        P1_IN_MUX[15:4] = p1_i[15:4]; // IO MUX controlled bidirectionals
+  assign        p1_o[15:4] = P1_OUT_MUX[15:4];    
+  assign        p1_e[15:4] = P1_OUT_EN_MUX[15:4];
+  assign        p1_z[15:4] = ~P1_OUT_EN_MUX[15:4];
+  
+  //--------------------------
+  // GPIO Interface Assignment
+  //--------------------------
+  
+  assign GPI8 = GPO8;
+  
+  //--------------------------
+  // System Instantiation
+  //--------------------------
+  
+  nanosoc_system u_system (
+      // Free-running and Crystal Clock Output
+      .SYS_CLK(SYS_CLK),
+      .SYS_XTALCLK_OUT(SYS_XTALCLK_OUT),
+
+      // Scan Wiring
+      .SYS_SCANENABLE(SYS_SCANENABLE),
+      .SYS_TESTMODE(SYS_TESTMODE),
+      .INC_SCANINHCLK(INC_SCANINHCLK),
+      .INC_SCANOUTHCLK(INC_SCANOUTHCLK),
+
+      // Serial-Wire Debug
+      .CPU_0_SWDI(CPU_0_SWDI),
+      .CPU_0_SWCLK(CPU_0_SWCLK),
+      .CPU_0_SWDO(CPU_0_SWDO),
+      .CPU_0_SWDOEN(CPU_0_SWDOEN),
+
+      // FT1248 Interace - FT1248
+      .FT_CLK_O(FT_CLK_O),
+      .FT_SSN_O(FT_SSN_O),
+      .FT_MISO_I(FT_MISO_I),
+      .FT_MIOSIO_O(FT_MIOSIO_O),
+      .FT_MIOSIO_E(FT_MIOSIO_E),
+      .FT_MIOSIO_Z(FT_MIOSIO_Z),
+      .FT_MIOSIO_I(FT_MIOSIO_I),
+      .FT_CLKDIV(FT_CLKDIV),
+
+      // GPIO interface
+      .GPO8(GPO8),
+      .GPI8(GPI8),
+      
+      // GPIO
+      .P0_IN(P0_IN),
+      .P0_OUT(P0_OUT),
+      .P0_OUTEN(P0_OUTEN),
+      .P0_ALTFUNC(P0_ALTFUNC),
+      .P1_IN(P1_IN),
+      .P1_OUT(P1_OUT),
+      .P1_OUTEN(P1_OUTEN),
+      .P1_ALTFUNC(P1_ALTFUNC)
   );
 
-endmodule
-
-
-
+endmodule
\ No newline at end of file
diff --git a/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v b/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
index 2386fc1..5b8b683 100644
--- a/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
+++ b/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
@@ -120,7 +120,9 @@ module nanosoc_ss_systemctrl #(
     input  wire            [15:0] P1_IN,            // GPIO 1 inputs
     output wire            [15:0] P1_OUT,           // GPIO 1 outputs
     output wire            [15:0] P1_OUTEN,         // GPIO 1 output enables
-    output wire            [15:0] P1_ALTFUNC        // GPIO 1 alternate function (pin mux)
+    output wire            [15:0] P1_ALTFUNC,       // GPIO 1 alternate function (pin mux)
+    output wire            [15:0] P1_OUT_MUX,       // GPIO 1 aOutput Port Drive
+    output wire            [15:0] P1_OUT_EN_MUX     // Active High output drive enable (pad tech dependent)
 );
     // -------------------------------
     // Internal Wiring
diff --git a/system/nanosoc_system/verilog/nanosoc_system.v b/system/nanosoc_system/verilog/nanosoc_system.v
index 977e359..d083b9f 100644
--- a/system/nanosoc_system/verilog/nanosoc_system.v
+++ b/system/nanosoc_system/verilog/nanosoc_system.v
@@ -92,7 +92,19 @@ module nanosoc_system #(
     
     // GPIO interface
     output wire               [7:0] GPO8,
-    input  wire               [7:0] GPI8
+    input  wire               [7:0] GPI8,
+    
+    // GPIO
+    input  wire               [15:0] P0_IN,            // GPIO 0 inputs
+    output wire               [15:0] P0_OUT,           // GPIO 0 outputs
+    output wire               [15:0] P0_OUTEN,         // GPIO 0 output enables
+    output wire               [15:0] P0_ALTFUNC,       // GPIO 0 alternate function (pin mux)
+    input  wire               [15:0] P1_IN,            // GPIO 1 inputs
+    output wire               [15:0] P1_OUT,           // GPIO 1 outputs
+    output wire               [15:0] P1_OUTEN,         // GPIO 1 output enables
+    output wire               [15:0] P1_ALTFUNC,       // GPIO 1 alternate function (pin mux)
+    output wire               [15:0] P1_OUT_MUX,       // GPIO 1 aOutput Port Drive
+    output wire               [15:0] P1_OUT_EN_MUX     // Active High output drive enable (pad tech dependent)
 );
     //--------------------------
     // Local Parameters
@@ -757,16 +769,6 @@ module nanosoc_system #(
     // Lockup Signals - To System
     wire                   SYS_WDOGRESETREQ;   // Watchdog reset request
     wire                   SYS_LOCKUPRESET;    // System Controller cfg - Reset if lockup
-      
-    // GPIO - To Chip Level
-    wire            [15:0] P0_IN;            // GPIO 0 inputs
-    wire            [15:0] P0_OUT;           // GPIO 0 outputs
-    wire            [15:0] P0_OUTEN;         // GPIO 0 enables
-    wire            [15:0] P0_ALTFUNC;       // GPIO 0 alternate function (pin mux)
-    wire            [15:0] P1_IN;            // GPIO 1 inputs
-    wire            [15:0] P1_OUT;           // GPIO 1 outputs
-    wire            [15:0] P1_OUTEN;         // GPIO 1 enables
-    wire            [15:0] P1_ALTFUNC;       // GPIO 1 alternate function (pin mux)
     
     // Interrupt Wiring
     //--------------------------
-- 
GitLab