From 9959a7d15c67c58fe1e6ba2f42246b663aadf93e Mon Sep 17 00:00:00 2001
From: dam1n19 <dam1n19@soton.ac.uk>
Date: Mon, 19 Jun 2023 22:04:54 +0100
Subject: [PATCH] Initial system-level wiring

---
 .../verilog/nanosoc_ss_systemctrl.v           |    9 +-
 .../nanosoc_system/verilog/nanosoc_system.v   | 1091 +++++++++++++++++
 2 files changed, 1096 insertions(+), 4 deletions(-)

diff --git a/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v b/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
index 8385c37..2386fc1 100644
--- a/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
+++ b/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
@@ -21,6 +21,7 @@ module nanosoc_ss_systemctrl #(
     parameter    CLKGATE_PRESENT = 0
 )(
     // Free-running and Crystal Clock Output
+    input  wire                   SYS_CLK,              // System Input Clock
     output wire                   SYS_FCLK,             // Free-running system clock
     output wire                   SYS_XTALCLK_OUT,      // Crystal Clock Output
     
@@ -96,7 +97,7 @@ module nanosoc_ss_systemctrl #(
     // CPU power/reset control
     output wire                   SYS_REMAP_CTRL,       // REMAP control bit
     output wire                   SYS_WDOGRESETREQ,     // Watchdog reset request
-    output wire                   CPU_0_LOCKUPRESET,    // System Controller cfg - reset if lockup
+    output wire                   SYS_LOCKUPRESET,      // System Controller cfg - reset if lockup
     
     // System Reset Request Signals
     output wire                   SYS_SYSRESETREQ,       // System Request from System Managers
@@ -152,7 +153,7 @@ module nanosoc_ss_systemctrl #(
         .SLEEPING         (CPU_0_SLEEPING),
         .SLEEPDEEP        (CPU_0_SLEEPDEEP),
         .LOCKUP           (CPU_0_LOCKUP),
-        .LOCKUPRESET      (CPU_0_LOCKUPRESET),
+        .LOCKUPRESET      (SYS_LOCKUPRESET),
         .SYSRESETREQ      (SYS_PRMURESETREQ),
         .DBGRESETREQ      (SYS_PMUDBGRESETREQ),
         .CGBYPASS         (SYS_TESTMODE),
@@ -271,7 +272,7 @@ module nanosoc_ss_systemctrl #(
         .exp12_prdata(DMAC_1_PRDATA),
         .exp12_pready(DMAC_1_PREADY),
         .exp12_pslverr(DMAC_1_PSLVERR),
-        .exp13_prdata({APB_ADDR_W{1'b0}}),
+        .exp13_prdata({APB_DATA_W{1'b0}}),
         .exp13_pready(1'b1),
         .exp13_pslverr(1'b1),
         .exp14_prdata(USRT_PRDATA),
@@ -293,7 +294,7 @@ module nanosoc_ss_systemctrl #(
         .SYSRESETREQ(SYS_SYSRESETREQ),
         .WDOGRESETREQ(SYS_WDOGRESETREQ),
         .LOCKUP(CPU_0_LOCKUP),
-        .LOCKUPRESET(CPU_0_LOCKUPRESET),
+        .LOCKUPRESET(SYS_LOCKUPRESET),
         .PMUENABLE(SYS_PMUENABLE),
 
         // IO signaling
diff --git a/system/nanosoc_system/verilog/nanosoc_system.v b/system/nanosoc_system/verilog/nanosoc_system.v
index e69de29..977e359 100644
--- a/system/nanosoc_system/verilog/nanosoc_system.v
+++ b/system/nanosoc_system/verilog/nanosoc_system.v
@@ -0,0 +1,1091 @@
+//-----------------------------------------------------------------------------
+// NanoSoC System Integration Level
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+//
+// Copyright (C) 2023, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module nanosoc_system #(
+    // System Parameters
+    parameter    SYS_ADDR_W           = 32,  // System Address Width
+    parameter    SYS_DATA_W           = 32,  // System Data Width
+    
+    // Widths of System Peripheral APB Subsystem
+    parameter    APB_ADDR_W           = 12,  // APB Peripheral Address Width
+    parameter    APB_DATA_W           = 32,  // APB Peripheral Data Width
+    
+    // Bootrom 0 Parameters
+    parameter    BOOTROM_ADDR_W       = 10,          // Size of Bootrom (Based on Address Width) - Default 1KB
+    
+    // IMEM 0 Parameters
+    parameter    IMEM_RAM_ADDR_W      = 14,          // Width of IMEM RAM Address - Default 16KB
+    parameter    IMEM_RAM_DATA_W      = 32,          // Width of IMEM RAM Data Bus - Default 32 bits
+    parameter    IMEM_RAM_FPGA_IMG    = "image.hex", // Image to Preload into SRAM
+    
+    // DMEM 0 Parameters
+    parameter    DMEM_RAM_ADDR_W      = 14,          // Width of IMEM RAM Address - Default 16KB
+    parameter    DMEM_RAM_DATA_W      = 32,          // Width of IMEM RAM Data Bus - Default 32 bits
+    
+    // Expansion SRAM Low Parameters
+    parameter    EXPRAM_L_RAM_ADDR_W  = 14,          // Width of IMEM RAM Address - Default 16KB
+    parameter    EXPRAM_L_RAM_DATA_W  = 32,          // Width of IMEM RAM Data Bus - Default 32 bits
+    
+    // Expansion SRAM High Parameters
+    parameter    EXPRAM_H_RAM_ADDR_W  = 14,          // Width of IMEM RAM Address - Default 16KB
+    parameter    EXPRAM_H_RAM_DATA_W  = 32,          // Width of IMEM RAM Data Bus - Default 32 bits
+    
+    // CPU Parameters
+    parameter CLKGATE_PRESENT         = 0,
+    parameter BE                      = 0,   // 1: Big endian 0: little endian
+    parameter BKPT                    = 4,   // Number of breakpoint comparators
+    parameter DBG                     = 1,   // Debug configuration
+    parameter NUMIRQ                  = 32,  // NUM of IRQ
+    parameter SMUL                    = 0,   // Multiplier configuration
+    parameter SYST                    = 1,   // SysTick
+    parameter WIC                     = 1,   // Wake-up interrupt controller support
+    parameter WICLINES                = 34,  // Supported WIC lines
+    parameter WPT                     = 2,   // Number of DWT comparators
+    parameter RESET_ALL_REGS          = 0,   // Do not reset all registers
+    parameter INCLUDE_JTAG            = 0,   // Do not Include JTAG feature
+      
+    // DMA Parameters  
+    parameter    DMAC_0_CHANNEL_NUM   = 2,   // DMAC 0 Number of DMA Channels 
+    parameter    DMAC_1_CHANNEL_NUM   = 2,   // DMAC 1 Number of DMA Channels
+      
+    // SoCDebug Parameters  
+    parameter         PROMPT_CHAR     = "]",
+    parameter integer FT1248_WIDTH	  = 1, // FTDI Interface 1,2,4 width supported
+    parameter integer FT1248_CLKON	  = 1, // FTDI clock always on - else quiet when no access
+    
+    // Address of System ROM Table
+    parameter    SYSTABLE_BASE        = 32'hF000_0000   // Base Address of System ROM Table
+) (
+    // Free-running and Crystal Clock Output
+    input  wire                     SYS_CLK,              // System Input Clock
+    output wire                     SYS_XTALCLK_OUT,      // Crystal Clock Output
+    
+    // Scan Wiring
+    input  wire                     SYS_SCANENABLE,      // Scan Mode Enable
+    input  wire                     SYS_TESTMODE,        // Test Mode Enable (Override Synchronisers)
+    input  wire                     INC_SCANINHCLK,      // HCLK scan input  wire
+    output wire                     INC_SCANOUTHCLK,     // Scan Chain Output
+    
+    // Serial-Wire Debug
+    input  wire                     CPU_0_SWDI,         // SWD data input
+    input  wire                     CPU_0_SWCLK,        // SWD clock
+    output wire                     CPU_0_SWDO,         // SWD data output
+    output wire                     CPU_0_SWDOEN,       // SWD data output enable
+    
+    // FT1248 Interace - FT1248
+    output wire                     FT_CLK_O,    // SCLK
+    output wire                     FT_SSN_O,    // SS_N
+    input  wire                     FT_MISO_I,   // MISO
+    output wire  [FT1248_WIDTH-1:0] FT_MIOSIO_O, // MIOSIO tristate output when enabled
+    output wire  [FT1248_WIDTH-1:0] FT_MIOSIO_E, // MIOSIO tristate output enable (active hi)
+    output wire  [FT1248_WIDTH-1:0] FT_MIOSIO_Z, // MIOSIO tristate output enable (active lo)
+    input  wire  [FT1248_WIDTH-1:0] FT_MIOSIO_I, // MIOSIO tristate input
+    input  wire               [7:0] FT_CLKDIV,   // divider prescaler to ensure SCLK <1MHz
+    
+    // GPIO interface
+    output wire               [7:0] GPO8,
+    input  wire               [7:0] GPI8
+);
+    //--------------------------
+    // Local Parameters
+    //--------------------------
+    localparam    DMAC_0_CFG_ADDR_W  = APB_ADDR_W;  // DMAC 0 Configuration Port Address Width
+    localparam    DMAC_1_CFG_ADDR_W  = APB_ADDR_W;  // DMAC 1 Configuration Port Address Width
+    
+    //--------------------------
+    // System Wiring
+    //--------------------------
+    // System Input Clocks and Resets
+    wire          SYS_FCLK;              // Free running clock
+    wire          SYS_SYSRESETn;         // System Reset
+
+    // System Reset Request Signals
+    wire          SYS_SYSRESETREQ;       // System Request from System Managers
+    wire          SYS_PRMURESETREQ;      // CPU Control Reset Request (PMU and Reset Unit)
+        
+    // AHB Clocks and Resets 
+    wire          SYS_PORESETn;          // System Power On Reset
+    wire          SYS_HCLK;              // AHB Clock
+    wire          SYS_HRESETn;           // AHB and System reset
+        
+    // APB Clocks and Resets
+    wire          SYS_PCLK;   
+    wire          SYS_PCLKG;  
+    wire          SYS_PRESETn;
+    wire          SYS_PCLKEN;            // APB clock enable
+    
+    // Power Management Signals
+    wire          SYS_PMUENABLE;        // Power Management Enable
+    wire          SYS_PMUDBGRESETREQ;   // Power Management Debug Reset Req
+    
+    // Reset Request Wiring
+    //--------------------------
+    
+    assign SYS_SYSRESETREQ =   CPU_0_SYSRESETREQ 
+                             | DEBUG_RESETREQ 
+                             | SYS_WDOGRESETREQ 
+                             | (SYS_LOCKUPRESET & CPU_0_LOCKUP);
+    
+    //--------------------------
+    // CPU Subsystem
+    //--------------------------
+    
+    // Internal Wiring
+    //--------------------------
+    
+    // CPU 0 AHB Wiring - To Interconnect Subsystem
+    wire   [31:0] CPU_0_HADDR;            // Address bus
+    wire    [1:0] CPU_0_HTRANS;           // Transfer type
+    wire          CPU_0_HWRITE;           // Transfer direction
+    wire    [2:0] CPU_0_HSIZE;            // Transfer size
+    wire    [2:0] CPU_0_HBURST;           // Burst type
+    wire    [3:0] CPU_0_HPROT;            // Protection control
+    wire   [31:0] CPU_0_HWDATA;           // Write data
+    wire          CPU_0_HMASTLOCK;        // Locked Sequence
+    wire   [31:0] CPU_0_HRDATA;           // Read data bus
+    wire          CPU_0_HREADY;           // HREADY feedback
+    wire          CPU_0_HRESP;            // Transfer response
+    
+    // Bootrom 0 Region Wiring - To Interconnect Subsystem
+    wire   [31:0] BOOTROM_0_HADDR;        // Address bus
+    wire    [1:0] BOOTROM_0_HTRANS;       // Transfer type
+    wire          BOOTROM_0_HWRITE;       // Transfer direction
+    wire    [2:0] BOOTROM_0_HSIZE;        // Transfer size
+    wire    [2:0] BOOTROM_0_HBURST;       // Burst type
+    wire    [3:0] BOOTROM_0_HPROT;        // Protection control
+    wire   [31:0] BOOTROM_0_HWDATA;       // Write data
+    wire          BOOTROM_0_HMASTLOCK;    // Locked Sequence
+    wire   [31:0] BOOTROM_0_HRDATA;       // Read data bus
+    wire          BOOTROM_0_HREADY;       // HREADY feedback
+    wire          BOOTROM_0_HRESP;        // Transfer response
+    
+    // Instruction Memory 0 Region Wiring - To Interconnect Subsystem
+    wire   [31:0] IMEM_0_HADDR;           // Address bus
+    wire    [1:0] IMEM_0_HTRANS;          // Transfer type
+    wire          IMEM_0_HWRITE;          // Transfer direction
+    wire    [2:0] IMEM_0_HSIZE;           // Transfer size
+    wire    [2:0] IMEM_0_HBURST;          // Burst type
+    wire    [3:0] IMEM_0_HPROT;           // Protection control
+    wire   [31:0] IMEM_0_HWDATA;          // Write data
+    wire          IMEM_0_HMASTLOCK;       // Locked Sequence
+    wire   [31:0] IMEM_0_HRDATA;          // Read data bus
+    wire          IMEM_0_HREADY;          // HREADY feedback
+    wire          IMEM_0_HRESP;           // Transfer response
+    
+    // Data Memory 0 Region Wiring - To Interconnect Subsystem
+    wire   [31:0] DMEM_0_HADDR;           // Address bus
+    wire    [1:0] DMEM_0_HTRANS;          // Transfer type
+    wire          DMEM_0_HWRITE;          // Transfer direction
+    wire    [2:0] DMEM_0_HSIZE;           // Transfer size
+    wire    [2:0] DMEM_0_HBURST;          // Burst type
+    wire    [3:0] DMEM_0_HPROT;           // Protection control
+    wire   [31:0] DMEM_0_HWDATA;          // Write data
+    wire          DMEM_0_HMASTLOCK;       // Locked Sequence
+    wire   [31:0] DMEM_0_HRDATA;          // Read data bus
+    wire          DMEM_0_HREADY;          // HREADY feedback
+    wire          DMEM_0_HRESP;           // Transfer response
+    
+    // CPU Sideband Signaling  - To System Control Subsystem
+    wire          CPU_0_NMI;              // Non-Maskable Interrupt request
+    wire   [31:0] CPU_0_IRQ;              // Maskable Interrupt requests
+    wire          CPU_0_TXEV;             // Send Event (SEV) output
+    wire          CPU_0_RXEV;             // Receive Event input
+    wire          CPU_0_LOCKUP;           // Wake up request from WIC
+    wire          CPU_0_SYSRESETREQ;      // System reset request
+
+    wire          CPU_0_SLEEPING;         // Processor status - sleeping
+    wire          CPU_0_SLEEPDEEP;        // Processor status - deep sleep
+    
+    // Interrupt Wiring
+    //--------------------------
+    
+    assign CPU_0_IRQ [3:0]   = EXP_IRQ [3:0];
+    assign CPU_0_IRQ [ 5: 4] = SYS_APB_IRQ[ 5: 4];
+    assign CPU_0_IRQ [ 6]    = SYS_APB_IRQ[ 6]   | |SYS_GPIO0_ANY_IRQ;
+    assign CPU_0_IRQ [ 7]    = SYS_APB_IRQ[ 7]   | |SYS_GPIO1_ANY_IRQ;
+    assign CPU_0_IRQ [14: 8] = SYS_APB_IRQ[14: 8];
+    assign CPU_0_IRQ [15]    = SYS_APB_IRQ[15]   | DMAC_ANY_DONE | DMAC_ANY_ERROR;
+    assign CPU_0_IRQ [31:16] = SYS_APB_IRQ[31:16]| SYS_GPIO0_IRQ[15:0];
+
+    
+    // Sideband Wiring
+    //--------------------------
+    
+    assign CPU_0_RXEV = DMAC_ANY_DONE;
+    
+    // Instantiate Subsystem
+    //--------------------------
+
+    nanosoc_ss_cpu #(
+        .CLKGATE_PRESENT   (CLKGATE_PRESENT),
+        .BE                (BE),
+        .BKPT              (BKPT),
+        .DBG               (DBG),
+        .NUMIRQ            (NUMIRQ),
+        .SMUL              (SMUL),
+        .SYST              (SYST),
+        .WIC               (WIC),
+        .WICLINES          (WICLINES),
+        .WPT               (WPT),
+        .RESET_ALL_REGS    (RESET_ALL_REGS),
+        .INCLUDE_JTAG      (INCLUDE_JTAG),
+        .ROMTABLE_BASE     (SYSTABLE_BASE),
+        .BOOTROM_ADDR_W    (BOOTROM_ADDR_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),
+        .DMEM_RAM_ADDR_W   (DMEM_RAM_ADDR_W),
+        .DMEM_RAM_DATA_W   (DMEM_RAM_DATA_W)
+    ) u_cpu_ss (
+        // System Input Clocks and Resets
+        .SYS_FCLK(SYS_FCLK),              
+        .SYS_SYSRESETn(SYS_SYSRESETn),         
+        .SYS_SCANENABLE(SYS_SCANENABLE),        
+        .SYS_TESTMODE(SYS_TESTMODE),          
+        
+        // System Reset Request Signals
+        .SYS_SYSRESETREQ(SYS_SYSRESETREQ),       
+        .SYS_PRMURESETREQ(SYS_PRMURESETREQ),      
+        
+        // Generated Clocks and Resets 
+        .SYS_PORESETn(SYS_PORESETn),          
+        .SYS_HCLK(SYS_HCLK),              
+        .SYS_HRESETn(SYS_HRESETn),           
+        
+        // Power Management Signals
+        .SYS_PMUENABLE(SYS_PMUENABLE),        
+        .SYS_PMUDBGRESETREQ(SYS_PMUDBGRESETREQ),   
+
+        // CPU 0 AHB Lite port
+        .CPU_0_HADDR(CPU_0_HADDR),            
+        .CPU_0_HTRANS(CPU_0_HTRANS),           
+        .CPU_0_HWRITE(CPU_0_HWRITE),           
+        .CPU_0_HSIZE(CPU_0_HSIZE),            
+        .CPU_0_HBURST(CPU_0_HBURST),          
+        .CPU_0_HPROT(CPU_0_HPROT),            
+        .CPU_0_HWDATA(CPU_0_HWDATA),           
+        .CPU_0_HMASTLOCK(CPU_0_HMASTLOCK),        
+        .CPU_0_HRDATA(CPU_0_HRDATA),           
+        .CPU_0_HREADY(CPU_0_HREADY),           
+        .CPU_0_HRESP(CPU_0_HRESP),            
+
+        // Bootrom 0 AHB Lite port
+        .BOOTROM_0_HADDR(BOOTROM_0_HADDR),        
+        .BOOTROM_0_HTRANS(BOOTROM_0_HTRANS),       
+        .BOOTROM_0_HWRITE(BOOTROM_0_HWRITE),       
+        .BOOTROM_0_HSIZE(BOOTROM_0_HSIZE),        
+        .BOOTROM_0_HBURST(BOOTROM_0_HBURST),       
+        .BOOTROM_0_HPROT(BOOTROM_0_HPROT),        
+        .BOOTROM_0_HWDATA(BOOTROM_0_HWDATA),       
+        .BOOTROM_0_HMASTLOCK(BOOTROM_0_HMASTLOCK),    
+        .BOOTROM_0_HRDATA(BOOTROM_0_HRDATA),       
+        .BOOTROM_0_HREADY(BOOTROM_0_HREADY),       
+        .BOOTROM_0_HRESP(BOOTROM_0_HRESP),        
+
+        // IMEM 0 AHB Lite port
+        .IMEM_0_HADDR(IMEM_0_HADDR),           
+        .IMEM_0_HTRANS(IMEM_0_HTRANS),          
+        .IMEM_0_HWRITE(IMEM_0_HWRITE),          
+        .IMEM_0_HSIZE(IMEM_0_HSIZE),           
+        .IMEM_0_HBURST(IMEM_0_HBURST),          
+        .IMEM_0_HPROT(IMEM_0_HPROT),           
+        .IMEM_0_HWDATA(IMEM_0_HWDATA),          
+        .IMEM_0_HMASTLOCK(IMEM_0_HMASTLOCK),       
+        .IMEM_0_HRDATA(IMEM_0_HRDATA),          
+        .IMEM_0_HREADY(IMEM_0_HREADY),          
+        .IMEM_0_HRESP(IMEM_0_HRESP),           
+        
+        // DMEM 0 AHB Lite port
+        .DMEM_0_HADDR(DMEM_0_HADDR),           
+        .DMEM_0_HTRANS(DMEM_0_HTRANS),          
+        .DMEM_0_HWRITE(DMEM_0_HWRITE),          
+        .DMEM_0_HSIZE(DMEM_0_HSIZE),           
+        .DMEM_0_HBURST(DMEM_0_HBURST),          
+        .DMEM_0_HPROT(DMEM_0_HPROT),           
+        .DMEM_0_HWDATA(DMEM_0_HWDATA),          
+        .DMEM_0_HMASTLOCK(DMEM_0_HMASTLOCK),       
+        .DMEM_0_HRDATA(DMEM_0_HRDATA),          
+        .DMEM_0_HREADY(DMEM_0_HREADY),          
+        .DMEM_0_HRESP(DMEM_0_HRESP),           
+
+        // CPU Sideband signalling
+        .CPU_0_NMI(CPU_0_NMI),              
+        .CPU_0_IRQ(CPU_0_IRQ),              
+        .CPU_0_TXEV(CPU_0_TXEV),             
+        .CPU_0_RXEV(CPU_0_RXEV),             
+        .CPU_0_LOCKUP(CPU_0_LOCKUP),           
+        .CPU_0_SYSRESETREQ(CPU_0_SYSRESETREQ),      
+
+        .CPU_0_SLEEPING(CPU_0_SLEEPING),         
+        .CPU_0_SLEEPDEEP(CPU_0_SLEEPDEEP),        
+
+        // 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)            
+    );
+
+    //--------------------------
+    // DMA Subsystem
+    //--------------------------
+    
+    // Internal Wiring
+    //--------------------------
+    
+    // DMAC 0 AHB Lite Port  - To Interconnect Subsystem
+    wire          [SYS_ADDR_W-1:0] DMAC_0_HADDR;       // Address bus
+    wire                     [1:0] DMAC_0_HTRANS;      // Transfer type
+    wire                           DMAC_0_HWRITE;      // Transfer direction
+    wire                     [2:0] DMAC_0_HSIZE;       // Transfer size
+    wire                     [2:0] DMAC_0_HBURST;      // Burst type
+    wire                     [3:0] DMAC_0_HPROT;       // Protection control
+    wire          [SYS_DATA_W-1:0] DMAC_0_HWDATA;      // Write data
+    wire                           DMAC_0_HMASTLOCK;   // Locked Sequence
+    wire          [SYS_DATA_W-1:0] DMAC_0_HRDATA;      // Read data bus
+    wire                           DMAC_0_HREADY;      // HREADY feedback
+    wire                           DMAC_0_HRESP;       // Transfer response
+    
+    // DMAC 0 APB Configurtation Port - To System Control Subsystem
+    wire                           DMAC_0_PSEL;        // APB peripheral select
+    wire                           DMAC_0_PEN;         // APB transfer enable
+    wire                           DMAC_0_PWRITE;      // APB transfer direction
+    wire   [DMAC_0_CFG_ADDR_W-1:0] DMAC_0_PADDR;       // APB address
+    wire          [SYS_DATA_W-1:0] DMAC_0_PWDATA;      // APB write data
+    wire          [SYS_DATA_W-1:0] DMAC_0_PRDATA;      // APB read data
+    wire                           DMAC_0_PREADY;      // APB Ready Signal
+    wire                           DMAC_0_PSLVERR;     // APB Error Signal
+    
+    // DMAC 0 DMA Request and Status Port - To Expansion Subsystem
+    wire  [DMAC_0_CHANNEL_NUM-1:0] DMAC_0_DMA_REQ;     // DMA transfer request
+    wire  [DMAC_0_CHANNEL_NUM-1:0] DMAC_0_DMA_DONE;    // DMA transfer done
+    wire                           DMAC_0_DMA_ERR;     // DMA slave response not OK
+
+    // DMAC 1 AHB Lite Port  - To Interconnect Subsystem
+    wire          [SYS_ADDR_W-1:0] DMAC_1_HADDR;       // Address bus
+    wire                     [1:0] DMAC_1_HTRANS;      // Transfer type
+    wire                           DMAC_1_HWRITE;      // Transfer direction
+    wire                     [2:0] DMAC_1_HSIZE;       // Transfer size
+    wire                     [2:0] DMAC_1_HBURST;      // Burst type
+    wire                     [3:0] DMAC_1_HPROT;       // Protection control
+    wire          [SYS_DATA_W-1:0] DMAC_1_HWDATA;      // Write data
+    wire                           DMAC_1_HMASTLOCK;   // Locked Sequence
+    wire          [SYS_DATA_W-1:0] DMAC_1_HRDATA;      // Read data bus
+    wire                           DMAC_1_HREADY;      // HREADY feedback
+    wire                           DMAC_1_HRESP;       // Transfer response
+    
+    // DMAC 1 APB Configurtation Port - To System Control Subsystem
+    wire                           DMAC_1_PSEL;        // APB peripheral select
+    wire          [SYS_DATA_W-1:0] DMAC_1_PRDATA;      // APB read data
+    wire                           DMAC_1_PREADY;      // APB Ready Signal
+    wire                           DMAC_1_PSLVERR;     // APB Error Signal
+    
+    // DMAC 1 DMA Request and Status Port - To Expansion Subsystem
+    wire  [DMAC_1_CHANNEL_NUM-1:0] DMAC_1_DMA_REQ;     // DMA transfer request
+    wire  [DMAC_1_CHANNEL_NUM-1:0] DMAC_1_DMA_DONE;    // DMA transfer done
+    wire                           DMAC_1_DMA_ERR;     // DMA slave response not OK
+    
+    // DMA Request Wiring
+    //--------------------------
+    
+    wire   DMAC_ANY_DONE;
+    wire   DMAC_ANY_ERROR;
+    
+    wire   DMAC_0_ANY_DONE;
+    wire   DMAC_1_ANY_DONE;
+    
+    assign EXP_DLAST [1:0] = 2'b00;
+    assign DMAC_0_DMA_REQ  = EXP_DRQ;
+    
+    assign DMAC_0_ANY_DONE = |DMAC_0_DMA_DONE;
+    assign DMAC_1_ANY_DONE = |DMAC_1_DMA_DONE;
+    
+    assign DMAC_ANY_DONE   = DMAC_0_ANY_DONE | DMAC_1_ANY_DONE;
+    assign DMAC_ANY_ERROR  = DMAC_0_DMA_ERR  | DMAC_1_DMA_ERR;
+    
+    // APB Assignments
+    //--------------------------
+    assign DMAC_0_PREADY  = 1'b1;
+    assign DMAC_0_PSLVERR = 1'b0;
+    
+    assign DMAC_1_PREADY  = 1'b1;
+    assign DMAC_1_PSLVERR = 1'b0;
+    
+    // Instantiate Subsystem
+    //--------------------------
+    
+    nanosoc_ss_dma #(
+        // System Parameters
+        .SYS_ADDR_W(SYS_ADDR_W),
+        .SYS_DATA_W(SYS_DATA_W),
+        
+        // DMA Parameters
+        .DMAC_0_CFG_ADDR_W(DMAC_0_CFG_ADDR_W),
+        .DMAC_1_CFG_ADDR_W(DMAC_1_CFG_ADDR_W),
+        .DMAC_0_CHANNEL_NUM(DMAC_0_CHANNEL_NUM),
+        .DMAC_1_CHANNEL_NUM(DMAC_1_CHANNEL_NUM)
+    ) u_dma_ss (
+        // System AHB Clocks and Resets
+        .SYS_HCLK(SYS_HCLK),
+        .SYS_HRESETn(SYS_HRESETn),
+        .SYS_PCLKEN(SYS_PCLKEN),
+        
+        // DMAC 0 AHB Lite Port
+        .DMAC_0_HADDR(DMAC_0_HADDR),
+        .DMAC_0_HTRANS(DMAC_0_HTRANS),
+        .DMAC_0_HWRITE(DMAC_0_HWRITE),
+        .DMAC_0_HSIZE(DMAC_0_HSIZE),
+        .DMAC_0_HBURST(DMAC_0_HBURST),
+        .DMAC_0_HPROT(DMAC_0_HPROT),
+        .DMAC_0_HWDATA(DMAC_0_HWDATA),
+        .DMAC_0_HMASTLOCK(DMAC_0_HMASTLOCK),
+        .DMAC_0_HRDATA(DMAC_0_HRDATA),
+        .DMAC_0_HREADY(DMAC_0_HREADY),
+        .DMAC_0_HRESP(DMAC_0_HRESP),
+        
+        // DMAC 0 APB Configurtation Port
+        .DMAC_0_PSEL(DMAC_0_PSEL),
+        .DMAC_0_PEN(SYSIO_PENABLE),
+        .DMAC_0_PWRITE(SYSIO_PWRITE),
+        .DMAC_0_PADDR(SYSIO_PADDR),
+        .DMAC_0_PWDATA(SYSIO_PWDATA),
+        .DMAC_0_PRDATA(DMAC_0_PRDATA),
+        
+        // DMAC 0 DMA Request and Status Port
+        .DMAC_0_DMA_REQ(DMAC_0_DMA_REQ),
+        .DMAC_0_DMA_DONE(DMAC_0_DMA_DONE),
+        .DMAC_0_DMA_ERR(DMAC_0_DMA_ERR),
+        
+        // DMAC 1 AHB Lite Port
+        .DMAC_1_HADDR(DMAC_1_HADDR),
+        .DMAC_1_HTRANS(DMAC_1_HTRANS),
+        .DMAC_1_HWRITE(DMAC_1_HWRITE),
+        .DMAC_1_HSIZE(DMAC_1_HSIZE),
+        .DMAC_1_HBURST(DMAC_1_HBURST),
+        .DMAC_1_HPROT(DMAC_1_HPROT),
+        .DMAC_1_HWDATA(DMAC_1_HWDATA),
+        .DMAC_1_HMASTLOCK(DMAC_1_HMASTLOCK),
+        .DMAC_1_HRDATA(DMAC_1_HRDATA),
+        .DMAC_1_HREADY(DMAC_1_HREADY),
+        .DMAC_1_HRESP(DMAC_1_HRESP),
+        
+        // DMAC 1 APB Configurtation Port
+        .DMAC_1_PSEL(DMAC_1_PSEL),
+        .DMAC_1_PEN(SYSIO_PENABLE),
+        .DMAC_1_PWRITE(SYSIO_PWRITE),
+        .DMAC_1_PADDR(SYSIO_PADDR),
+        .DMAC_1_PWDATA(SYSIO_PWDATA),
+        .DMAC_1_PRDATA(DMAC_1_PRDATA),
+        
+        // DMAC 1 DMA Request and Status Port
+        .DMAC_1_DMA_REQ(DMAC_1_DMA_REQ),
+        .DMAC_1_DMA_DONE(DMAC_1_DMA_DONE),
+        .DMAC_1_DMA_ERR(DMAC_1_DMA_ERR)
+    );
+
+    //--------------------------
+    // Debug Subsystem
+    //--------------------------
+    
+    // Internal Wiring
+    //--------------------------
+    // SocDebug AHB-lite Interface - To Interconnect Subsystem
+    wire              [31:0] DEBUG_HADDR;
+    wire              [ 2:0] DEBUG_HBURST;
+    wire                     DEBUG_HMASTLOCK;
+    wire              [ 3:0] DEBUG_HPROT;
+    wire              [ 2:0] DEBUG_HSIZE;
+    wire              [ 1:0] DEBUG_HTRANS;
+    wire              [31:0] DEBUG_HWDATA;
+    wire                     DEBUG_HWRITE;
+    wire              [31:0] DEBUG_HRDATA;
+    wire                     DEBUG_HREADY;
+    wire                     DEBUG_HRESP;
+        
+    // USRT APB Interface - To System Control Subsystem
+    wire                     DEBUG_PSEL;      // Device select
+    wire              [31:0] DEBUG_PRDATA;    // Read data
+    wire                     DEBUG_PREADY;    // Device ready
+    wire                     DEBUG_PSLVERR;   // Device error response
+    
+    // Debug Reset Request
+    wire                     DEBUG_RESETREQ;
+    
+    // Reset Request Wiring
+    //--------------------------
+    
+    assign DEBUG_RESETREQ = GPO8[0];
+    
+    // Instantiate Subsystem
+    //--------------------------
+    nanosoc_ss_debug #(
+        // System Parameters
+        .SYS_ADDR_W(SYS_ADDR_W),
+        .SYS_DATA_W(SYS_DATA_W),
+        
+        // SoCDebug Parameters
+        .PROMPT_CHAR(PROMPT_CHAR),
+        .FT1248_WIDTH(FT1248_WIDTH),
+        .FT1248_CLKON(FT1248_CLKON)
+    ) u_debug_ss (
+        // System Clocks and Resets
+        .SYS_HCLK(SYS_HCLK),
+        .SYS_HRESETn(SYS_HRESETn),
+        .SYS_PCLK(SYS_PCLK),
+        .SYS_PCLKG(SYS_PCLKG),
+        .SYS_PRESETn(SYS_PRESETn),
+        
+        // AHB-lite Master Interface - ADP
+        .DEBUG_HADDR(DEBUG_HADDR),
+        .DEBUG_HBURST(DEBUG_HBURST),
+        .DEBUG_HMASTLOCK(DEBUG_HMASTLOCK),
+        .DEBUG_HPROT(DEBUG_HPROT),
+        .DEBUG_HSIZE(DEBUG_HSIZE),
+        .DEBUG_HTRANS(DEBUG_HTRANS),
+        .DEBUG_HWDATA(DEBUG_HWDATA),
+        .DEBUG_HWRITE(DEBUG_HWRITE),
+        .DEBUG_HRDATA(DEBUG_HRDATA),
+        .DEBUG_HREADY(DEBUG_HREADY),
+        .DEBUG_HRESP(DEBUG_HRESP),
+        
+        // APB Slave Interface - USRT
+        .DEBUG_PSEL(DEBUG_PSEL),
+        .DEBUG_PADDR(SYSIO_PADDR),
+        .DEBUG_PENABLE(SYSIO_PENABLE),
+        .DEBUG_PWRITE(SYSIO_PWRITE),
+        .DEBUG_PWDATA(SYSIO_PWDATA),
+        .DEBUG_PRDATA(DEBUG_PRDATA),
+        .DEBUG_PREADY(DEBUG_PREADY),
+        .DEBUG_PSLVERR(DEBUG_PSLVERR),
+        
+        // FT1248 Interface - 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)
+    );
+
+    //--------------------------
+    // Expansion Subsystem
+    //--------------------------
+
+    // Internal Wiring
+    //--------------------------
+        
+    // Expansion Region AHB Port - To Interconnect Subsystem
+    wire                   EXP_HSEL;
+    wire  [SYS_ADDR_W-1:0] EXP_HADDR;
+    wire             [1:0] EXP_HTRANS;
+    wire             [2:0] EXP_HSIZE;
+    wire             [3:0] EXP_HPROT;
+    wire                   EXP_HWRITE;
+    wire                   EXP_HREADY;
+    wire            [31:0] EXP_HWDATA;
+            
+    wire                   EXP_HREADYOUT;
+    wire                   EXP_HRESP;
+    wire            [31:0] EXP_HRDATA;
+    
+    // SRAM Low Region AHB Port - To Interconnect Subsystem
+    wire                   EXPSRAM_L_HSEL;
+    wire  [SYS_ADDR_W-1:0] EXPSRAM_L_HADDR;
+    wire             [1:0] EXPSRAM_L_HTRANS;
+    wire             [2:0] EXPSRAM_L_HSIZE;
+    wire             [3:0] EXPSRAM_L_HPROT;
+    wire                   EXPSRAM_L_HWRITE;
+    wire                   EXPSRAM_L_HREADY;
+    wire            [31:0] EXPSRAM_L_HWDATA;
+            
+    wire                   EXPSRAM_L_HREADYOUT;
+    wire                   EXPSRAM_L_HRESP;
+    wire            [31:0] EXPSRAM_L_HRDATA;
+    
+    // SRAM High Region AHB Port - To Interconnect Subsystem
+    wire                   EXPSRAM_H_HSEL;
+    wire  [SYS_ADDR_W-1:0] EXPSRAM_H_HADDR;
+    wire             [1:0] EXPSRAM_H_HTRANS;
+    wire             [2:0] EXPSRAM_H_HSIZE;
+    wire             [3:0] EXPSRAM_H_HPROT;
+    wire                   EXPSRAM_H_HWRITE;
+    wire                   EXPSRAM_H_HREADY;
+    wire            [31:0] EXPSRAM_H_HWDATA;
+            
+    wire                   EXPSRAM_H_HREADYOUT;
+    wire                   EXPSRAM_H_HRESP;
+    wire            [31:0] EXPSRAM_H_HRDATA;
+    
+    // Interrupt Connections - TO CPU Subsystem
+    wire             [3:0] EXP_IRQ;
+    
+    // DMA Connections - To DMA Subsystem
+    wire             [1:0] EXP_DRQ;
+    wire             [1:0] EXP_DLAST;
+    
+    // Instantiate Subsystem
+    //--------------------------
+    nanosoc_ss_expansion #(
+        // System Parameters
+        .SYS_ADDR_W(SYS_ADDR_W),
+        .SYS_DATA_W(SYS_DATA_W),
+        
+        // SRAM Low Parameters
+        .EXPRAM_L_RAM_ADDR_W(EXPRAM_L_RAM_ADDR_W),
+        .EXPRAM_L_RAM_DATA_W(EXPRAM_L_RAM_DATA_W),
+        
+        // SRAM High Parameters
+        .EXPRAM_H_RAM_ADDR_W(EXPRAM_H_RAM_ADDR_W),
+        .EXPRAM_H_RAM_DATA_W(EXPRAM_H_RAM_DATA_W)
+    ) u_expansion_ss (
+        // System Clocks and Resets
+        .SYS_HCLK(SYS_HCLK),
+        .SYS_HRESETn(SYS_HRESETn),
+        
+        // Expansion Region AHB Port
+        .EXP_HSEL(EXP_HSEL),
+        .EXP_HADDR(EXP_HADDR),
+        .EXP_HTRANS(EXP_HTRANS),
+        .EXP_HSIZE(EXP_HSIZE),
+        .EXP_HPROT(EXP_HPROT),
+        .EXP_HWRITE(EXP_HWRITE),
+        .EXP_HREADY(EXP_HREADY),
+        .EXP_HWDATA(EXP_HWDATA),
+        .EXP_HREADYOUT(EXP_HREADYOUT),
+        .EXP_HRESP(EXP_HRESP),
+        .EXP_HRDATA(EXP_HRDATA),
+        
+        // SRAM Low Region AHB Port
+        .EXPSRAM_L_HSEL(EXPSRAM_L_HSEL),
+        .EXPSRAM_L_HADDR(EXPSRAM_L_HADDR),
+        .EXPSRAM_L_HTRANS(EXPSRAM_L_HTRANS),
+        .EXPSRAM_L_HSIZE(EXPSRAM_L_HSIZE),
+        .EXPSRAM_L_HPROT(EXPSRAM_L_HPROT),
+        .EXPSRAM_L_HWRITE(EXPSRAM_L_HWRITE),
+        .EXPSRAM_L_HREADY(EXPSRAM_L_HREADY),
+        .EXPSRAM_L_HWDATA(EXPSRAM_L_HWDATA),
+        .EXPSRAM_L_HREADYOUT(EXPSRAM_L_HREADYOUT),
+        .EXPSRAM_L_HRESP(EXPSRAM_L_HRESP),
+        .EXPSRAM_L_HRDATA(EXPSRAM_L_HRDATA),
+        
+        // SRAM High Region AHB Port
+        .EXPSRAM_H_HSEL(EXPSRAM_H_HSEL),
+        .EXPSRAM_H_HADDR(EXPSRAM_H_HADDR),
+        .EXPSRAM_H_HTRANS(EXPSRAM_H_HTRANS),
+        .EXPSRAM_H_HSIZE(EXPSRAM_H_HSIZE),
+        .EXPSRAM_H_HPROT(EXPSRAM_H_HPROT),
+        .EXPSRAM_H_HWRITE(EXPSRAM_H_HWRITE),
+        .EXPSRAM_H_HREADY(EXPSRAM_H_HREADY),
+        .EXPSRAM_H_HWDATA(EXPSRAM_H_HWDATA),
+        .EXPSRAM_H_HREADYOUT(EXPSRAM_H_HREADYOUT),
+        .EXPSRAM_H_HRESP(EXPSRAM_H_HRESP),
+        .EXPSRAM_H_HRDATA(EXPSRAM_H_HRDATA),
+        
+        // Interrupt and DMAC Connections
+        .EXP_IRQ(EXP_IRQ),
+        .EXP_DRQ(EXP_DRQ),
+        .EXP_DLAST(EXP_DLAST)
+    );
+
+    //--------------------------
+    // System Control Subsystem
+    //--------------------------
+    
+    // Internal Wiring
+    //--------------------------
+
+    // SYSIO AHB interface - To Interconnect Subsystem
+    wire                   SYSIO_HSEL;           // AHB region select
+    wire  [SYS_ADDR_W-1:0] SYSIO_HADDR;          // AHB address
+    wire            [ 2:0] SYSIO_HBURST;         // AHB burst
+    wire                   SYSIO_HMASTLOCK;      // AHB lock
+    wire            [ 3:0] SYSIO_HPROT;          // AHB prot
+    wire            [ 2:0] SYSIO_HSIZE;          // AHB size
+    wire            [ 1:0] SYSIO_HTRANS;         // AHB transfer
+    wire  [SYS_DATA_W-1:0] SYSIO_HWDATA;         // AHB write data
+    wire                   SYSIO_HWRITE;         // AHB write
+    wire                   SYSIO_HREADY;         // AHB ready
+    wire  [SYS_DATA_W-1:0] SYSIO_HRDATA;         // AHB read-data
+    wire                   SYSIO_HRESP;          // AHB response
+    wire                   SYSIO_HREADYOUT;      // AHB ready out
+    
+    // System ROM Table AHB interface - To Interconnect Subsystem
+    wire                   SYSTABLE_HSEL;           // AHB region select
+    wire  [SYS_ADDR_W-1:0] SYSTABLE_HADDR;          // AHB address
+    wire            [ 2:0] SYSTABLE_HBURST;         // AHB burst
+    wire                   SYSTABLE_HMASTLOCK;      // AHB lock
+    wire            [ 3:0] SYSTABLE_HPROT;          // AHB prot
+    wire            [ 2:0] SYSTABLE_HSIZE;          // AHB size
+    wire            [ 1:0] SYSTABLE_HTRANS;         // AHB transfer
+    wire  [SYS_DATA_W-1:0] SYSTABLE_HWDATA;         // AHB write data
+    wire                   SYSTABLE_HWRITE;         // AHB write
+    wire                   SYSTABLE_HREADY;         // AHB ready
+    wire  [SYS_DATA_W-1:0] SYSTABLE_HRDATA;         // AHB read-data
+    wire                   SYSTABLE_HRESP;          // AHB response
+    wire                   SYSTABLE_HREADYOUT;      // AHB ready out
+
+    // Sysio APB driving signals - To all APB Components
+    wire                   SYSIO_PENABLE;
+    wire                   SYSIO_PWRITE;
+    wire  [APB_ADDR_W-1:0] SYSIO_PADDR;
+    wire  [APB_DATA_W-1:0] SYSIO_PWDATA;
+    
+    // CPU sideband signalling - TO CPU Subsystem
+    wire                   SYS_NMI;          // watchdog_interrupt;
+    wire           [31:0]  SYS_APB_IRQ;      // apbsubsys_interrupt;
+    wire           [15:0]  SYS_GPIO0_IRQ;    // GPIO 0 IRQs
+    wire           [15:0]  SYS_GPIO1_IRQ;    // GPIO 0 IRQs
+
+    // Bus Matrix Remap Control - To Interconnect Subsystem
+    wire                   SYSIO_REMAP_CTRL; // REMAP control bit
+    wire            [3:0]  SYS_REMAP_CTRL;   // REMAP control bit
+    
+    // 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
+    //--------------------------
+    wire SYS_GPIO0_ANY_IRQ;
+    wire SYS_GPIO1_ANY_IRQ;
+    
+    assign SYS_GPIO0_ANY_IRQ = |SYS_GPIO0_IRQ;
+    assign SYS_GPIO1_ANY_IRQ = |SYS_GPIO1_IRQ;
+    
+    // Remap Wiring
+    //--------------------------
+    assign SYS_REMAP_CTRL [3:0] = { 3'b000, !SYSIO_REMAP_CTRL};
+    
+    // Instantiate Subsystem
+    //--------------------------
+    
+    nanosoc_ss_systemctrl #(
+        // System Parameters
+        .SYS_ADDR_W(SYS_ADDR_W),
+        .SYS_DATA_W(SYS_DATA_W),
+        .APB_ADDR_W(APB_ADDR_W),
+        .APB_DATA_W(APB_DATA_W),
+        .SYSTABLE_BASE(SYSTABLE_BASE),
+        .CLKGATE_PRESENT(CLKGATE_PRESENT)
+    ) u_systemctrl_ss (
+        // Free-running and Crystal Clock Output
+        .SYS_CLK (SYS_CLK),                // System Input Clock
+        .SYS_FCLK(SYS_FCLK),               // Free-running system clock
+        .SYS_XTALCLK_OUT(SYS_XTALCLK_OUT), // Crystal Clock Output
+        
+        // System Input Clocks and Resets
+        .SYS_PORESETn(SYS_PORESETn),       // Power-On-Reset reset (active-low)
+        .SYS_TESTMODE(SYS_TESTMODE),       // Reset bypass in scan test
+        .SYS_HCLK(SYS_HCLK),               // AHB clock
+        .SYS_HRESETn(SYS_HRESETn),         // AHB reset (active-low)
+        
+        // SYSIO AHB interface
+        .SYSIO_HSEL(SYSIO_HSEL),           // AHB region select
+        .SYSIO_HADDR(SYSIO_HADDR),         // AHB address
+        .SYSIO_HBURST(SYSIO_HBURST),       // AHB burst
+        .SYSIO_HMASTLOCK(SYSIO_HMASTLOCK), // AHB lock
+        .SYSIO_HPROT(SYSIO_HPROT),         // AHB prot
+        .SYSIO_HSIZE(SYSIO_HSIZE),         // AHB size
+        .SYSIO_HTRANS(SYSIO_HTRANS),       // AHB transfer
+        .SYSIO_HWDATA(SYSIO_HWDATA),       // AHB write data
+        .SYSIO_HWRITE(SYSIO_HWRITE),       // AHB write
+        .SYSIO_HREADY(SYSIO_HREADY),       // AHB ready
+        .SYSIO_HRDATA(SYSIO_HRDATA),       // AHB read-data
+        .SYSIO_HRESP(SYSIO_HRESP),         // AHB response
+        .SYSIO_HREADYOUT(SYSIO_HREADYOUT), // AHB ready out
+        
+        // System ROM Table AHB interface
+        .SYSTABLE_HSEL(SYSTABLE_HSEL),           // AHB region select
+        .SYSTABLE_HADDR(SYSTABLE_HADDR),         // AHB address
+        .SYSTABLE_HBURST(SYSTABLE_HBURST),       // AHB burst
+        .SYSTABLE_HMASTLOCK(SYSTABLE_HMASTLOCK), // AHB lock
+        .SYSTABLE_HPROT(SYSTABLE_HPROT),         // AHB prot
+        .SYSTABLE_HSIZE(SYSTABLE_HSIZE),         // AHB size
+        .SYSTABLE_HTRANS(SYSTABLE_HTRANS),       // AHB transfer
+        .SYSTABLE_HWDATA(SYSTABLE_HWDATA),       // AHB write data
+        .SYSTABLE_HWRITE(SYSTABLE_HWRITE),       // AHB write
+        .SYSTABLE_HREADY(SYSTABLE_HREADY),       // AHB ready
+        .SYSTABLE_HRDATA(SYSTABLE_HRDATA),       // AHB read-data
+        .SYSTABLE_HRESP(SYSTABLE_HRESP),         // AHB response
+        .SYSTABLE_HREADYOUT(SYSTABLE_HREADYOUT), // AHB ready out
+        
+        // APB clocking control
+        .SYS_PCLK(SYS_PCLK),       // Peripheral clock
+        .SYS_PCLKG(SYS_PCLKG),     // Gated Peripheral bus clock
+        .SYS_PRESETn(SYS_PRESETn), // Peripheral system and APB reset
+        .SYS_PCLKEN(SYS_PCLKEN),   // Clock divide control for AHB to APB bridge
+        
+        // APB external Slave Interfaces
+        .SYSIO_PENABLE(SYSIO_PENABLE),
+        .SYSIO_PWRITE(SYSIO_PWRITE),
+        .SYSIO_PADDR(SYSIO_PADDR),
+        .SYSIO_PWDATA(SYSIO_PWDATA),
+        
+        .USRT_PSEL(DEBUG_PSEL),
+        .USRT_PRDATA(DEBUG_PREADY),
+        .USRT_PSLVERR(DEBUG_PSLVERR),
+        
+        .DMAC_0_PSEL(DMAC_0_PSEL),
+        .DMAC_0_PRDATA(DMAC_0_PRDATA),
+        .DMAC_0_PREADY(DMAC_0_PREADY),
+        .DMAC_0_PSLVERR(DMAC_0_PSLVERR),
+        
+        .DMAC_1_PSEL(DMAC_1_PSEL),
+        .DMAC_1_PRDATA(DMAC_1_PRDATA),
+        .DMAC_1_PREADY(DMAC_1_PREADY),
+        .DMAC_1_PSLVERR(DMAC_1_PSLVERR),
+        
+        // CPU sideband signalling
+        .SYS_NMI(SYS_NMI),
+        .SYS_APB_IRQ(SYS_APB_IRQ),
+        .SYS_GPIO0_IRQ(SYS_GPIO0_IRQ),
+        .SYS_GPIO1_IRQ(SYS_GPIO1_IRQ),
+        
+        // CPU power/reset control
+        .SYS_REMAP_CTRL(SYSIO_REMAP_CTRL),
+        .SYS_WDOGRESETREQ(SYS_WDOGRESETREQ),
+        .SYS_LOCKUPRESET(SYS_LOCKUPRESET),
+        
+        // System Reset Request Signals
+        .SYS_SYSRESETREQ(SYS_SYSRESETREQ),
+        .SYS_PRMURESETREQ(SYS_PRMURESETREQ),
+        
+        // Power Management Control and Status
+        .SYS_PMUENABLE(SYS_PMUENABLE),
+        .SYS_PMUDBGRESETREQ(SYS_PMUDBGRESETREQ),
+        
+        // CPU Status Signals
+        .CPU_0_LOCKUP(CPU_0_LOCKUP),
+        .CPU_0_SLEEPING(CPU_0_SLEEPING),
+        .CPU_0_SLEEPDEEP(CPU_0_SLEEPDEEP),
+        
+        // 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)
+    );
+
+    //--------------------------
+    // Interconnect Subsystem
+    //--------------------------
+    
+    // Instantiate Subsystem
+    //--------------------------
+    
+    nanosoc_ss_interconnect #(
+        .SYS_ADDR_W   (SYS_ADDR_W),  // System Address Width
+        .SYS_DATA_W   (SYS_DATA_W)   // System Data Width
+    ) u_interconnect_ss (
+        // System Clocks, Resets, and Control
+        .SYS_HCLK(SYS_HCLK),
+        .SYS_HRESETn(SYS_HRESETn),
+        .SYS_SCANENABLE(SYS_SCANENABLE),
+        .INC_SCANINHCLK(INC_SCANINHCLK),
+        .INC_SCANOUTHCLK(INC_SCANOUTHCLK),
+
+        // System Address Remap control
+        .SYS_REMAP_CTRL(SYS_REMAP_CTRL),
+
+        // Debug Master Port
+        .DEBUG_HADDR(DEBUG_HADDR),
+        .DEBUG_HTRANS(DEBUG_HTRANS),
+        .DEBUG_HWRITE(DEBUG_HWRITE),
+        .DEBUG_HSIZE(DEBUG_HSIZE),
+        .DEBUG_HBURST(DEBUG_HBURST),
+        .DEBUG_HPROT(DEBUG_HPROT),
+        .DEBUG_HWDATA(DEBUG_HWDATA),
+        .DEBUG_HMASTLOCK(DEBUG_HMASTLOCK),
+        .DEBUG_HRDATA(DEBUG_HRDATA),
+        .DEBUG_HREADY(DEBUG_HREADY),
+        .DEBUG_HRESP(DEBUG_HRESP),
+
+        // DMA Controller 0 Master Port
+        .DMAC_0_HADDR(DMAC_0_HADDR),
+        .DMAC_0_HTRANS(DMAC_0_HTRANS),
+        .DMAC_0_HWRITE(DMAC_0_HWRITE),
+        .DMAC_0_HSIZE(DMAC_0_HSIZE),
+        .DMAC_0_HBURST(DMAC_0_HBURST),
+        .DMAC_0_HPROT(DMAC_0_HPROT),
+        .DMAC_0_HWDATA(DMAC_0_HWDATA),
+        .DMAC_0_HMASTLOCK(DMAC_0_HMASTLOCK),
+        .DMAC_0_HRDATA(DMAC_0_HRDATA),
+        .DMAC_0_HREADY(DMAC_0_HREADY),
+        .DMAC_0_HRESP(DMAC_0_HRESP),
+
+        // DMAC Controller 1 Master Port
+        .DMAC_1_HADDR(DMAC_1_HADDR),
+        .DMAC_1_HTRANS(DMAC_1_HTRANS),
+        .DMAC_1_HWRITE(DMAC_1_HWRITE),
+        .DMAC_1_HSIZE(DMAC_1_HSIZE),
+        .DMAC_1_HBURST(DMAC_1_HBURST),
+        .DMAC_1_HPROT(DMAC_1_HPROT),
+        .DMAC_1_HWDATA(DMAC_1_HWDATA),
+        .DMAC_1_HMASTLOCK(DMAC_1_HMASTLOCK),
+        .DMAC_1_HRDATA(DMAC_1_HRDATA),
+        .DMAC_1_HREADY(DMAC_1_HREADY),
+        .DMAC_1_HRESP(DMAC_1_HRESP),
+        
+        // CPU 0 Master Port
+        .CPU_0_HADDR(CPU_0_HADDR),
+        .CPU_0_HTRANS(CPU_0_HTRANS),
+        .CPU_0_HWRITE(CPU_0_HWRITE),
+        .CPU_0_HSIZE(CPU_0_HSIZE),
+        .CPU_0_HBURST(CPU_0_HBURST),
+        .CPU_0_HPROT(CPU_0_HPROT),
+        .CPU_0_HWDATA(CPU_0_HWDATA),
+        .CPU_0_HMASTLOCK(CPU_0_HMASTLOCK),
+        .CPU_0_HRDATA(CPU_0_HRDATA),
+        .CPU_0_HREADY(CPU_0_HREADY),
+        .CPU_0_HRESP(CPU_0_HRESP),
+
+        // Bootrom 0 Region Slave Port
+        .BOOTROM_0_HRDATA(BOOTROM_0_HRDATA),
+        .BOOTROM_0_HREADYOUT(BOOTROM_0_HREADYOUT),
+        .BOOTROM_0_HRESP(BOOTROM_0_HRESP),
+        .BOOTROM_0_HSEL(BOOTROM_0_HSEL),
+        .BOOTROM_0_HADDR(BOOTROM_0_HADDR),
+        .BOOTROM_0_HTRANS(BOOTROM_0_HTRANS),
+        .BOOTROM_0_HWRITE(BOOTROM_0_HWRITE),
+        .BOOTROM_0_HSIZE(BOOTROM_0_HSIZE),
+        .BOOTROM_0_HBURST(BOOTROM_0_HBURST),
+        .BOOTROM_0_HPROT(BOOTROM_0_HPROT),
+        .BOOTROM_0_HWDATA(BOOTROM_0_HWDATA),
+        .BOOTROM_0_HMASTLOCK(BOOTROM_0_HMASTLOCK),
+        .BOOTROM_0_HREADYMUX(BOOTROM_0_HREADYMUX),
+
+        // CPU 0 Instruction Memory Region Slave Port
+        .IMEM_0_HRDATA(IMEM_0_HRDATA),
+        .IMEM_0_HREADYOUT(IMEM_0_HREADYOUT),
+        .IMEM_0_HRESP(IMEM_0_HRESP),
+        .IMEM_0_HSEL(IMEM_0_HSEL),
+        .IMEM_0_HADDR(IMEM_0_HADDR),
+        .IMEM_0_HTRANS(IMEM_0_HTRANS),
+        .IMEM_0_HWRITE(IMEM_0_HWRITE),
+        .IMEM_0_HSIZE(IMEM_0_HSIZE),
+        .IMEM_0_HBURST(IMEM_0_HBURST),
+        .IMEM_0_HPROT(IMEM_0_HPROT),
+        .IMEM_0_HWDATA(IMEM_0_HWDATA),
+        .IMEM_0_HMASTLOCK(IMEM_0_HMASTLOCK),
+        .IMEM_0_HREADYMUX(IMEM_0_HREADYMUX),
+
+        // CPU 0 Data Memory Region Slave Port
+        .DMEM_0_HRDATA(DMEM_0_HRDATA),
+        .DMEM_0_HREADYOUT(DMEM_0_HREADYOUT),
+        .DMEM_0_HRESP(DMEM_0_HRESP),
+        .DMEM_0_HSEL(DMEM_0_HSEL),
+        .DMEM_0_HADDR(DMEM_0_HADDR),
+        .DMEM_0_HTRANS(DMEM_0_HTRANS),
+        .DMEM_0_HWRITE(DMEM_0_HWRITE),
+        .DMEM_0_HSIZE(DMEM_0_HSIZE),
+        .DMEM_0_HBURST(DMEM_0_HBURST),
+        .DMEM_0_HPROT(DMEM_0_HPROT),
+        .DMEM_0_HWDATA(DMEM_0_HWDATA),
+        .DMEM_0_HMASTLOCK(DMEM_0_HMASTLOCK),
+        .DMEM_0_HREADYMUX(DMEM_0_HREADYMUX),
+
+        // System Peripheral Region Slave Port
+        .SYSIO_HRDATA(SYSIO_HRDATA),
+        .SYSIO_HREADYOUT(SYSIO_HREADYOUT),
+        .SYSIO_HRESP(SYSIO_HRESP),
+        .SYSIO_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),
+
+        // Expansion Memory Low Region Slave Port
+        .EXPRAM_L_HRDATA(EXPRAM_L_HRDATA),
+        .EXPRAM_L_HREADYOUT(EXPRAM_L_HREADYOUT),
+        .EXPRAM_L_HRESP(EXPRAM_L_HRESP),
+        .EXPRAM_L_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),
+
+        // Expansion Memory High Region Slave Port
+        .EXPRAM_H_HRDATA(EXPRAM_H_HRDATA),
+        .EXPRAM_H_HREADYOUT(EXPRAM_H_HREADYOUT),
+        .EXPRAM_H_HRESP(EXPRAM_H_HRESP),
+        .EXPRAM_H_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),
+
+        // Expansion Region Slave Port
+        .EXP_HRDATA(EXP_HRDATA),
+        .EXP_HREADYOUT(EXP_HREADYOUT),
+        .EXP_HRESP(EXP_HRESP),
+        .EXP_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),
+
+        // System ROM Table Region Slave Port
+        .SYSTABLE_HRDATA(SYSTABLE_HRDATA),
+        .SYSTABLE_HREADYOUT(SYSTABLE_HREADYOUT),
+        .SYSTABLE_HRESP(SYSTABLE_HRESP),
+        .SYSTABLE_HSEL(SYSTABLE_HSEL),
+        .SYSTABLE_HADDR(SYSTABLE_HADDR),
+        .SYSTABLE_HTRANS(SYSTABLE_HTRANS),
+        .SYSTABLE_HWRITE(SYSTABLE_HWRITE),
+        .SYSTABLE_HSIZE(SYSTABLE_HSIZE),
+        .SYSTABLE_HBURST(SYSTABLE_HBURST),
+        .SYSTABLE_HPROT(SYSTABLE_HPROT),
+        .SYSTABLE_HWDATA(SYSTABLE_HWDATA),
+        .SYSTABLE_HMASTLOCK(SYSTABLE_HMASTLOCK),
+        .SYSTABLE_HREADYMUX(SYSTABLE_HREADYMUX)
+    );
+
+endmodule
\ No newline at end of file
-- 
GitLab