From b1f0b4bd000376df7dc70bf327ede86e1169a03e Mon Sep 17 00:00:00 2001
From: dam1n19 <dam1n19@soton.ac.uk>
Date: Fri, 16 Jun 2023 12:03:38 +0100
Subject: [PATCH] SOC1-230: Added clock control and pin mux to systemctrl
 subsystem

---
 .../verilog/nanosoc_manager_socdebug.v        | 106 ------
 .../sysio/verilog/nanosoc_region_sysio.v      |  66 +---
 .../sysio/verilog/nanosoc_sysio_decode.v      |   9 +-
 .../verilog/nanosoc_region_systable.v         |  42 +--
 .../dma/verilog/nanosoc_ss_dma.v              |   9 +-
 .../verilog/nanosoc_ss_systemctrl.v           | 350 ++++++++++++++++++
 6 files changed, 389 insertions(+), 193 deletions(-)
 delete mode 100644 system/nanosoc_managers/socdebug/verilog/nanosoc_manager_socdebug.v
 create mode 100644 system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v

diff --git a/system/nanosoc_managers/socdebug/verilog/nanosoc_manager_socdebug.v b/system/nanosoc_managers/socdebug/verilog/nanosoc_manager_socdebug.v
deleted file mode 100644
index cd0b5ed..0000000
--- a/system/nanosoc_managers/socdebug/verilog/nanosoc_manager_socdebug.v
+++ /dev/null
@@ -1,106 +0,0 @@
-//-----------------------------------------------------------------------------
-// NanoSoC Wrapper for SoCDebug Chip Debug Manager
-// 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)
-//-----------------------------------------------------------------------------
-
-module nanosoc_manager_socdebug #(
-    parameter         PROMPT_CHAR   = "]",
-    parameter integer FT1248_WIDTH	= 1, // FTDI Interface 1,2,4 width supported
-    parameter integer FT1248_CLKON	= 0  // FTDI clock always on - else quiet when no access
-)(  
-    // AHB-lite Master Interface - ADP
-    input  wire                     HCLK,
-    input  wire                     HRESETn,
-    output wire              [31:0] HADDR32_o,
-    output wire              [ 2:0] HBURST3_o,
-    output wire                     HMASTLOCK_o,
-    output wire              [ 3:0] HPROT4_o,
-    output wire              [ 2:0] HSIZE3_o,
-    output wire              [ 1:0] HTRANS2_o,
-    output wire              [31:0] HWDATA32_o,
-    output wire                     HWRITE_o,
-    input  wire              [31:0] HRDATA32_i,
-    input  wire                     HREADY_i,
-    input  wire                     HRESP_i,
-    
-    // APB Slave Interface - USRT
-    input  wire                     PCLK,        // Clock
-    input  wire                     PCLKG,       // Gated Clock
-    input  wire                     PRESETn,     // Reset
-
-    input  wire                     PSEL_i,      // Device select
-    input  wire              [11:2] PADDR_i,     // Address
-    input  wire                     PENABLE_i,   // Transfer control
-    input  wire                     PWRITE_i,    // Write control
-    input  wire              [31:0] PWDATA_i,    // Write data
- 
-    output wire              [31:0] PRDATA_o,    // Read data
-    output wire                     PREADY_o,    // Device ready
-    output wire                     PSLVERR_o,   // Device error response
-    
-    // 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_o,
-    input  wire               [7:0] GPI8_i
-);
-    
-    // Instantiate SoCDebug Controller
-    socdebug_ahb u_socdebug (
-        // AHB-lite Master Interface - ADP
-        .HCLK (HCLK),
-        .HRESETn (HRESETn),
-        .HADDR32_o (HADDR32_o),
-        .HBURST3_o (HBURST3_o),
-        .HMASTLOCK_o (HMASTLOCK_o),
-        .HPROT4_o (HPROT4_o),
-        .HSIZE3_o (HSIZE3_o),
-        .HTRANS2_o (HTRANS2_o),
-        .HWDATA32_o (HWDATA32_o),
-        .HWRITE_o (HWRITE_o),
-        .HRDATA32_i (HRDATA32_i),
-        .HREADY_i (HREADY_i),
-        .HRESP_i (HRESP_i),
-        
-        // APB Slave Interface - USRT
-        .PCLK (PCLK),       
-        .PCLKG (PCLKG),      
-        .PRESETn (PRESETn),    
-        .PSEL_i (PSEL_i),     
-        .PADDR_i (PADDR_i),    
-        .PENABLE_i (PENABLE_i),  
-        .PWRITE_i (PWRITE_i),   
-        .PWDATA_i (PWDATA_i),   
-        .PRDATA_o (PRDATA_o),   
-        .PREADY_o (PREADY_o),   
-        .PSLVERR_o (PSLVERR_o),  
-        
-         // 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_o (GPO8_o),
-        .GPI8_i (GPI8_i)
-    );
-endmodule
\ No newline at end of file
diff --git a/system/nanosoc_regions/sysio/verilog/nanosoc_region_sysio.v b/system/nanosoc_regions/sysio/verilog/nanosoc_region_sysio.v
index 532e672..f3bbc4b 100644
--- a/system/nanosoc_regions/sysio/verilog/nanosoc_region_sysio.v
+++ b/system/nanosoc_regions/sysio/verilog/nanosoc_region_sysio.v
@@ -108,7 +108,6 @@ module nanosoc_region_sysio #(
 
   localparam BASEADDR_GPIO0       = 32'h4001_0000; // GPIO0 peripheral base address
   localparam BASEADDR_GPIO1       = 32'h4001_1000; // GPIO1 peripheral base address
-  localparam BASEADDR_SYSROMTABLE = 32'hf000_0000;
   localparam BE                   = 0;
   
    // ------------------------------------------------------------
@@ -140,18 +139,11 @@ module nanosoc_region_sysio #(
   wire     [SYS_DATA_W-1:0]   sysctrl_hrdata;
   wire                        sysctrl_hresp;
 
-  // System ROM Table
-  wire                        sysrom_hsel;      // AHB to System ROM Table - select
-  wire                        sysrom_hreadyout; 
-  wire     [SYS_DATA_W-1:0]   sysrom_hrdata;
-  wire                        sysrom_hresp;
-
 
   // AHB address decode
   nanosoc_sysio_decode #(
      .BASEADDR_GPIO0       (BASEADDR_GPIO0),
-     .BASEADDR_GPIO1       (BASEADDR_GPIO1),
-     .BASEADDR_SYSROMTABLE (BASEADDR_SYSROMTABLE)
+     .BASEADDR_GPIO1       (BASEADDR_GPIO1)
   ) u_addr_decode (
     // System Address
     .hsel         (HSEL),
@@ -160,7 +152,6 @@ module nanosoc_region_sysio #(
     .gpio0_hsel   (gpio0_hsel),
     .gpio1_hsel   (gpio1_hsel),
     .sysctrl_hsel (sysctrl_hsel),
-    .sysrom_hsel  (sysrom_hsel),
     .defslv_hsel  (defslv_hsel)
   );
 
@@ -170,8 +161,8 @@ module nanosoc_region_sysio #(
     .PORT1_ENABLE  (1), // GPIO Port 0
     .PORT2_ENABLE  (1), // GPIO Port 1
     .PORT3_ENABLE  (1), // SYS control
-    .PORT4_ENABLE  (1), // SYS ROM table
-    .PORT5_ENABLE  (1), // default
+    .PORT4_ENABLE  (1), // default
+    .PORT5_ENABLE  (0),
     .PORT6_ENABLE  (0),
     .PORT7_ENABLE  (0),
     .PORT8_ENABLE  (0),
@@ -197,11 +188,11 @@ module nanosoc_region_sysio #(
     .HREADYOUT3   (sysctrl_hreadyout),
     .HRESP3       (sysctrl_hresp),
     .HRDATA3      (sysctrl_hrdata),
-    .HSEL4        (sysrom_hsel),     // Input Port 4
-    .HREADYOUT4   (sysrom_hreadyout),
-    .HRESP4       (sysrom_hresp),
-    .HRDATA4      (sysrom_hrdata),
-    .HSEL5        (defslv_hsel),     // Input Port 5
+    .HSEL4        (defslv_hsel),     // Input Port 4
+    .HREADYOUT4   (defslv_hreadyout),
+    .HRESP4       (defslv_hresp),
+    .HRDATA4      (defslv_hrdata),
+    .HSEL5        (1'b0),     // Input Port 5
     .HREADYOUT5   (defslv_hreadyout),
     .HRESP5       (defslv_hresp),
     .HRDATA5      (defslv_hrdata),
@@ -240,39 +231,6 @@ module nanosoc_region_sysio #(
 
   assign   defslv_hrdata = 32'h00000000; // Default slave do not have read data
 
-  // -------------------------------
-  // System ROM Table
-  // -------------------------------
-  nanosoc_ahb_cs_rom_table #(//.JEPID                             (),
-     //.JEPCONTINUATION                   (),
-     //.PARTNUMBER                        (),
-     //.REVISION                          (),
-     .BASE              (BASEADDR_SYSROMTABLE),
-     // Entry 0 = Cortex-M0+ Processor
-     .ENTRY0BASEADDR    (32'hE00FF000),
-     .ENTRY0PRESENT     (1'b1),
-     // Entry 1 = CoreSight MTB-M0+
-     .ENTRY1BASEADDR    (32'hF0200000),
-     .ENTRY1PRESENT     (0))
-    u_system_rom_table
-    (//Outputs
-     .HRDATA                            (sysrom_hrdata[31:0]),
-     .HREADYOUT                         (sysrom_hreadyout),
-     .HRESP                             (sysrom_hresp),
-     //Inputs
-     .HCLK                              (HCLK),
-     .HSEL                              (sysrom_hsel),
-     .HADDR                             (HADDR[31:0]),
-     .HBURST                            (HBURST[2:0]),
-     .HMASTLOCK                         (HMASTLOCK),
-     .HPROT                             (HPROT[3:0]),
-     .HSIZE                             (HSIZE[2:0]),
-     .HTRANS                            (HTRANS[1:0]),
-     .HWDATA                            (HWDATA[31:0]),
-     .HWRITE                            (HWRITE),
-     .HREADY                            (HREADY),
-     .ECOREVNUM                         (4'h0));
-
   // -------------------------------
   // Peripherals
   // -------------------------------
@@ -377,10 +335,10 @@ module nanosoc_region_sysio #(
 
   // APB subsystem for timers, UARTs
   nanosoc_sysio_apb_ss #(
-    .APB_EXT_PORT12_ENABLE   (1),
-    .APB_EXT_PORT13_ENABLE   (1),
-    .APB_EXT_PORT14_ENABLE   (1),
-    .APB_EXT_PORT15_ENABLE   (1),
+    .APB_EXT_PORT12_ENABLE   (1), // DMAC 1
+    .APB_EXT_PORT13_ENABLE   (0), // Not Used
+    .APB_EXT_PORT14_ENABLE   (1), // USRT
+    .APB_EXT_PORT15_ENABLE   (1), // DMAC 0
     .INCLUDE_IRQ_SYNCHRONIZER(0),  // require IRQs to be HCLK synchronous
     .INCLUDE_APB_TEST_SLAVE  (1),  // Include example test slave
     .INCLUDE_APB_TIMER0      (1),  // Include simple timer #0
diff --git a/system/nanosoc_regions/sysio/verilog/nanosoc_sysio_decode.v b/system/nanosoc_regions/sysio/verilog/nanosoc_sysio_decode.v
index 36e86a9..609839a 100644
--- a/system/nanosoc_regions/sysio/verilog/nanosoc_sysio_decode.v
+++ b/system/nanosoc_regions/sysio/verilog/nanosoc_sysio_decode.v
@@ -45,9 +45,7 @@ module nanosoc_sysio_decode #(
   // GPIO1 peripheral base address
   parameter BASEADDR_GPIO1       = 32'h4001_1000,
   // GPIO1 peripheral base address
-  parameter BASEADDR_SYSCTRL     = 32'h4001_f000,
-  // Location of the System ROM Table.
-  parameter BASEADDR_SYSROMTABLE = 32'hf000_0000
+  parameter BASEADDR_SYSCTRL     = 32'h4001_f000
  )(
     // System Address
     input wire                  hsel,
@@ -58,7 +56,6 @@ module nanosoc_sysio_decode #(
     output wire                 gpio0_hsel,
     output wire                 gpio1_hsel,
     output wire                 sysctrl_hsel,
-    output wire                 sysrom_hsel,
 
     // Default slave
     output wire                 defslv_hsel
@@ -82,8 +79,6 @@ module nanosoc_sysio_decode #(
                          BASEADDR_GPIO1[31:12]);       // 0x40011000
   assign sysctrl_hsel = hsel & (haddr[31:12]==
                          BASEADDR_SYSCTRL[31:12]);     // 0x4001F000
-  assign sysrom_hsel  = hsel & (haddr[31:12]==
-                         BASEADDR_SYSROMTABLE[31:12]); // 0xF0000000
 
   // ----------------------------------------------------------
   // Default slave decode logic
@@ -91,7 +86,7 @@ module nanosoc_sysio_decode #(
 
   assign defslv_hsel  = ~(apbsys_hsel |
                           gpio0_hsel   | gpio1_hsel  |
-                          sysctrl_hsel | sysrom_hsel
+                          sysctrl_hsel
                          );
 
 endmodule
diff --git a/system/nanosoc_regions/systable/verilog/nanosoc_region_systable.v b/system/nanosoc_regions/systable/verilog/nanosoc_region_systable.v
index 4c41134..36b9f63 100644
--- a/system/nanosoc_regions/systable/verilog/nanosoc_region_systable.v
+++ b/system/nanosoc_regions/systable/verilog/nanosoc_region_systable.v
@@ -12,28 +12,28 @@
 //-----------------------------------------------------------------------------
 
 module nanosoc_region_systable #(
-        parameter    SYS_ADDR_W    = 32,           // System Address Width
-        parameter    SYS_DATA_W    = 32,           // System Data Width
-        parameter    SYSTABLE_BASE = 32'hf000_0000 // Base Address for System ROM Table
-    )(
-        input  wire                   HCLK,       // Clock
-        input  wire                   HRESETn,    // Reset
+    parameter    SYS_ADDR_W    = 32,           // System Address Width
+    parameter    SYS_DATA_W    = 32,           // System Data Width
+    parameter    SYSTABLE_BASE = 32'hf000_0000 // Base Address for System ROM Table
+)(
+    input  wire                     HCLK,       // Clock
+    input  wire                     HRESETn,    // Reset
 
-        // AHB connection to Initiator
-        input  wire                     HSEL,             // AHB region select
-        input  wire  [SYS_ADDR_W-1:0]   HADDR,            // AHB address
-        input  wire            [ 2:0]   HBURST,           // AHB burst
-        input  wire                     HMASTLOCK,        // AHB lock
-        input  wire            [ 3:0]   HPROT,            // AHB prot
-        input  wire            [ 2:0]   HSIZE,            // AHB size
-        input  wire            [ 1:0]   HTRANS,           // AHB transfer
-        input  wire  [SYS_DATA_W-1:0]   HWDATA,           // AHB write data
-        input  wire                     HWRITE,           // AHB write
-        input  wire                     HREADY,           // AHB ready
-        output  wire [SYS_DATA_W-1:0]   HRDATA,           // AHB read-data
-        output  wire                    HRESP,            // AHB response
-        output  wire                    HREADYOUT         // AHB ready out
-    );
+    // AHB connection to Initiator
+    input  wire                     HSEL,             // AHB region select
+    input  wire  [SYS_ADDR_W-1:0]   HADDR,            // AHB address
+    input  wire            [ 2:0]   HBURST,           // AHB burst
+    input  wire                     HMASTLOCK,        // AHB lock
+    input  wire            [ 3:0]   HPROT,            // AHB prot
+    input  wire            [ 2:0]   HSIZE,            // AHB size
+    input  wire            [ 1:0]   HTRANS,           // AHB transfer
+    input  wire  [SYS_DATA_W-1:0]   HWDATA,           // AHB write data
+    input  wire                     HWRITE,           // AHB write
+    input  wire                     HREADY,           // AHB ready
+    output  wire [SYS_DATA_W-1:0]   HRDATA,           // AHB read-data
+    output  wire                    HRESP,            // AHB response
+    output  wire                    HREADYOUT         // AHB ready out
+);
 
     // -------------------------------
     // System ROM Table
diff --git a/system/nanosoc_subsystems/dma/verilog/nanosoc_ss_dma.v b/system/nanosoc_subsystems/dma/verilog/nanosoc_ss_dma.v
index 673f7d6..5c835ce 100644
--- a/system/nanosoc_subsystems/dma/verilog/nanosoc_ss_dma.v
+++ b/system/nanosoc_subsystems/dma/verilog/nanosoc_ss_dma.v
@@ -20,6 +20,7 @@ module nanosoc_ss_dma #(
     // System AHB Clocks and Resets 
     input wire                           SYS_HCLK,
     input wire                           SYS_HRESETn,
+    input wire                           SYS_PCLKEN,          // APB clock enable
 
     // DMAC 0 AHB Lite Port
     output wire          [SYS_ADDR_W-1:0] DMAC_0_HADDR,       // Address bus
@@ -35,7 +36,6 @@ module nanosoc_ss_dma #(
     input  wire                           DMAC_0_HRESP,       // Transfer response
     
     // DMAC 0 APB Configurtation Port
-    input  wire                           DMAC_0_PCLKEN,      // APB clock enable
     input  wire                           DMAC_0_PSEL,        // APB peripheral select
     input  wire                           DMAC_0_PEN,         // APB transfer enable
     input  wire                           DMAC_0_PWRITE,      // APB transfer direction
@@ -62,7 +62,6 @@ module nanosoc_ss_dma #(
     input  wire                           DMAC_1_HRESP,       // Transfer response
     
     // DMAC 1 APB Configurtation Port
-    input  wire                           DMAC_1_PCLKEN,      // APB clock enable
     input  wire                           DMAC_1_PSEL,        // APB peripheral select
     input  wire                           DMAC_1_PEN,         // APB transfer enable
     input  wire                           DMAC_1_PWRITE,      // APB transfer direction
@@ -86,8 +85,8 @@ module nanosoc_ss_dma #(
         .CHANNEL_NUM (DMAC_0_CHANNEL_NUM)
     ) u_dmac_0 (
         // AHB Clocks and Resets
-        .HCLK(DMAC_0_HCLK),
-        .HRESETn(DMAC_0_HRESETn),
+        .HCLK(SYS_HCLK),
+        .HRESETn(SYS_HRESETn),
 
         // AHB Lite Port
         .HADDR(DMAC_0_HADDR),
@@ -103,7 +102,7 @@ module nanosoc_ss_dma #(
         .HRESP(DMAC_0_HRESP),
 
         // APB Configuration Port
-        .PCLKEN(DMAC_0_PCLKEN),
+        .PCLKEN(SYS_PCLKEN),
         .PSEL(DMAC_0_PSEL),
         .PEN(DMAC_0_PEN),
         .PWRITE(DMAC_0_PWRITE),
diff --git a/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v b/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
new file mode 100644
index 0000000..d4bddaf
--- /dev/null
+++ b/system/nanosoc_subsystems/systemctrl/verilog/nanosoc_ss_systemctrl.v
@@ -0,0 +1,350 @@
+//-----------------------------------------------------------------------------
+// NanoSoC System Control and Peripheral Subsystem
+// - Contains Clock Control, Pin Mux, System Peripherals and System ROM table
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.masptone@soton.ac.uk)
+//
+// Copyright (C) 2023, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module nanosoc_ss_systemctrl #(
+    parameter    SYS_ADDR_W    = 32,  // System Address Width
+    parameter    SYS_DATA_W    = 32,  // System Data Width
+    parameter    APB_ADDR_W    = 12,  // APB Peripheral Address Width
+    parameter    APB_DATA_W    = 32,  // APB Peripheral Data Width
+    
+    parameter    SYSTABLE_BASE = 32'hf000_0000,   // Base Address of System ROM Table
+    
+    parameter    CLKGATE_PRESENT = 0
+)(
+    // Free-running and Crystal Clock Output
+    output wire                   SYS_FCLK,             // Free-running system clock
+    output wire                   SYS_XTALCLK_OUT,      // Crystal Clock Output
+    
+    // System Input Clocks and Resets
+    input  wire                   SYS_PORESETn,         // Power-On-Reset reset (active-low)
+    input  wire                   SYS_TESTMODE,         // Reset bypass in scan test
+    input  wire                   SYS_HCLK,             // AHB clock
+    input  wire                   SYS_HRESETn,          // AHB reset (active-low)
+
+    // SYSIO AHB interface
+    input  wire                   SYSIO_HSEL,           // AHB region select
+    input  wire  [SYS_ADDR_W-1:0] SYSIO_HADDR,          // AHB address
+    input  wire            [ 2:0] SYSIO_HBURST,         // AHB burst
+    input  wire                   SYSIO_HMASTLOCK,      // AHB lock
+    input  wire            [ 3:0] SYSIO_HPROT,          // AHB prot
+    input  wire            [ 2:0] SYSIO_HSIZE,          // AHB size
+    input  wire            [ 1:0] SYSIO_HTRANS,         // AHB transfer
+    input  wire  [SYS_DATA_W-1:0] SYSIO_HWDATA,         // AHB write data
+    input  wire                   SYSIO_HWRITE,         // AHB write
+    input  wire                   SYSIO_HREADY,         // AHB ready
+    output  wire [SYS_DATA_W-1:0] SYSIO_HRDATA,         // AHB read-data
+    output  wire                  SYSIO_HRESP,          // AHB response
+    output  wire                  SYSIO_HREADYOUT,      // AHB ready out
+    
+    // System ROM Table AHB interface
+    input  wire                   SYSTABLE_HSEL,           // AHB region select
+    input  wire  [SYS_ADDR_W-1:0] SYSTABLE_HADDR,          // AHB address
+    input  wire            [ 2:0] SYSTABLE_HBURST,         // AHB burst
+    input  wire                   SYSTABLE_HMASTLOCK,      // AHB lock
+    input  wire            [ 3:0] SYSTABLE_HPROT,          // AHB prot
+    input  wire            [ 2:0] SYSTABLE_HSIZE,          // AHB size
+    input  wire            [ 1:0] SYSTABLE_HTRANS,         // AHB transfer
+    input  wire  [SYS_DATA_W-1:0] SYSTABLE_HWDATA,         // AHB write data
+    input  wire                   SYSTABLE_HWRITE,         // AHB write
+    input  wire                   SYSTABLE_HREADY,         // AHB ready
+    output  wire [SYS_DATA_W-1:0] SYSTABLE_HRDATA,         // AHB read-data
+    output  wire                  SYSTABLE_HRESP,          // AHB response
+    output  wire                  SYSTABLE_HREADYOUT,      // AHB ready out
+
+    // APB clocking control
+    output wire                   SYS_PCLK,             // Peripheral clock
+    output wire                   SYS_PCLKG,            // Gated Peripheral bus clock
+    output wire                   SYS_PRESETn,          // Peripheral system and APB reset
+    output wire                   SYS_PCLKEN,           // Clock divide control for AHB to APB bridge
+
+    // APB external Slave Interfaces
+    output wire                   SYSIO_PENABLE,
+    output wire                   SYSIO_PWRITE,
+    output wire  [APB_ADDR_W-1:0] SYSIO_PADDR,
+    output wire  [APB_DATA_W-1:0] SYSIO_PWDATA,
+    
+    output wire                   USRT_PSEL,
+    input  wire  [APB_DATA_W-1:0] USRT_PRDATA,
+    input  wire                   USRT_PREADY,
+    input  wire                   USRT_PSLVERR,
+    
+    output wire                   DMAC_0_PSEL,
+    input  wire  [APB_DATA_W-1:0] DMAC_0_PRDATA,
+    input  wire                   DMAC_0_PREADY,
+    input  wire                   DMAC_0_PSLVERR,
+    
+    output wire                   DMAC_1_PSEL,
+    input  wire  [APB_DATA_W-1:0] DMAC_1_PRDATA,
+    input  wire                   DMAC_1_PREADY,
+    input  wire                   DMAC_1_PSLVERR,
+
+    // CPU sideband signalling
+    output wire                   SYS_NMI,          // watchdog_interrupt;
+    output wire           [31:0]  SYS_APB_IRQ,      // apbsubsys_interrupt;
+    output wire           [15:0]  SYS_GPIO0_IRQ,    // GPIO 0 IRQs
+    output wire           [15:0]  SYS_GPIO1_IRQ,    // GPIO 0 IRQs
+
+    // 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
+    
+    // System Reset Request Signals
+    output wire                   SYS_SYSRESETREQ,       // System Request from System Managers
+    input  wire                   SYS_PRMURESETREQ,      // CPU Control Reset Request (PMU and Reset Unit)
+    
+    // Power Management Control and Status
+    output wire                   SYS_PMUENABLE,        // System Controller cfg - Enable PMU
+    input  wire                   SYS_PMUDBGRESETREQ,   // Power Management Debug Reset Req
+    
+    // CPU Status Signals
+    input  wire                   CPU_0_LOCKUP,           // Processor status - Locked up
+    input  wire                   CPU_0_SLEEPING,
+    input  wire                   CPU_0_SLEEPDEEP,
+  
+    // 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)
+);
+    // -------------------------------
+    // Internal Wiring
+    // -------------------------------
+    wire apbactive;
+    
+    wire uart0_rxd;        // Uart 0 receive data
+    wire uart0_txd;        // Uart 0 transmit data
+    wire uart0_txen;       // Uart 0 transmit data enable
+    wire uart1_rxd;        // Uart 1 receive data
+    wire uart1_txd;        // Uart 1 transmit data
+    wire uart1_txen;       // Uart 1 transmit data enable
+    wire uart2_rxd;        // Uart 2 receive data
+    wire uart2_txd;        // Uart 2 transmit data
+    wire uart2_txen;       // Uart 2 transmit data enable
+    wire timer0_extin;     // Timer 0 external input
+    wire timer1_extin;     // Timer 1 external input
+    
+    // -------------------------------
+    // NanoSoC Clock Control Instantiation
+    // -------------------------------
+    nanosoc_clkctrl #(
+        .CLKGATE_PRESENT  (CLKGATE_PRESENT)
+    ) u_clkctrl(
+        // inputs
+        .XTAL1            (SYS_CLK),
+        .NRST             (SYS_SYSRESETn),
+
+        .APBACTIVE        (apbactive),
+        .SLEEPING         (CPU_0_SLEEPING),
+        .SLEEPDEEP        (CPU_0_SLEEPDEEP),
+        .LOCKUP           (CPU_0_LOCKUP),
+        .LOCKUPRESET      (CPU_0_LOCKUPRESET),
+        .SYSRESETREQ      (SYS_PRMURESETREQ),
+        .DBGRESETREQ      (SYS_PMUDBGRESETREQ),
+        .CGBYPASS         (SYS_TESTMODE),
+        .RSTBYPASS        (SYS_TESTMODE),
+
+        // outputs
+        .XTAL2            (SYS_XTALCLK_OUT),
+
+        .FCLK             (SYS_FCLK),
+
+        .PCLK             (SYS_PCLK),
+        .PCLKG            (SYS_PCLKG),
+        .PCLKEN           (SYS_PCLKEN),
+        .PRESETn          (SYS_PRESETn)
+    );
+    
+    // -------------------------------
+    // NanoSoC Pin Mux Instantiation
+    // -------------------------------
+    nanosoc_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         ( ),
+
+        // IO pads
+        .p1_out_mux       (P1_OUT_MUX),
+        .p1_out_en_mux    (P1_OUT_EN_MUX),
+        .P0               ( ), //P0),
+        .P1               ( ), //P1),
+
+        .nTRST            (1'b1),  // 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
+    );
+    
+    // -------------------------------
+    // SYSIO Region Instantiation
+    // -------------------------------
+    nanosoc_region_sysio #(
+        .SYS_ADDR_W(SYS_ADDR_W),
+        .SYS_DATA_W(SYS_DATA_W),
+        .APB_ADDR_W(APB_ADDR_W),
+        .APB_DATA_W(APB_DATA_W)
+    ) u_region_sysio (
+        // Clock and Reset
+        .FCLK(SYS_FCLK),
+        .PORESETn(SYS_PORESETn),
+        .TESTMODE(SYS_TESTMODE),
+
+        // AHB interface
+        .HCLK(SYSIO_SYS_HCLK),
+        .HRESETn(SYSIO_SYS_HRESETn),
+        .HSEL(SYSIO_HSEL),
+        .HADDR(SYSIO_HADDR),
+        .HBURST(SYSIO_HBURST),
+        .HMASTLOCK(SYSIO_HMASTLOCK),
+        .HPROT(SYSIO_HPROT),
+        .HSIZE(SYSIO_HSIZE),
+        .HTRANS(SYSIO_HTRANS),
+        .HWDATA(SYSIO_HWDATA),
+        .HWRITE(SYSIO_HWRITE),
+        .HREADY(SYSIO_HREADY),
+        .HRDATA(SYSIO_HRDATA),
+        .HRESP(SYSIO_HRESP),
+        .HREADYOUT(SYSIO_HREADYOUT),
+
+        // APB clocking control
+        .PCLK(SYS_PCLK),
+        .PCLKG(SYS_PCLKG),
+        .PRESETn(SYS_PRESETn),
+        .PCLKEN(SYS_PCLKEN),
+
+        // APB external Slave Interface
+        .exp12_psel(DMAC_1_PSEL),
+        .exp13_psel(),
+        .exp14_psel(USRT_PSEL),
+        .exp15_psel(DMAC_0_PSEL),
+        .exp_penable(SYSIO_PENABLE),
+        .exp_pwrite(SYSIO_PWRITE),
+        .exp_paddr(SYSIO_PADDR),
+        .exp_pwdata(SYSIO_PWDATA),
+        .exp12_prdata(DMAC_1_PRDATA),
+        .exp12_pready(DMAC_1_PREADY),
+        .exp12_pslverr(DMAC_1_PSLVERR),
+        .exp13_prdata({APB_ADDR_W{1'b0}}),
+        .exp13_pready(1'b1),
+        .exp13_pslverr(1'b1),
+        .exp14_prdata(USRT_PRDATA),
+        .exp14_pready(USRT_PREADY),
+        .exp14_pslverr(USRT_PSLVERR),
+        .exp15_prdata(DMAC_0_PRDATA),
+        .exp15_pready(DMAC_0_PREADY),
+        .exp15_pslverr(DMAC_0_PSLVERR),
+
+        // CPU sideband signaling
+        .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
+        .REMAP_CTRL(SYS_REMAP_CTRL),
+        .APBACTIVE(apbactive),
+        .SYSRESETREQ(SYS_SYSRESETREQ),
+        .WDOGRESETREQ(SYS_WDOGRESETREQ),
+        .LOCKUP(CPU_0_LOCKUP),
+        .LOCKUPRESET(CPU_0_LOCKUPRESET),
+        .PMUENABLE(SYS_PMUENABLE),
+
+        // IO signaling
+        .uart0_rxd(uart1_txd), // crossover
+        .uart0_txd(uart0_txd),
+        .uart0_txen(uart0_txen),
+        .uart1_rxd(uart0_txd),  // 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
+        .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)
+    );
+
+    // --------------------------------------
+    // System ROM Table Region Instantiation
+    // --------------------------------------
+    nanosoc_region_systable #(
+        .SYS_ADDR_W(SYS_ADDR_W),
+        .SYS_DATA_W(SYS_DATA_W),
+        .SYSTABLE_BASE(SYSTABLE_BASE)
+    ) u_region_systable (
+        // Clock and Reset
+        .HCLK(SYS_HCLK),
+        .HRESETn(SYS_HRESETn),
+
+        // AHB connection to Initiator
+        .HSEL(SYSTABLE_HSEL),
+        .HADDR(SYSTABLE_HADDR),
+        .HBURST(SYSTABLE_HBURST),
+        .HMASTLOCK(SYSTABLE_HMASTLOCK),
+        .HPROT(SYSTABLE_HPROT),
+        .HSIZE(SYSTABLE_HSIZE),
+        .HTRANS(SYSTABLE_HTRANS),
+        .HWDATA(SYSTABLE_HWDATA),
+        .HWRITE(SYSTABLE_HWRITE),
+        .HREADY(SYSTABLE_HREADY),
+        .HRDATA(SYSTABLE_HRDATA),
+        .HRESP(SYSTABLE_HRESP),
+        .HREADYOUT(SYSTABLE_HREADYOUT)
+    );
+endmodule
\ No newline at end of file
-- 
GitLab