diff --git a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
index 26386d044ae617180dd8bbedcd7e438e76997c25..99ca70f314661414c2819d92253333783c5b8a9e 100644
--- a/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
+++ b/libraries/io/ddr/tb/vhdl/tb_io_ddr.vhd
@@ -37,6 +37,7 @@ USE IEEE.STD_LOGIC_1164.ALL;
 USE IEEE.numeric_std.ALL;
 USE common_lib.common_pkg.ALL;
 USE common_lib.common_mem_pkg.ALL;
+USE common_lib.tb_common_pkg.ALL;
 USE common_lib.tb_common_mem_pkg.ALL;
 USE dp_lib.dp_stream_pkg.ALL;
 USE technology_lib.technology_select_pkg.ALL;
@@ -52,7 +53,18 @@ ARCHITECTURE str of tb_io_ddr IS
 
   CONSTANT c_tech_ddr         : t_c_tech_ddr := c_tech_ddr3_4g_800m_master;
   
-  CONSTANT c_data_w           : NATURAL := 256; --32;
+--  CONSTANT c_ddr_addr_hi      : t_tech_ddr_addr := ((OTHERS=>'0'),
+--                                                    (OTHERS=>'0'),
+--                                                    TO_UVEC(                                         3, c_tech_ddr_max.a_row_w),
+--                                                    TO_UVEC(2**c_tech_ddr_4g.a_col_w-c_tech_ddr_4g.rsl, c_tech_ddr_max.a_col_w));
+  CONSTANT c_ddr_addr_hi      : t_tech_ddr_addr := ((OTHERS=>'0'),
+                                                    (OTHERS=>'0'),
+                                                    TO_UVEC(                                         3, c_tech_ddr_max.a_row_w),
+                                                    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_ctrl_data_w(c_tech_ddr);
+  CONSTANT c_dp_data_w        : NATURAL := 32;
+  CONSTANT c_dp_factor        : NATURAL := c_ctlr_data_w/c_dp_data_w;
  
   SIGNAL ctlr_ref_clk         : STD_LOGIC := '0';
   SIGNAL ctlr_ref_rst         : STD_LOGIC;
@@ -73,9 +85,6 @@ ARCHITECTURE str of tb_io_ddr IS
   SIGNAL wr_siso              : t_dp_siso;
   SIGNAL wr_sosi              : t_dp_sosi;
 
-  SIGNAL wr_siso_pre_fifo     : t_dp_siso;
-  SIGNAL wr_sosi_pre_fifo     : t_dp_sosi;
-
   SIGNAL rd_siso              : t_dp_siso;
   SIGNAL rd_sosi              : t_dp_sosi;
 
@@ -86,7 +95,8 @@ ARCHITECTURE str of tb_io_ddr IS
   SIGNAL snk_diag_res         : STD_LOGIC;
   SIGNAL snk_diag_res_val     : STD_LOGIC;
   SIGNAL snk_val_cnt          : STD_LOGIC_VECTOR(31 DOWNTO 0);
-
+  SIGNAL expected_cnt         : NATURAL;
+  
   SIGNAL phy_in               : t_tech_ddr_phy_in;
   SIGNAL phy_io               : t_tech_ddr_phy_io;
   SIGNAL phy_ou               : t_tech_ddr_phy_ou;
@@ -100,7 +110,7 @@ BEGIN
   dp_rst   <= '1', '0' AFTER 100 ns;
 
   dvr_start_addr <= c_tech_ddr_addr_lo;
-  dvr_end_addr   <= c_tech_ddr_addr_hi_sim;
+  dvr_end_addr   <= c_ddr_addr_hi;
 
   p_stimuli : PROCESS
   BEGIN
@@ -110,50 +120,49 @@ BEGIN
     dvr_wr_not_rd <= '0';
     snk_diag_en   <= '0';
 
-    WAIT UNTIL ctlr_init_done = '1';   
-    FOR i IN 0 TO 1 LOOP
-      WAIT UNTIL rising_edge(dp_clk); -- Give the driver FSM a cycle to go into idle mode
-    END LOOP;
+    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
     
-    -- START WRITE
+    -- START diagnostics source for write and sink for verify read
     src_diag_en   <= '1';
+    snk_diag_en   <= '1';
+    
+    -- START WRITE
     dvr_wr_not_rd <= '1';
     dvr_en        <= '1';
-
-    WAIT UNTIL rising_edge(dp_clk);
-
+    proc_common_wait_some_cycles(dp_clk, 1);
     dvr_en        <= '0'; 
     
     -- WRITE DONE  
-    WAIT UNTIL dvr_done = '1';
-
-    src_diag_en   <= '0';
+    proc_common_wait_some_cycles(dp_clk, 10);
+    proc_common_wait_until_high(dp_clk, dvr_done);
 
     -- START READ
-    snk_diag_en   <= '1';
     dvr_wr_not_rd <= '0';
     dvr_en        <= '1';
-
-    WAIT UNTIL rising_edge(dp_clk);
-
+    proc_common_wait_some_cycles(dp_clk, 1);
     dvr_en        <= '0'; 
 
     -- READ DONE
-    WAIT UNTIL dvr_done = '1';    
+    proc_common_wait_some_cycles(dp_clk, 10);
+    proc_common_wait_until_high(dp_clk, dvr_done);
 
-    WAIT FOR 2 us; -- 'Done' means all requests are posted. Wait for the last read data to arrive.
+    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.
   
-    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;
-    ASSERT FALSE REPORT "[OK] Test passed." SEVERITY NOTE;
-    tb_end        <= '1';
+    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;
+    ASSERT UNSIGNED(snk_val_cnt) = expected_cnt REPORT "[ERROR] Unexpected number of read data!" SEVERITY FAILURE;
+    
+    REPORT "[OK] Test passed." SEVERITY NOTE;
+    tb_end <= '1';
 
     WAIT;
   END PROCESS;
 
   u_diagnostics: ENTITY diagnostics_lib.diagnostics 
   GENERIC MAP (
-    g_dat_w             => c_data_w,
+    g_dat_w             => c_dp_data_w,
     g_nof_streams       => 1
      ) 
   PORT MAP (
@@ -179,8 +188,8 @@ BEGIN
   GENERIC MAP(
     g_technology       => c_tech_select_default,
     g_tech_ddr         => c_tech_ddr,
-    g_wr_data_w        => c_data_w,
-    g_rd_data_w        => c_data_w
+    g_wr_data_w        => c_dp_data_w,
+    g_rd_data_w        => c_dp_data_w
   )                      
   PORT MAP (                  
     ctlr_ref_clk       => ctlr_ref_clk,