From 8f88e7b4bb95f75052d0d4b658acf9814b096291 Mon Sep 17 00:00:00 2001
From: David Mapstone <david@mapstone.me>
Date: Wed, 22 Mar 2023 14:32:33 +0000
Subject: [PATCH] SOC1-122: Moved system files from nanosoc repo to top-level

---
 flist/system.flist                            |  22 +++
 flow/adp_verify.py                            |  95 ++++++++++
 nanosoc                                       |   2 +-
 .../socsim/nanosoc_sha256_hashing_stream.sh   |  19 ++
 system/src/nanosoc_exp.v                      | 166 ++++++++++++++++++
 5 files changed, 303 insertions(+), 1 deletion(-)
 create mode 100644 flist/system.flist
 create mode 100644 flow/adp_verify.py
 create mode 100755 simulate/socsim/nanosoc_sha256_hashing_stream.sh
 create mode 100644 system/src/nanosoc_exp.v

diff --git a/flist/system.flist b/flist/system.flist
new file mode 100644
index 0000000..968aee3
--- /dev/null
+++ b/flist/system.flist
@@ -0,0 +1,22 @@
+//-----------------------------------------------------------------------------
+// Accelerator System 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 Top-level Accelerator System
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    Accelerator Module search path    =============
+-y $(SOC_TOP_DIR)/system/src/
++incdir+$(SOC_TOP_DIR)/system/src/
+
+$(SOC_TOP_DIR)/system/src/nanosoc_exp.v
\ No newline at end of file
diff --git a/flow/adp_verify.py b/flow/adp_verify.py
new file mode 100644
index 0000000..f2122ba
--- /dev/null
+++ b/flow/adp_verify.py
@@ -0,0 +1,95 @@
+#-----------------------------------------------------------------------------
+# ADP Command File Verification Script
+# 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)
+#-----------------------------------------------------------------------------
+
+class address_region():
+    def __init__(self, base, size):
+        self.base = base
+        self.size = size
+        self.end = base + size - 4
+
+class read_word():
+    def __init__(self, index, region, address, read_data = 0,exp_data = 0):
+        self.index = index
+        self.region = region
+        self.address = int(str(address), 16)
+        self.read_data = int(str(read_data), 16)
+        self.exp_data = int(str(exp_data), 16)
+    
+    def validate(self):
+        if (self.address >= self.region.base and self.address <= self.region.end):
+            return True
+        else:
+            return False
+    
+    def check_address(self, address):
+        # print(f"self: {hex(self.address)} test: {address}")
+        if (self.address == int(str(address), 16)):
+            return True
+        else:
+            return False
+    
+    def set_read_data(self, read_data):
+        self.read_data = int(read_data, 16)
+
+    def set_exp_data(self, exp_data):
+        self.exp_data = int(exp_data, 16)
+    
+    def verify(self):
+        assert (self.read_data == self.exp_data)
+
+def adp_verify(adp_input, adp_output, out_log):
+    # Create Input Region for Accelerator
+    accel_input_port  = address_region(base = 0x6001_0000, size = 0x0000_0800)
+    accel_output_port = address_region(base = 0x6001_0800, size = 0x0000_0800)
+
+    word_list = []
+    temp_address_buf = 0x0
+
+    # Read in adp input
+    adp_input_lines = open(adp_input, "r").readlines()
+    idx = 0
+    for line in adp_input_lines:
+        line_split = str(line).split()
+        if len(line_split) > 1:
+            if line_split[0].lower() == "a":
+                # Capture Address
+                temp_address_buf = line_split[1]
+            if line_split[0].lower() == "r":
+                temp_read_word = read_word(idx, accel_output_port, temp_address_buf, exp_data = line_split[1])
+                if temp_read_word.validate():
+                    word_list.append(temp_read_word)
+                    idx += 1
+
+    # Read in adp output
+    adp_output_lines = open(adp_output, "r").readlines()
+    idx = 0
+    temp_address_buf = 0x0
+    for line in adp_output_lines:
+        line_split = str(line).split()
+        if len(line_split) > 1:
+            if line_split[0] == "]A":
+                # Capture Address
+                temp_address_buf = line_split[1]
+            if line_split[0] == "]R":
+                if word_list[idx].check_address(temp_address_buf):
+                    word_list[idx].set_read_data(line_split[1])
+                    idx += 1
+
+    # Perform Verification
+    for word in word_list:
+        word.verify()
+    print(f"Tests Passed on {len(word_list)} reads")
+
+if __name__ == "__main__":
+    adp_input = "ft1248_ip.log"
+    adp_output = "ft1248_op.log"
+    output_log = "verify.log"
+    adp_verify(adp_input,adp_output,output_log)
diff --git a/nanosoc b/nanosoc
index 6138eb0..20e2a3d 160000
--- a/nanosoc
+++ b/nanosoc
@@ -1 +1 @@
-Subproject commit 6138eb07a20f6394b39ea5f53f553a4300d8b6e4
+Subproject commit 20e2a3d1520f66949bee7efad07e4b61aa3741a0
diff --git a/simulate/socsim/nanosoc_sha256_hashing_stream.sh b/simulate/socsim/nanosoc_sha256_hashing_stream.sh
new file mode 100755
index 0000000..c3ce45f
--- /dev/null
+++ b/simulate/socsim/nanosoc_sha256_hashing_stream.sh
@@ -0,0 +1,19 @@
+#-----------------------------------------------------------------------------
+# SoC Labs Cadence Xcelium simulation script for engine testbench
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# David Mapstone (d.a.mapstone@soton.ac.uk)
+#
+# Copyright  2022, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+#!/usr/bin/env bash
+
+mkdir -p $SOC_TOP_DIR/simulate/sim/
+make run_xm \
+    TESTNAME=hello \
+    ACCELERATOR_VC="-sv -f $ACC_ENGINE_DIR/flist/sha-2-accelerator_src.flist -f $ACC_WRAPPER_DIR/flist/wrapper_ip.flist" \
+    ADP_FILE="$SOC_TOP_DIR/system/stimulus/adp_hash_stim.cmd" \
+    -C $NANOSOC_DIR/Cortex-M0/nanosoc/systems/mcu/rtl_sim
\ No newline at end of file
diff --git a/system/src/nanosoc_exp.v b/system/src/nanosoc_exp.v
new file mode 100644
index 0000000..229f756
--- /dev/null
+++ b/system/src/nanosoc_exp.v
@@ -0,0 +1,166 @@
+//-----------------------------------------------------------------------------
+// Nanosoc Expansion Region AHB Address Region
+// 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)
+//-----------------------------------------------------------------------------
+`include "cmsdk_ahb_default_slave.v"
+`include "cmsdk_ahb_slave_mux.v"
+
+module nanosoc_exp #(
+    parameter    ADDRWIDTH=29, // Region Address Width
+    parameter    ACCEL_ADDRWIDTH=12 // Region Address Width
+  )(
+    input  wire                  HCLK,       // Clock
+    input  wire                  HRESETn,    // Reset
+
+  // AHB connection to Initiator
+    input  wire                  HSELS,
+    input  wire  [ADDRWIDTH-1:0] HADDRS,
+    input  wire  [1:0]           HTRANSS,
+    input  wire  [2:0]           HSIZES,
+    input  wire                  HWRITES,
+    input  wire                  HREADYS,
+    input  wire  [31:0]          HWDATAS,
+
+    output wire                  HREADYOUTS,
+    output wire                  HRESPS,
+    output wire  [31:0]          HRDATAS
+  );
+
+//********************************************************************************
+// Internal Wires
+//********************************************************************************
+
+// Accelerator AHB Signals
+wire             HSEL0;
+wire             HREADYOUT0;
+wire             HRESP0;
+wire [31:0]      HRDATA0;
+
+// Default Slave AHB Signals
+wire             HSEL1;
+wire             HREADYOUT1;
+wire             HRESP1;
+wire [31:0]      HRDATA1;
+
+//********************************************************************************
+// Address decoder, need to be changed for other configuration
+//********************************************************************************
+// 0x00010000 - 0x00010FFF : HSEL #0 - Hash Accelerator
+// Other addresses         : HSEL #1 - Default target
+
+  assign HSEL0 = (HADDRS[ADDRWIDTH-1:12] == 'h00010) ? 1'b1:1'b0;
+  assign HSEL1 = HSEL0 ? 1'b0:1'b1;
+
+//********************************************************************************
+// Slave multiplexer module:
+//  multiplex the target signals to master, three ports are enabled
+//********************************************************************************
+
+cmsdk_ahb_slave_mux  #(
+   1, //PORT0_ENABLE
+   1, //PORT1_ENABLE
+   1, //PORT2_ENABLE
+   0, //PORT3_ENABLE
+   0, //PORT4_ENABLE
+   0, //PORT5_ENABLE
+   0, //PORT6_ENABLE
+   0, //PORT7_ENABLE
+   0, //PORT8_ENABLE
+   0  //PORT9_ENABLE  
+ ) u_ahb_slave_mux (
+  .HCLK        (HCLK),
+  .HRESETn     (HRESETn),
+  .HREADY      (HREADYS),
+  .HSEL0       (HSEL0),      // Input Port 0
+  .HREADYOUT0  (HREADYOUT0),
+  .HRESP0      (HRESP0),
+  .HRDATA0     (HRDATA0),
+  .HSEL1       (HSEL1),      // Input Port 1
+  .HREADYOUT1  (HREADYOUT1),
+  .HRESP1      (HRESP1),
+  .HRDATA1     (HRDATA1),
+  .HSEL2       (1'b0),      // Input Port 2
+  .HREADYOUT2  (),
+  .HRESP2      (),
+  .HRDATA2     (),
+  .HSEL3       (1'b0),      // Input Port 3
+  .HREADYOUT3  (),
+  .HRESP3      (),
+  .HRDATA3     (),
+  .HSEL4       (1'b0),      // Input Port 4
+  .HREADYOUT4  (),
+  .HRESP4      (),
+  .HRDATA4     (),
+  .HSEL5       (1'b0),      // Input Port 5
+  .HREADYOUT5  (),
+  .HRESP5      (),
+  .HRDATA5     (),
+  .HSEL6       (1'b0),      // Input Port 6
+  .HREADYOUT6  (),
+  .HRESP6      (),
+  .HRDATA6     (),
+  .HSEL7       (1'b0),      // Input Port 7
+  .HREADYOUT7  (),
+  .HRESP7      (),
+  .HRDATA7     (),
+  .HSEL8       (1'b0),      // Input Port 8
+  .HREADYOUT8  (),
+  .HRESP8      (),
+  .HRDATA8     (),
+  .HSEL9       (1'b0),      // Input Port 9
+  .HREADYOUT9  (),
+  .HRESP9      (),
+  .HRDATA9     (),
+
+  .HREADYOUT   (HREADYOUTS),     // Outputs
+  .HRESP       (HRESPS),
+  .HRDATA      (HRDATAS)
+  );
+
+
+//********************************************************************************
+// Slave module 1: Accelerator AHB target module
+//********************************************************************************
+  wrapper_sha256_hashing_stream #(ACCEL_ADDRWIDTH
+  ) accelerator (
+  .HCLK        (HCLK),
+  .HRESETn     (HRESETn),
+
+  //  Input target port: 32 bit data bus interface
+  .HSELS       (HSEL0),
+  .HADDRS      (HADDRS[ACCEL_ADDRWIDTH-1:0]),
+  .HTRANSS     (HTRANSS),
+  .HSIZES      (HSIZES),
+  .HWRITES     (HWRITES),
+  .HREADYS     (HREADYS),
+  .HWDATAS     (HWDATAS),
+
+  .HREADYOUTS  (HREADYOUT0),
+  .HRESPS      (HRESP0),
+  .HRDATAS     (HRDATA0)
+
+  );
+
+
+//********************************************************************************
+// Slave module 2: AHB default target module
+//********************************************************************************
+ cmsdk_ahb_default_slave  u_ahb_default_slave(
+  .HCLK         (HCLK),
+  .HRESETn      (HRESETn),
+  .HSEL         (HSEL1),
+  .HTRANS       (HTRANSS),
+  .HREADY       (HREADYS),
+  .HREADYOUT    (HREADYOUT1),
+  .HRESP        (HRESPS)
+  );
+
+ assign HRDATA1 = {32{1'b0}}; // Default target don't have data
+
+endmodule
-- 
GitLab