diff --git a/libraries/io/ddr/src/vhdl/io_ddr.vhd b/libraries/io/ddr/src/vhdl/io_ddr.vhd
index 7ebc7d82ab3dd2387f08bed00eeb66d04f5d523c..ade1d6b6432ddf2e5be3c3762fa8ebc1c5028af5 100644
--- a/libraries/io/ddr/src/vhdl/io_ddr.vhd
+++ b/libraries/io/ddr/src/vhdl/io_ddr.vhd
@@ -43,33 +43,44 @@ ENTITY io_ddr IS
     g_flush_sop_start_channel : NATURAL := 0;
     g_flush_nof_channels      : NATURAL := 0
   );                      
-  PORT (                  
+  PORT (
+    -- DDR reference clock
     ctlr_ref_clk       : IN    STD_LOGIC;
     ctlr_ref_rst       : IN    STD_LOGIC;
 
+    -- DDR controller clock domain
+    ctlr_clk_out       : OUT   STD_LOGIC;
+    ctlr_rst_out       : OUT   STD_LOGIC;
+    
+    ctlr_clk_in        : IN    STD_LOGIC;  -- connect ctlr_clk_out to ctlr_clk_in at top level to avoid potential delta-cycle differences between the same clock
+    ctlr_rst_in        : IN    STD_LOGIC;  -- connect ctlr_rst_out to ctlr_rst_in at top level
+    
     ctlr_init_done     : OUT   STD_LOGIC;
     ctlr_rdy           : OUT   STD_LOGIC;
 
     dvr_en             : IN    STD_LOGIC;
     dvr_wr_not_rd      : IN    STD_LOGIC;
-    dvr_done           : OUT   STD_LOGIC;
     dvr_start_addr     : IN    t_tech_ddr_addr;
     dvr_end_addr       : IN    t_tech_ddr_addr;
+    dvr_done           : OUT   STD_LOGIC;
 
+    -- Write FIFO clock domain
     wr_clk             : IN    STD_LOGIC;
     wr_rst             : IN    STD_LOGIC;
 
     wr_sosi            : IN    t_dp_sosi;
     wr_siso            : OUT   t_dp_siso;
   
+    -- Read FIFO clock domain
+    rd_clk             : IN    STD_LOGIC;
+    rd_rst             : IN    STD_LOGIC;
+    
     rd_sosi            : OUT   t_dp_sosi;
     rd_siso            : IN    t_dp_siso;
     
-    rd_clk             : IN    STD_LOGIC;
-    rd_rst             : IN    STD_LOGIC;
+    rd_fifo_usedw      : OUT   STD_LOGIC_VECTOR(ceil_log2(g_rd_fifo_depth * (func_tech_ddr_ctlr_data_w(g_tech_ddr)/g_rd_data_w) )-1 DOWNTO 0);    
 
-    rd_fifo_usedw      : OUT   STD_LOGIC_VECTOR(ceil_log2(g_rd_fifo_depth * (func_tech_ddr_ctlr_data_w(g_tech_ddr)/g_rd_data_w) )-1 DOWNTO 0);
-    
+    -- DDR PHY external interface
     phy_in             : IN    t_tech_ddr_phy_in;
     phy_io             : INOUT t_tech_ddr_phy_io;
     phy_ou             : OUT   t_tech_ddr_phy_ou
@@ -91,9 +102,6 @@ ARCHITECTURE str OF io_ddr IS
   SIGNAL i_ctlr_init_done  : STD_LOGIC;
   SIGNAL i_dvr_done        : STD_LOGIC;
 
-  SIGNAL ctlr_gen_clk      : STD_LOGIC;
-  SIGNAL ctlr_gen_rst      : STD_LOGIC;
-  
   SIGNAL ctlr_mosi         : t_tech_ddr_mosi := c_tech_ddr_mosi_rst;
   SIGNAL ctlr_miso         : t_tech_ddr_miso := c_tech_ddr_miso_rst;
 
@@ -128,8 +136,8 @@ BEGIN
   PORT MAP (
     wr_rst         => wr_rst,
     wr_clk         => wr_clk,
-    rd_rst         => ctlr_gen_rst,
-    rd_clk         => ctlr_gen_clk,
+    rd_rst         => ctlr_rst_in,
+    rd_clk         => ctlr_clk_in,
 
     snk_out        => wr_siso,
     snk_in         => wr_sosi,
@@ -149,8 +157,8 @@ BEGIN
     g_framed_xoff   => FALSE           -- immediately start flushing when dvr_flush goes high
   )
   PORT MAP (
-    rst      => ctlr_gen_rst,
-    clk      => ctlr_gen_clk,
+    rst      => ctlr_rst_in,
+    clk      => ctlr_clk_in,
    
     snk_in   => flush_wr_sosi,
     snk_out  => flush_wr_siso,
@@ -193,8 +201,8 @@ BEGIN
     g_rd_fifo_rl        => 1
   )
   PORT MAP (
-    wr_rst   => ctlr_gen_rst,
-    wr_clk   => ctlr_gen_clk,
+    wr_rst   => ctlr_rst_in,
+    wr_clk   => ctlr_clk_in,
     rd_rst   => rd_rst,
     rd_clk   => rd_clk,
 
@@ -214,27 +222,25 @@ BEGIN
     g_tech_ddr      => g_tech_ddr
   )
   PORT MAP ( 
-    rst             => ctlr_gen_rst,  
-    clk             => ctlr_gen_clk,        
-
-    ctlr_init_done  => i_ctlr_init_done,
-    
-    ctlr_mosi       => ctlr_mosi,
-    ctlr_miso       => ctlr_miso,
+    rst             => ctlr_rst_in,  
+    clk             => ctlr_clk_in,        
 
     dvr_en          => dvr_en,
-    dvr_done        => i_dvr_done,
     dvr_wr_not_rd   => dvr_wr_not_rd,
     dvr_start_addr  => dvr_start_addr,
     dvr_end_addr    => dvr_end_addr, 
+    dvr_done        => i_dvr_done,
     
     wr_fifo_usedw   => wr_fifo_usedw,
-    
-    wr_snk_out      => ctlr_wr_snk_out,
     wr_snk_in       => ctlr_wr_snk_in, 
+    wr_snk_out      => ctlr_wr_snk_out,
     
+    rd_src_out      => ctlr_rd_src_out,
     rd_src_in       => ctlr_rd_src_in,
-    rd_src_out      => ctlr_rd_src_out
+
+    ctlr_init_done  => i_ctlr_init_done,
+    ctlr_miso       => ctlr_miso,
+    ctlr_mosi       => ctlr_mosi
   );
 
   u_tech_ddr : ENTITY tech_ddr_lib.tech_ddr
@@ -248,8 +254,8 @@ BEGIN
     ctlr_ref_rst      => ctlr_ref_rst,
 
     -- Controller user interface
-    ctlr_gen_clk      => ctlr_gen_clk,
-    ctlr_gen_rst      => ctlr_gen_rst,
+    ctlr_gen_clk      => ctlr_clk_out,
+    ctlr_gen_rst      => ctlr_rst_out,
     ctlr_gen_clk_2x   => OPEN,
     ctlr_gen_rst_2x   => OPEN,
 
diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
index 9d535094535a654fc7f45afb7c1a3e03a3b39730..df0516bd64487a6cbe6a785f6c03d58aae17ad61 100644
--- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
@@ -29,6 +29,7 @@
 --
 -- Testbench is selftesting: 
 --
+-- > as 8
 -- > run -all 
 --
 
@@ -63,12 +64,15 @@ ARCHITECTURE str of tb_io_ddr IS
                                                     TO_UVEC(2**c_tech_ddr_4g.a_col_w-1, c_tech_ddr_max.a_col_w));
                                                     
   CONSTANT c_ctlr_data_w      : NATURAL := func_tech_ddr_ctlr_data_w(c_tech_ddr);
-  CONSTANT c_dp_data_w        : NATURAL := 32;
+  --CONSTANT c_dp_data_w        : NATURAL := 32;
+  CONSTANT c_dp_data_w        : NATURAL := 256;
   CONSTANT c_dp_factor        : NATURAL := c_ctlr_data_w/c_dp_data_w;
  
+  SIGNAL tb_end               : STD_LOGIC := '0';
   SIGNAL ctlr_ref_clk         : STD_LOGIC := '0';
   SIGNAL ctlr_ref_rst         : STD_LOGIC;
-  SIGNAL tb_end               : STD_LOGIC := '0';
+  SIGNAL ctlr_clk             : STD_LOGIC;
+  SIGNAL ctlr_rst             : STD_LOGIC;
   SIGNAL dp_clk               : STD_LOGIC := '0';
   SIGNAL dp_rst               : STD_LOGIC;
 
@@ -120,8 +124,8 @@ BEGIN
     dvr_wr_not_rd <= '0';
     snk_diag_en   <= '0';
 
-    proc_common_wait_until_high(dp_clk, ctlr_init_done);
-    proc_common_wait_some_cycles(dp_clk, 2);  -- Give the driver FSM a cycle to go into idle mode
+    proc_common_wait_until_high(ctlr_clk, ctlr_init_done);
+    proc_common_wait_some_cycles(ctlr_clk, 2);  -- Give the driver FSM a cycle to go into idle mode
     
     -- START diagnostics source for write and sink for verify read
     src_diag_en   <= '1';
@@ -130,25 +134,25 @@ BEGIN
     -- START WRITE
     dvr_wr_not_rd <= '1';
     dvr_en        <= '1';
-    proc_common_wait_some_cycles(dp_clk, 1);
+    proc_common_wait_some_cycles(ctlr_clk, 1);
     dvr_en        <= '0'; 
     
     -- WRITE DONE  
-    proc_common_wait_some_cycles(dp_clk, 10);
-    proc_common_wait_until_high(dp_clk, dvr_done);
+    proc_common_wait_some_cycles(ctlr_clk, 10);
+    proc_common_wait_until_high(ctlr_clk, dvr_done);
 
     -- START READ
     dvr_wr_not_rd <= '0';
     dvr_en        <= '1';
-    proc_common_wait_some_cycles(dp_clk, 1);
+    proc_common_wait_some_cycles(ctlr_clk, 1);
     dvr_en        <= '0'; 
 
     -- READ DONE
-    proc_common_wait_some_cycles(dp_clk, 10);
-    proc_common_wait_until_high(dp_clk, dvr_done);
+    proc_common_wait_some_cycles(ctlr_clk, 10);
+    proc_common_wait_until_high(ctlr_clk, dvr_done);
 
     expected_cnt <= 1024*c_dp_factor;
-    proc_common_wait_some_cycles(dp_clk, 500*c_dp_factor);  -- 'Done' means all requests are posted. Wait for the last read data to arrive.
+    proc_common_wait_some_cycles(ctlr_clk, 500*c_dp_factor);  -- 'Done' means all requests are posted. Wait for the last read data to arrive.
   
     ASSERT snk_diag_res_val = '1'               REPORT "[ERROR] DIAG_RES INVALID!"               SEVERITY FAILURE;
     ASSERT snk_diag_res = '0'                   REPORT "[ERROR] NON-ZERO DIAG_RES!"              SEVERITY FAILURE;
@@ -191,18 +195,24 @@ BEGIN
     g_wr_data_w        => c_dp_data_w,
     g_rd_data_w        => c_dp_data_w
   )                      
-  PORT MAP (                  
+  PORT MAP (
     ctlr_ref_clk       => ctlr_ref_clk,
     ctlr_ref_rst       => ctlr_ref_rst,
                                      
+    ctlr_clk_out       => ctlr_clk,
+    ctlr_rst_out       => ctlr_rst,
+    
+    ctlr_clk_in        => ctlr_clk,  -- connect ctlr_clk_out to ctlr_clk_in at top level to avoid potential delta-cycle differences between the same clock
+    ctlr_rst_in        => ctlr_rst,
+    
     ctlr_init_done     => ctlr_init_done,
     ctlr_rdy           => ctlr_rdy,
 
-    dvr_start_addr     => dvr_start_addr,
-    dvr_end_addr       => dvr_end_addr,
     dvr_en             => dvr_en,
     dvr_wr_not_rd      => dvr_wr_not_rd,
     dvr_done           => dvr_done,
+    dvr_start_addr     => dvr_start_addr,
+    dvr_end_addr       => dvr_end_addr,
  
     wr_clk             => dp_clk,
     wr_rst             => dp_rst,