From 34fab012317556651f1de4debf369a8f3db6330b Mon Sep 17 00:00:00 2001
From: David Mapstone <david@mapstone.me>
Date: Mon, 20 Mar 2023 15:22:12 +0000
Subject: [PATCH] SOC1-141: Added data request module to ahb packet constructor
 module

---
 flist/wrapper_ip.flist                    |  3 +
 hdl/src/wrapper_ahb_packet_constructor.sv | 37 +++++++++-
 hdl/src/wrapper_ahb_reg_interface.sv      | 10 ++-
 hdl/src/wrapper_data_req.sv               | 85 +++++++++++++++++++++++
 hdl/src/wrapper_packet_construct.sv       |  8 ++-
 5 files changed, 136 insertions(+), 7 deletions(-)
 create mode 100644 hdl/src/wrapper_data_req.sv

diff --git a/flist/wrapper_ip.flist b/flist/wrapper_ip.flist
index 94c2907..3ef4523 100644
--- a/flist/wrapper_ip.flist
+++ b/flist/wrapper_ip.flist
@@ -19,6 +19,9 @@
 -y $(ACC_WRAPPER_DIR)/hdl/src/
 +incdir+$(ACC_WRAPPER_DIR)/hdl/src/
 
+$(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_packet_constructor.sv
+
+$(ACC_WRAPPER_DIR)/hdl/src/wrapper_data_req.sv
 $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_reg_interface.sv
 $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_vr_interface.sv
 $(ACC_WRAPPER_DIR)/hdl/src/wrapper_packet_construct.sv
diff --git a/hdl/src/wrapper_ahb_packet_constructor.sv b/hdl/src/wrapper_ahb_packet_constructor.sv
index b0e4507..65d3f83 100644
--- a/hdl/src/wrapper_ahb_packet_constructor.sv
+++ b/hdl/src/wrapper_ahb_packet_constructor.sv
@@ -8,7 +8,7 @@
 //
 // Copyright  2023, SoC Labs (www.soclabs.org)
 //-----------------------------------------------------------------------------
-module wrapper_ahb_interface #(
+module wrapper_ahb_packet_constructor #(
   //parameter for address width
   parameter   ADDRWIDTH=11,
   parameter   PACKETWIDTH=512
@@ -33,7 +33,10 @@ module wrapper_ahb_interface #(
   output logic [PACKETWIDTH-1:0] packet_data,
   output logic                   packet_data_last,
   output logic                   packet_data_valid,
-  input  logic                   packet_data_ready
+  input  logic                   packet_data_ready,
+
+  // Data Request Signal
+  output logic                   data_req
  );
 
  // Register Interface Connections
@@ -46,6 +49,9 @@ module wrapper_ahb_interface #(
  logic                  wready;
  logic                  rready;
 
+ // Engine Ready for more Data
+ logic engine_ready;
+
  // AHB Interface Instantiation
  wrapper_ahb_reg_interface #(
     ADDRWIDTH
@@ -77,6 +83,28 @@ module wrapper_ahb_interface #(
     .rready      (rready)
  );
 
+ // Data Request Signal Generator
+ wrapper_data_req #(
+    ADDRWIDTH,  // Only half address map allocated to this device
+    512         // Packet Width
+  ) u_wrapper_data_req (
+    .hclk           (hclk),
+    .hresetn        (hresetn),
+
+    // AHB Address Phase Signaling
+    .hsels          (hsels),
+    .haddrs         (haddrs),
+    .htranss        (htranss),
+    .hreadys        (hreadys),
+
+    // Engine Data Ready Signal
+    .engine_ready   (engine_ready),
+
+    // Data Request Signal 
+    .data_req       (data_req)
+ );
+ 
+ // Valid/Ready Packet Generator
  wrapper_packet_construct #(
     ADDRWIDTH,  // Only half address map allocated to this device
     512         // Packet Width
@@ -98,6 +126,9 @@ module wrapper_ahb_interface #(
     .packet_data       (packet_data),
     .packet_data_last  (packet_data_last),
     .packet_data_valid (packet_data_valid),
-    .packet_data_ready (packet_data_ready)
+    .packet_data_ready (packet_data_ready),
+
+    // Data Request 
+    .engine_ready      (engine_ready)
   );
 endmodule
\ No newline at end of file
diff --git a/hdl/src/wrapper_ahb_reg_interface.sv b/hdl/src/wrapper_ahb_reg_interface.sv
index 4239ac6..e4345b2 100644
--- a/hdl/src/wrapper_ahb_reg_interface.sv
+++ b/hdl/src/wrapper_ahb_reg_interface.sv
@@ -67,12 +67,13 @@ module wrapper_ahb_reg_interface #(
 
   // ----------------------------------------
   // Internal logics declarations
-   logic                   trans_req= hreadys & hsels & htranss[1];
+   logic                   trans_req;
+   assign                  trans_req = hreadys & hsels & htranss[1];
     // transfer request issued only in SEQ and NONSEQ status and slave is
     // selected and last transfer finish
 
-   logic                   ahb_read_req  = trans_req & (~hwrites);// AHB read request
-   logic                   ahb_write_req = trans_req &  hwrites;  // AHB write request
+   logic                   ahb_read_req;// AHB read request
+   logic                   ahb_write_req;  // AHB write request
    logic                   update_read_req;    // To update the read enable register
    logic                   update_write_req;   // To update the write enable register
 
@@ -86,6 +87,9 @@ module wrapper_ahb_reg_interface #(
    logic  [1:0]             haddrs_byte_sel; // Select which byte to enable
    logic                    haddrs_halfword_sel; // Select which byte to enable
 
+   assign                  ahb_read_req  = trans_req & (~hwrites);
+   assign                  ahb_write_req = trans_req &  hwrites; 
+   
    assign haddrs_byte_sel     = haddrs[1:0];
    assign haddrs_halfword_sel = haddrs[1];
   //-----------------------------------------------------------
diff --git a/hdl/src/wrapper_data_req.sv b/hdl/src/wrapper_data_req.sv
new file mode 100644
index 0000000..39801e4
--- /dev/null
+++ b/hdl/src/wrapper_data_req.sv
@@ -0,0 +1,85 @@
+//-----------------------------------------------------------------------------
+// SoC Labs AHB Wrapper Write Ready Generator
+// - Adapted from ARM AHB-lite example slave interface module.
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+//
+// Copyright  2023, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Looks for last word address of packet during address phase 
+//            to de-assert accelerator ready signal.
+//-----------------------------------------------------------------------------
+module wrapper_data_req #(
+  parameter   ADDRWIDTH=11,
+  parameter   PACKETWIDTH=512
+)(
+  input  logic                  hclk,       // clock
+  input  logic                  hresetn,    // reset
+
+  // AHB connection to master (Address-phase signals only)
+  input  logic                  hsels,
+  input  logic [ADDRWIDTH-1:0]  haddrs,
+  input  logic [1:0]            htranss,
+  input  logic                  hreadys,
+
+  // Engine Hungry Signal
+  input  logic                  engine_ready,
+
+  // Connection to wrapper
+  output logic                  data_req
+);
+
+localparam REGDWIDTH       = 32; // Register Data Width
+localparam PACKETBYTEWIDTH = $clog2(PACKETWIDTH/8); // Number of Bytes in Packet
+localparam REGDBYTEWIDTH   = $clog2(REGDWIDTH/8); // Number of Bytes in Register Data Word
+
+logic trans_req;
+assign trans_req  = hreadys & hsels & htranss[1];
+
+// Check if current address is last word in packet
+logic packet_last_word;
+assign packet_last_word = &haddrs[PACKETBYTEWIDTH-1:REGDBYTEWIDTH];
+
+// If engine_ready => data_req EXCEPT if current address is last address
+logic engine_ready_reg;
+logic data_req_latched;
+
+always_ff @(posedge hclk or negedge hresetn) begin
+    if (~hresetn) begin
+        engine_ready_reg <= 1'b0;
+        data_req_latched <= 1'b0;
+    end else begin
+        // Buffer engine ready signal to determine state change
+        engine_ready_reg <= engine_ready;
+        // Latch data request signal once seen last address of packet
+        if (trans_req && packet_last_word && engine_ready) begin
+            // Latch data request signal
+            data_req_latched <= 1'b1;
+        // Unlatch when latched and data phase finished
+        end else if (data_req_latched && hreadys) begin
+            // Unlatch data request signal
+            data_req_latched <= 1'b0;
+        end
+    end
+end
+
+always_comb begin
+    if (~engine_ready_reg) begin
+        // If engine ready is transitioning from low to high
+        data_req = engine_ready;
+    end else begin
+        // If seeing last word of packet address and valid transfer request
+        if ((trans_req && packet_last_word) || data_req_latched) begin
+            // Drop data request signal after address phase of last word in packet
+            data_req = 1'b0;
+        end else begin
+            // After data phase, take value of engine ready
+            data_req = engine_ready;
+        end
+    end
+end
+endmodule
\ No newline at end of file
diff --git a/hdl/src/wrapper_packet_construct.sv b/hdl/src/wrapper_packet_construct.sv
index 792b7c5..a0fb999 100644
--- a/hdl/src/wrapper_packet_construct.sv
+++ b/hdl/src/wrapper_packet_construct.sv
@@ -30,7 +30,10 @@ module  wrapper_packet_construct #(
   output logic [PACKETWIDTH-1:0] packet_data,
   output logic                   packet_data_last,
   output logic                   packet_data_valid,
-  input  logic                   packet_data_ready
+  input  logic                   packet_data_ready,
+
+  // Data Input Request
+  output logic                   engine_ready
 );
 
 localparam REGDWIDTH       = 32; // Register Data Width
@@ -71,6 +74,9 @@ logic packet_addr_last, prev_packet_addr_last;
 assign packet_addr_last      = &packet_addr;
 assign prev_packet_addr_last = &prev_packet_addr;
 
+// Engine Ready Assignment
+assign engine_ready = packet_data_ready;
+
 // Write data out when either:
 // - Word is last address of current packet
 // - Address Moved to address of different packet
-- 
GitLab