From 586383534848fe84a20b915c32bf40843190bbcd Mon Sep 17 00:00:00 2001
From: David Mapstone <david@mapstone.me>
Date: Mon, 20 Mar 2023 16:48:53 +0000
Subject: [PATCH] SOC1-141: Created Basic AHB Packet Deconstructor module and
 updated signal names

---
 flist/wrapper_ip.flist                      |   1 +
 hdl/src/wrapper_ahb_packet_constructor.sv   |  30 ++---
 hdl/src/wrapper_ahb_packet_deconstructor.sv | 134 ++++++++++++++++++++
 hdl/src/wrapper_data_req.sv                 |  20 +--
 hdl/src/wrapper_packet_construct.sv         |   4 +-
 5 files changed, 162 insertions(+), 27 deletions(-)
 create mode 100644 hdl/src/wrapper_ahb_packet_deconstructor.sv

diff --git a/flist/wrapper_ip.flist b/flist/wrapper_ip.flist
index 3ef4523..865ac08 100644
--- a/flist/wrapper_ip.flist
+++ b/flist/wrapper_ip.flist
@@ -20,6 +20,7 @@
 +incdir+$(ACC_WRAPPER_DIR)/hdl/src/
 
 $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_packet_constructor.sv
+$(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_packet_deconstructor.sv
 
 $(ACC_WRAPPER_DIR)/hdl/src/wrapper_data_req.sv
 $(ACC_WRAPPER_DIR)/hdl/src/wrapper_ahb_reg_interface.sv
diff --git a/hdl/src/wrapper_ahb_packet_constructor.sv b/hdl/src/wrapper_ahb_packet_constructor.sv
index 65d3f83..47546ac 100644
--- a/hdl/src/wrapper_ahb_packet_constructor.sv
+++ b/hdl/src/wrapper_ahb_packet_constructor.sv
@@ -49,8 +49,8 @@ module wrapper_ahb_packet_constructor #(
  logic                  wready;
  logic                  rready;
 
- // Engine Ready for more Data
- logic engine_ready;
+ // Constructor Ready for more Data
+ logic constructor_ready;
 
  // AHB Interface Instantiation
  wrapper_ahb_reg_interface #(
@@ -85,29 +85,29 @@ module wrapper_ahb_packet_constructor #(
 
  // Data Request Signal Generator
  wrapper_data_req #(
-    ADDRWIDTH,  // Only half address map allocated to this device
-    512         // Packet Width
+    ADDRWIDTH,   // Only half address map allocated to this device
+    PACKETWIDTH  // Packet Width
   ) u_wrapper_data_req (
-    .hclk           (hclk),
-    .hresetn        (hresetn),
+    .hclk              (hclk),
+    .hresetn           (hresetn),
 
     // AHB Address Phase Signaling
-    .hsels          (hsels),
-    .haddrs         (haddrs),
-    .htranss        (htranss),
-    .hreadys        (hreadys),
+    .hsels             (hsels),
+    .haddrs            (haddrs),
+    .htranss           (htranss),
+    .hreadys           (hreadys),
 
     // Engine Data Ready Signal
-    .engine_ready   (engine_ready),
+    .constructor_ready (constructor_ready),
 
     // Data Request Signal 
-    .data_req       (data_req)
+    .data_req          (data_req)
  );
  
  // Valid/Ready Packet Generator
  wrapper_packet_construct #(
-    ADDRWIDTH,  // Only half address map allocated to this device
-    512         // Packet Width
+    ADDRWIDTH,   // Only half address map allocated to this device
+    PACKETWIDTH  // Packet Width
   ) u_wrapper_packet_construct (
     .hclk         (hclk),
     .hresetn      (hresetn),
@@ -129,6 +129,6 @@ module wrapper_ahb_packet_constructor #(
     .packet_data_ready (packet_data_ready),
 
     // Data Request 
-    .engine_ready      (engine_ready)
+    .constructor_ready (constructor_ready)
   );
 endmodule
\ No newline at end of file
diff --git a/hdl/src/wrapper_ahb_packet_deconstructor.sv b/hdl/src/wrapper_ahb_packet_deconstructor.sv
new file mode 100644
index 0000000..408cee3
--- /dev/null
+++ b/hdl/src/wrapper_ahb_packet_deconstructor.sv
@@ -0,0 +1,134 @@
+//-----------------------------------------------------------------------------
+// SoC Labs AHB Packet Deconstructor
+// 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)
+//-----------------------------------------------------------------------------
+module wrapper_ahb_packet_deconstructor #(
+  //parameter for address width
+  parameter   ADDRWIDTH=11,
+  parameter   PACKETWIDTH=256
+)(
+  input  logic                  hclk,       // clock
+  input  logic                  hresetn,    // reset
+
+  // AHB Input Port
+  input  logic                  hsels,
+  input  logic [ADDRWIDTH-1:0]  haddrs,
+  input  logic [1:0]            htranss,
+  input  logic [2:0]            hsizes,
+  input  logic                  hwrites,
+  input  logic                  hreadys,
+  input  logic [31:0]           hwdatas,
+
+  output logic                  hreadyouts,
+  output logic                  hresps,
+  output logic [31:0]           hrdatas,
+
+  // Valid/Ready Input Port
+  input  logic [PACKETWIDTH-1:0] packet_data,
+  input  logic                   packet_data_last,
+  input  logic                   packet_data_valid,
+  output logic                   packet_data_ready,
+
+  // Data Request Signal
+  output logic                   data_req
+ );
+
+ // Register Interface Connections
+ logic [ADDRWIDTH-1:0]  addr;
+ logic                  read_en;
+ logic                  write_en;
+ logic [3:0]            byte_strobe;
+ logic [31:0]           wdata;
+ logic [31:0]           rdata;
+ logic                  wready;
+ logic                  rready;
+
+ // Deconstructor Ready for more Data
+ logic deconstructor_ready;
+
+ // AHB Interface Instantiation
+ wrapper_ahb_reg_interface #(
+    ADDRWIDTH
+ ) ahb_reg_interface_inst (
+    .hclk         (hclk),
+    .hresetn      (hresetn),
+
+    // Input slave port: 32 bit data bus interface
+    .hsels        (hsels),
+    .haddrs       (haddrs),
+    .htranss      (htranss),
+    .hsizes       (hsizes),
+    .hwrites      (hwrites),
+    .hreadys      (hreadys),
+    .hwdatas      (hwdatas),
+
+    .hreadyouts   (hreadyouts),
+    .hresps       (hresps),
+    .hrdatas      (hrdatas),
+
+    // Register Output interface
+    .addr        (addr),
+    .read_en     (read_en),
+    .write_en    (write_en),
+    .byte_strobe (byte_strobe),
+    .wdata       (wdata),
+    .rdata       (rdata),
+    .wready      (wready),
+    .rready      (rready)
+ );
+
+ // Data Request Signal Generator
+ wrapper_data_req #(
+    ADDRWIDTH,   // Only half address map allocated to this device
+    PACKETWIDTH  // Packet Width
+  ) u_wrapper_data_req (
+    .hclk              (hclk),
+    .hresetn           (hresetn),
+
+    // AHB Address Phase Signaling
+    .hsels             (hsels),
+    .haddrs            (haddrs),
+    .htranss           (htranss),
+    .hreadys           (hreadys),
+
+    // Constructor Data Ready Signal
+    .constructor_ready (deconstructor_ready),
+
+    // Data Request Signal 
+    .data_req          (data_req)
+ );
+ 
+ // Valid/Ready Packet Generator
+ wrapper_packet_deconstruct #(
+    ADDRWIDTH,  // Only half address map allocated to this device
+    PACKETWIDTH // Packet Width
+ ) u_wrapper_packet_deconstruct (
+    .hclk                (hclk),
+    .hresetn             (hresetn),
+
+    // Register interface
+    .addr                (addr),
+    .read_en             (read_en),
+    .write_en            (write_en),
+    .byte_strobe         (byte_strobe),
+    .wdata               (wdata),
+    .rdata               (rdata),
+    .wready              (wready),
+    .rready              (rready),
+
+    // Valid/Ready Interface
+    .packet_data         (packet_data),
+    .packet_data_last    (packet_data_last),
+    .packet_data_valid   (packet_data_valid),
+    .packet_data_ready   (packet_data_ready),
+
+    // Data Request 
+    .deconstructor_ready (deconstructor_ready)
+  );
+endmodule
\ No newline at end of file
diff --git a/hdl/src/wrapper_data_req.sv b/hdl/src/wrapper_data_req.sv
index 39801e4..abb5042 100644
--- a/hdl/src/wrapper_data_req.sv
+++ b/hdl/src/wrapper_data_req.sv
@@ -26,8 +26,8 @@ module wrapper_data_req #(
   input  logic [1:0]            htranss,
   input  logic                  hreadys,
 
-  // Engine Hungry Signal
-  input  logic                  engine_ready,
+  // Constructor/Deconstructor Ready Signal
+  input  logic                  constructor_ready,
 
   // Connection to wrapper
   output logic                  data_req
@@ -44,19 +44,19 @@ assign trans_req  = hreadys & hsels & htranss[1];
 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;
+// If constructor_ready => data_req EXCEPT if current address is last address
+logic constructor_ready_reg;
 logic data_req_latched;
 
 always_ff @(posedge hclk or negedge hresetn) begin
     if (~hresetn) begin
-        engine_ready_reg <= 1'b0;
+        constructor_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;
+        constructor_ready_reg <= constructor_ready;
         // Latch data request signal once seen last address of packet
-        if (trans_req && packet_last_word && engine_ready) begin
+        if (trans_req && packet_last_word && constructor_ready) begin
             // Latch data request signal
             data_req_latched <= 1'b1;
         // Unlatch when latched and data phase finished
@@ -68,9 +68,9 @@ always_ff @(posedge hclk or negedge hresetn) begin
 end
 
 always_comb begin
-    if (~engine_ready_reg) begin
+    if (~constructor_ready_reg) begin
         // If engine ready is transitioning from low to high
-        data_req = engine_ready;
+        data_req = constructor_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
@@ -78,7 +78,7 @@ always_comb begin
             data_req = 1'b0;
         end else begin
             // After data phase, take value of engine ready
-            data_req = engine_ready;
+            data_req = constructor_ready;
         end
     end
 end
diff --git a/hdl/src/wrapper_packet_construct.sv b/hdl/src/wrapper_packet_construct.sv
index a0fb999..238b5ee 100644
--- a/hdl/src/wrapper_packet_construct.sv
+++ b/hdl/src/wrapper_packet_construct.sv
@@ -33,7 +33,7 @@ module  wrapper_packet_construct #(
   input  logic                   packet_data_ready,
 
   // Data Input Request
-  output logic                   engine_ready
+  output logic                   constructor_ready
 );
 
 localparam REGDWIDTH       = 32; // Register Data Width
@@ -75,7 +75,7 @@ assign packet_addr_last      = &packet_addr;
 assign prev_packet_addr_last = &prev_packet_addr;
 
 // Engine Ready Assignment
-assign engine_ready = packet_data_ready;
+assign constructor_ready = packet_data_ready;
 
 // Write data out when either:
 // - Word is last address of current packet
-- 
GitLab