From 8c8a6deb5fd717f9b20ccd8bab2db44ffc16d9a6 Mon Sep 17 00:00:00 2001
From: Michael Rogenmoser <michael@rogenmoser.us>
Date: Mon, 8 Jul 2024 19:41:40 +0200
Subject: [PATCH] Add rready converter for backend

---
 Bender.lock                  |  8 +++---
 Bender.yml                   |  4 +--
 rtl/dma/safety_island_dma.sv | 48 ++++++++++++++++++++++++++++++------
 rtl/safety_island_top.sv     |  1 +
 4 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/Bender.lock b/Bender.lock
index e5276ff..8d3c33d 100644
--- a/Bender.lock
+++ b/Bender.lock
@@ -87,8 +87,8 @@ packages:
     dependencies:
     - common_cells
   idma:
-    revision: 95f366e56f7e772c283fb3c8b343afc4a3978375
-    version: 0.6.2
+    revision: c12caf59bb482fe44b27361f6924ad346b2d22fe
+    version: 0.6.3
     source:
       Git: https://github.com/pulp-platform/idma.git
     dependencies:
@@ -99,8 +99,8 @@ packages:
     - obi
     - register_interface
   obi:
-    revision: 1aa411df145c4ebdd61f8fed4d003c33f7b20636
-    version: 0.1.2
+    revision: b3af63fe40121c0479f2e3c355cc88912a2e633d
+    version: null
     source:
       Git: https://github.com/pulp-platform/obi.git
     dependencies:
diff --git a/Bender.yml b/Bender.yml
index aeefe24..029df28 100644
--- a/Bender.yml
+++ b/Bender.yml
@@ -20,10 +20,10 @@ dependencies:
   fpnew:                { git: "https://github.com/pulp-platform/cvfpu.git",                rev: pulp-v0.1.3 }
   apb:                  { git: "https://github.com/pulp-platform/apb.git",                  version: 0.2.3 }
   timer_unit:           { git: "https://github.com/pulp-platform/timer_unit.git",           version: 1.0.2 }
-  obi:                  { git: "https://github.com/pulp-platform/obi.git",                  version: 0.1.1 }
+  obi:                  { git: "https://github.com/pulp-platform/obi.git",                  rev: b3af63fe40121c0479f2e3c355cc88912a2e633d }
   unbent:               { git: "https://github.com/pulp-platform/unbent.git",               version: 0.1.6 }
   axi_obi:              { path: "future/axi_obi" }
-  idma:                 { git: "https://github.com/pulp-platform/idma.git",                 version: 0.6.2 }
+  idma:                 { git: "https://github.com/pulp-platform/idma.git",                 version: 0.6.3 }
 
 sources:
   # Level 1
diff --git a/rtl/dma/safety_island_dma.sv b/rtl/dma/safety_island_dma.sv
index 6171b02..93d243f 100644
--- a/rtl/dma/safety_island_dma.sv
+++ b/rtl/dma/safety_island_dma.sv
@@ -6,15 +6,16 @@
 // - Michael Rogenmoser <michaero@iis.ee.ethz.ch>
 
 `include "idma/typedef.svh"
+`include "obi/typedef.svh"
 
 module safety_island_dma import safety_island_pkg::*; #(
-  // parameter safety_island_cfg_t SafetyIslandCfg = safety_island_pkg::SafetyIslandDefaultConfig,
   parameter type                reg_req_t       = logic,
   parameter type                reg_rsp_t       = logic,
 
   /// OBI Request and Response channel type
   parameter obi_pkg::obi_cfg_t  ObiCfg          = obi_pkg::ObiDefaultConfig,
   parameter type                obi_a_chan_t    = logic,
+  parameter type                obi_r_chan_t    = logic,
   parameter type                obi_req_t       = logic,
   parameter type                obi_rsp_t       = logic
 ) (
@@ -33,7 +34,10 @@ module safety_island_dma import safety_island_pkg::*; #(
 
   localparam int unsigned TFLenWidth = 24;
 
-  `IDMA_TYPEDEF_FULL_REQ_T(idma_req_t, logic[ObiCfg.IdWidth-1:0], logic[ObiCfg.AddrWidth-1:0], logic[TFLenWidth-1:0])
+  `IDMA_TYPEDEF_FULL_REQ_T(idma_req_t,
+                           logic[ObiCfg.IdWidth-1:0],
+                           logic[ObiCfg.AddrWidth-1:0],
+                           logic[TFLenWidth-1:0])
   `IDMA_TYPEDEF_FULL_RSP_T(idma_rsp_t, logic[ObiCfg.AddrWidth-1:0])
 
   typedef struct packed {
@@ -54,6 +58,7 @@ module safety_island_dma import safety_island_pkg::*; #(
     obi_write_a_chan_padded_t obi;
   } write_meta_channel_t;
 
+  `OBI_TYPEDEF_REQ_T(internal_obi_req_t, obi_a_chan_t)
 
   idma_req_t backend_req;
   idma_rsp_t backend_rsp;
@@ -66,6 +71,9 @@ module safety_island_dma import safety_island_pkg::*; #(
 
   logic [31:0] next_id, completed_id;
 
+  internal_obi_req_t internal_obi_req[1:0];
+  obi_rsp_t          internal_obi_rsp[1:0];
+
   // reg_frontend
   idma_reg32_1d #(
     .NumRegs       ( 1 ),
@@ -124,7 +132,7 @@ module safety_island_dma import safety_island_pkg::*; #(
     .idma_rsp_t          ( idma_rsp_t ),
     .idma_eh_req_t       ( idma_pkg::idma_eh_req_t ),
     .idma_busy_t         ( idma_pkg::idma_busy_t ),
-    .obi_req_t           ( obi_req_t ),
+    .obi_req_t           ( internal_obi_req_t ),
     .obi_rsp_t           ( obi_rsp_t ),
     .read_meta_channel_t ( read_meta_channel_t ),
     .write_meta_channel_t( write_meta_channel_t )
@@ -145,13 +153,39 @@ module safety_island_dma import safety_island_pkg::*; #(
     .eh_req_valid_i ( '0 ),
     .eh_req_ready_o (),
 
-    .obi_read_req_o ( obi_req_o[0] ),
-    .obi_read_rsp_i ( obi_rsp_i[0] ),
+    .obi_read_req_o ( internal_obi_req[0] ),
+    .obi_read_rsp_i ( internal_obi_rsp[0] ),
 
-    .obi_write_req_o( obi_req_o[1] ),
-    .obi_write_rsp_i( obi_rsp_i[1] ),
+    .obi_write_req_o( internal_obi_req[1] ),
+    .obi_write_rsp_i( internal_obi_rsp[1] ),
 
     .busy_o         ( backend_busy )
   );
 
+  for (genvar i = 0; i < 2; i++) begin
+    obi_rready_converter #(
+      .obi_a_chan_t( obi_a_chan_t ),
+      .obi_r_chan_t( obi_r_chan_t ),
+      .Depth       ( 2            ),
+      .CombRspReq  ( 1'b1         )
+    ) i_obi_rready_converter (
+      .clk_i,
+      .rst_ni,
+      .test_mode_i,
+
+      .sbr_a_chan_i( internal_obi_req[i].a      ),
+      .req_i       ( internal_obi_req[i].req    ),
+      .gnt_o       ( internal_obi_rsp[i].gnt    ),
+      .sbr_r_chan_o( internal_obi_rsp[i].r      ),
+      .rvalid_o    ( internal_obi_rsp[i].rvalid ),
+      .rready_i    ( internal_obi_req[i].rready ),
+
+      .mgr_a_chan_o( obi_req_o[i].a      ),
+      .req_o       ( obi_req_o[i].req    ),
+      .gnt_i       ( obi_rsp_i[i].gnt    ),
+      .mgr_r_chan_i( obi_rsp_i[i].r      ),
+      .rvalid_i    ( obi_rsp_i[i].rvalid )
+    );
+  end
+
 endmodule
diff --git a/rtl/safety_island_top.sv b/rtl/safety_island_top.sv
index 0147234..46e3f4d 100644
--- a/rtl/safety_island_top.sv
+++ b/rtl/safety_island_top.sv
@@ -619,6 +619,7 @@ module safety_island_top import safety_island_pkg::*; #(
       .reg_rsp_t   ( safety_reg_rsp_t ),
       .ObiCfg      ( MgrObiCfg ),
       .obi_a_chan_t( mgr_obi_a_chan_t ),
+      .obi_r_chan_t( mgr_obi_r_chan_t ),
       .obi_req_t   ( mgr_obi_req_t ),
       .obi_rsp_t   ( mgr_obi_rsp_t )
     ) i_dma_unit (