From 30189bdf67d6ba35c633ad439eaeb2f819098769 Mon Sep 17 00:00:00 2001
From: dam1n19 <dam1n19@soton.ac.uk>
Date: Thu, 6 Apr 2023 16:17:15 +0100
Subject: [PATCH] Added example APB regsiters into top level wrapper

---
 flist/apb_ip.flist                     |  27 +++++
 wrapper/src/wrapper_secworks_sha256.sv | 159 +++++++++++++++++++++----
 2 files changed, 160 insertions(+), 26 deletions(-)
 create mode 100644 flist/apb_ip.flist

diff --git a/flist/apb_ip.flist b/flist/apb_ip.flist
new file mode 100644
index 0000000..593cf11
--- /dev/null
+++ b/flist/apb_ip.flist
@@ -0,0 +1,27 @@
+//-----------------------------------------------------------------------------
+// Accelerator Wrapper CMSDK 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 Accelerator CMSDK AHB IP
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    Accelerator Module search path    =============
+-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_apb/verilog
+-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb3_eg_slave/verilog
++incdir+(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_apb/verilog
++incdir+(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb3_eg_slave/verilog
+
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_apb/verilog/cmsdk_ahb_to_apb.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb3_eg_slave/verilog/cmsdk_apb3_eg_slave_interface.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb3_eg_slave/verilog/cmsdk_apb3_eg_slave_reg.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb3_eg_slave/verilog/cmsdk_apb3_eg_slave.v
diff --git a/wrapper/src/wrapper_secworks_sha256.sv b/wrapper/src/wrapper_secworks_sha256.sv
index b271dd0..474e8f4 100644
--- a/wrapper/src/wrapper_secworks_sha256.sv
+++ b/wrapper/src/wrapper_secworks_sha256.sv
@@ -48,14 +48,18 @@ module wrapper_secworks_sha256 #(
 
   // Input Port Parameters
   localparam [AHBADDRWIDTH-1:0] INPORTADDR         = 'h000;
-  localparam                    INPORTAHBADDRWIDTH = AHBADDRWIDTH - 1;
+  localparam                    INPORTAHBADDRWIDTH = AHBADDRWIDTH - 2;
 
   // Output Port Parameters
-  localparam [AHBADDRWIDTH-1:0] OUTPORTADDR         = 'h800;
-  localparam                    OUTPORTAHBADDRWIDTH = AHBADDRWIDTH - 1;
+  localparam [AHBADDRWIDTH-1:0] OUTPORTADDR         = 'h400;
+  localparam                    OUTPORTAHBADDRWIDTH = AHBADDRWIDTH - 2;
 
   localparam OUTPACKETBYTEWIDTH  = $clog2(OUTPACKETWIDTH/8);            // Number of Bytes in Packet
   localparam OUTPACKETSPACEWIDTH = OUTPORTAHBADDRWIDTH-OUTPACKETBYTEWIDTH; // Number of Bits to represent all Packets in Address Space
+
+  // Control and Status Register Parameters
+  localparam [AHBADDRWIDTH-1:0] CSRADDR         = 'h800;
+  localparam                    CSRADDRWIDTH    = AHBADDRWIDTH - 2;
   
   //**********************************************************
   // Wrapper AHB Components
@@ -77,16 +81,23 @@ module wrapper_secworks_sha256 #(
   logic             hresp1;
   logic [31:0]      hrdata1;
 
-  // AHB Target 2 - Default Target
+  // AHB Target 2 - CSRs 
   logic             hsel2;
   logic             hreadyout2;
   logic             hresp2;
   logic [31:0]      hrdata2;
 
+  // AHB Target 3 - Default Target
+  logic             hsel3;
+  logic             hreadyout3;
+  logic             hresp3;
+  logic [31:0]      hrdata3;
+
   // Internal AHB Address Assignment
   assign hsel0 = ((HADDRS < OUTPORTADDR) && (HADDRS >= INPORTADDR)) ? 1'b1:1'b0; // Input Port Select
-  assign hsel1 = (HADDRS >= OUTPORTADDR) ? 1'b1:1'b0;                            // Output Port Select
-  assign hsel2 = (hsel0 | hsel1) ? 1'b0:1'b1;                                    // Default Target Select
+  assign hsel1 = ((HADDRS < CSRADDR) && (HADDRS >= OUTPORTADDR)) ? 1'b1:1'b0; // Output Port Select
+  assign hsel2 = (HADDRS >= CSRADDR) ? 1'b1:1'b0;                                // CSR Select
+  assign hsel3 = (hsel0 | hsel1 | hsel2) ? 1'b0:1'b1;                            // Default Target Select
 
   // AHB Target Multiplexer
   cmsdk_ahb_slave_mux  #(
@@ -116,10 +127,10 @@ module wrapper_secworks_sha256 #(
     .HREADYOUT2  (hreadyout2),
     .HRESP2      (hresp2),
     .HRDATA2     (hrdata2),
-    .HSEL3       (1'b0),      // Input Port 3
-    .HREADYOUT3  (),
-    .HRESP3      (),
-    .HRDATA3     (),
+    .HSEL3       (hsel3),     // Input Port 3
+    .HREADYOUT3  (hreadyout3),
+    .HRESP3      (hresp3),
+    .HRDATA3     (hrdata3),
     .HSEL4       (1'b0),      // Input Port 4
     .HREADYOUT4  (),
     .HRESP4      (),
@@ -170,7 +181,7 @@ module wrapper_secworks_sha256 #(
 
     // Input slave port: 32 bit data bus interface
     .hsels        (hsel0),
-    .haddrs       (HADDRS[AHBADDRWIDTH-2:0]),
+    .haddrs       (HADDRS[INPORTAHBADDRWIDTH-1:0]),
     .htranss      (HTRANSS),
     .hsizes       (HSIZES),
     .hwrites      (HWRITES),
@@ -235,7 +246,7 @@ module wrapper_secworks_sha256 #(
 
     // Input slave port: 32 bit data bus interface
     .hsels        (hsel1),
-    .haddrs       (HADDRS[AHBADDRWIDTH-2:0]),
+    .haddrs       (HADDRS[OUTPORTAHBADDRWIDTH-1:0]),
     .htranss      (HTRANSS),
     .hsizes       (HSIZES),
     .hwrites      (HWRITES),
@@ -260,6 +271,112 @@ module wrapper_secworks_sha256 #(
    .block_read_addr           (block_read_addr)
   );
 
+  //----------------------------------------------------------
+  // Wrapper Control and Staus Registers
+  //----------------------------------------------------------
+
+  // CSR APB wiring logic
+  logic [CSRADDRWIDTH-1:0] CSRPADDR;
+  logic                    CSRPENABLE;
+  logic                    CSRPWRITE;
+  logic [3:0]              CSRPSTRB;
+  logic [2:0]              CSRPPROT;
+  logic [31:0]             CSRPWDATA;
+  logic                    CSRPSEL;
+
+  logic                    CSRAPBACTIVE;
+  logic [31:0]             CSRPRDATA;
+  logic                    CSRPREADY;
+  logic                    CSRPSLVERR;
+
+  // CSR register wiring logic
+  logic  [CSRADDRWIDTH-1:0] csr_reg_addr;
+  logic                     csr_reg_read_en;
+  logic                     csr_reg_write_en;
+  logic  [31:0]             csr_reg_wdata;
+  logic  [31:0]             csr_reg_rdata;
+
+  // AHB to APB Bridge
+  cmsdk_ahb_to_apb #(
+    CSRADDRWIDTH
+  ) u_csr_ahb_apb_bridge (
+    .HCLK       (HCLK),    // Clock
+    .HRESETn    (HRESETn), // Reset
+    .PCLKEN     (1'b1),    // APB clock enable signal
+    
+    .HSEL       (hsel2),      // Device select
+    .HADDR,     (HADDRS[CSRADDRWIDTH-1:0])   // Address
+    .HTRANS     (HTRANSS),    // Transfer control
+    .HSIZE      (HSIZES),     // Transfer size
+    .HPROT      (4'b1111),    // Protection control
+    .HWRITE     (HWRITES),    // Write control
+    .HREADY,    (HREADYS)     // Transfer phase done
+    .HWDATA     (HWDATAS),    // Write data
+
+    .HREADYOUT  (hreadyout2), // Device ready
+    .HRDATA     (hrdata2),    // Read data output
+    .HRESP      (hresp2),     // Device response
+    
+    // APB Output
+    .PADDR     (CSRPADDR),      // APB Address
+    .PENABLE   (CSRPENABLE),    // APB Enable
+    .PWRITE    (CSRPWRITE),     // APB Write
+    .PSTRB     (CSRPSTRB),      // APB Byte Strobe
+    .PPROT     (CSRPPROT),      // APB Prot
+    .PWDATA    (CSRPWDATA),     // APB write data
+    .PSEL      (CSRPSEL),       // APB Select
+
+    .APBACTIVE (CSRAPBACTIVE),  // APB bus is active, for clock gating
+    // of APB bus
+
+    // APB Input
+    .PRDATA    (CSRPRDATA),    // Read data for each APB slave
+    .PREADY    (CSRPREADY),    // Ready for each APB slave
+    .PSLVERR   (CSRPSLVERR)    // Error state for each APB slave
+  );  
+
+  // APB to Register Interface
+  cmsdk_apb3_eg_slave_interface #(
+    CSRADDRWIDTH
+  ) u_csr_reg_inf (
+
+    .pclk            (HCLK),     // pclk
+    .presetn         (HRESETn),  // reset
+
+    .psel            (CSRPSEL),     // apb interface inputs
+    .paddr           (CSRPADDR),
+    .penable         (CSRPENABLE),
+    .pwrite          (CSRPWRITE),
+    .pwdata          (CSRPWDATA),
+
+    .prdata          (CSRPRDATA),   // apb interface outputs
+    .pready          (CSRPREADY),
+    .pslverr         (CSRPSLVERR),
+
+    // Register interface
+    .addr            (csr_reg_addr),
+    .read_en         (csr_reg_read_en),
+    .write_en        (csr_reg_write_en),
+    .wdata           (csr_reg_wdata),
+    .rdata           (csr_reg_rdata)
+  );
+
+  // Example Register Block
+  cmsdk_apb3_eg_slave_reg #(
+    CSRADDRWIDTH
+  ) u_csr_block (
+    .pclk            (HCLK),
+    .presetn         (HRESETn),
+
+    // Register interface
+    .addr            (csr_reg_addr),
+    .read_en         (csr_reg_read_en),
+    .write_en        (csr_reg_write_en),
+    .wdata           (csr_reg_wdata),
+    .ecorevnum       (4'd0),
+    .rdata           (csr_reg_rdata)
+  );
+
   //----------------------------------------------------------
   // Default AHB Target Logic
   //----------------------------------------------------------
@@ -268,25 +385,15 @@ module wrapper_secworks_sha256 #(
   cmsdk_ahb_default_slave  u_ahb_default_slave(
     .HCLK         (HCLK),
     .HRESETn      (HRESETn),
-    .HSEL         (hsel2),
+    .HSEL         (hsel3),
     .HTRANS       (HTRANSS),
     .HREADY       (HREADYS),
-    .HREADYOUT    (hreadyout2),
-    .HRESP        (hresp2)
+    .HREADYOUT    (hreadyout3),
+    .HRESP        (hresp3)
   );
 
   // Default Targets Data is tied off
-  assign hrdata2 = {32{1'b0}};
-
-  //**********************************************************
-  // Wrapper APB Components
-  //**********************************************************
-
-  // TODO: Instantiate APB Mux
-
-  // TODO: Instantiate APB Default Target
-
-  // TODO: Wrapper Register Blocks
+  assign hrdata3 = {32{1'b0}};
 
   //**********************************************************
   // Wrapper Interrupt Generation
-- 
GitLab