From cc1292a9aa55c87f8e80a68efe61e9a4d2763237 Mon Sep 17 00:00:00 2001
From: Reinier van der Walle <walle@astron.nl>
Date: Tue, 2 May 2023 10:43:08 +0200
Subject: [PATCH] added conversion between byte and word addressing

---
 libraries/base/axi4/src/vhdl/axi4_lite_mm_bridge.vhd | 2 ++
 libraries/base/axi4/src/vhdl/axi4_lite_pkg.vhd       | 8 ++++----
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/libraries/base/axi4/src/vhdl/axi4_lite_mm_bridge.vhd b/libraries/base/axi4/src/vhdl/axi4_lite_mm_bridge.vhd
index 73799be8cb..8522aa997f 100644
--- a/libraries/base/axi4/src/vhdl/axi4_lite_mm_bridge.vhd
+++ b/libraries/base/axi4/src/vhdl/axi4_lite_mm_bridge.vhd
@@ -31,6 +31,8 @@
 --   . The read latency is not adapted. Ensure that the Controller and Peripheral use the same 
 --     read-latency.
 --   . Both AXI4-lite and MM use ready latency = 0 for waitrequest/ready.
+--   . AXI4-lite is assumed to use byte addressed registers while MM uses word addressed 
+--     registers.
 
 LIBRARY IEEE, common_lib;
 USE IEEE.STD_LOGIC_1164.ALL;
diff --git a/libraries/base/axi4/src/vhdl/axi4_lite_pkg.vhd b/libraries/base/axi4/src/vhdl/axi4_lite_pkg.vhd
index 7214af9bff..35c121f370 100644
--- a/libraries/base/axi4/src/vhdl/axi4_lite_pkg.vhd
+++ b/libraries/base/axi4/src/vhdl/axi4_lite_pkg.vhd
@@ -109,9 +109,9 @@ PACKAGE BODY axi4_lite_pkg IS
     VARIABLE v_mm_copi : t_mem_copi := c_mem_copi_rst;
   BEGIN
     IF axi4_copi.awvalid = '1' THEN
-      v_mm_copi.address := axi4_copi.awaddr;
+      v_mm_copi.address := "00" & axi4_copi.awaddr(c_axi4_lite_address_w-1 DOWNTO 2); -- convert byte addressed to word addressed.
     ELSE
-      v_mm_copi.address := axi4_copi.araddr;
+      v_mm_copi.address := "00" & axi4_copi.araddr(c_axi4_lite_address_w-1 DOWNTO 2); -- convert byte addressed to word addressed.
     END IF;
     v_mm_copi.wrdata(c_axi4_lite_data_w-1 DOWNTO 0) := axi4_copi.wdata;
     v_mm_copi.wr                                    := axi4_copi.awvalid;
@@ -131,14 +131,14 @@ PACKAGE BODY axi4_lite_pkg IS
   FUNCTION func_axi4_lite_from_mm_copi(mm_copi : t_mem_copi) RETURN t_axi4_lite_copi IS
     VARIABLE v_axi4_copi : t_axi4_lite_copi := c_axi4_lite_copi_rst;
   BEGIN
-    v_axi4_copi.awaddr  := mm_copi.address;  
+    v_axi4_copi.awaddr  := mm_copi.address(c_axi4_lite_address_w-3 DOWNTO 0) & "00"; -- convert word addressed to byte addressed.
     v_axi4_copi.awprot  := (OTHERS => '0');  
     v_axi4_copi.awvalid := mm_copi.wr;  
     v_axi4_copi.wdata   := mm_copi.wrdata(c_axi4_lite_data_w-1 DOWNTO 0);  
     v_axi4_copi.wstrb   := (OTHERS => '1'); -- Either ignored or all bytes selected.  
     v_axi4_copi.wvalid  := mm_copi.wr;  
     v_axi4_copi.bready  := '1'; -- Unsupported by MM, assuming always ready.  
-    v_axi4_copi.araddr  := mm_copi.address;  
+    v_axi4_copi.araddr  := mm_copi.address(c_axi4_lite_address_w-3 DOWNTO 0) & "00"; -- convert word addressed to byte addressed.  
     v_axi4_copi.arprot  := (OTHERS => '0');  
     v_axi4_copi.arvalid := mm_copi.rd;  
     v_axi4_copi.rready  := '1'; -- Unsupported by MM, assuming always ready.  
-- 
GitLab