diff --git a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
index 794f823ec30b620bf176d89dbcfffae62681eab0..56b129b4e69aa6be573df00246a42940f7d6ba4c 100644
--- a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
+++ b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
@@ -73,12 +73,12 @@ BEGIN
 
   mm_mosi.address <= TO_MEM_ADDRESS(start_address + r.word_index + r.step_index);
 
-  out_sosi.data  <= RESIZE_DP_DATA(mm_miso.rddata);
+  out_sosi.data  <= RESIZE_DP_DATA(mm_miso.rddata(c_word_w-1 DOWNTO 0));
   out_sosi.valid <= mm_miso.rdval;  -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so same as the ready latency (RL = 1)
   out_sosi.sop   <= r.sop;          -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.sop can be used for output sop
   out_sosi.eop   <= r.eop;          -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.eop can be used for output eop
   
-  mm_done <= not r.busy;
+  mm_done <= d.eop;
 
   p_reg : PROCESS(rst, clk)
   BEGIN
@@ -117,7 +117,7 @@ BEGIN
         END IF;
         
         -- check end of block
-        IF r.step_index >= c_mem_size THEN  -- use d rather than r to have easier end of block condition
+        IF r.step_index >= c_mem_size THEN
           d.eop <= '1';
           -- prepare for next block
           d.busy <= '0';
diff --git a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd
index ed847f9d39dfe2b917b1f7684b0974e3fd6e5f1c..29929f9e4339760988579f9026bc03dbf395d0b8 100644
--- a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd
+++ b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd
@@ -42,10 +42,8 @@ ENTITY dp_block_to_mm IS
     rst           : IN  STD_LOGIC;
     clk           : IN  STD_LOGIC;
     start_address : IN  NATURAL RANGE 0 TO g_step_size * g_nof_data;
-    mm_miso       : IN  t_mem_miso;
     mm_mosi       : OUT t_mem_mosi;
-    in_sosi       : IN  t_dp_sosi;
-    in_siso       : OUT t_dp_siso
+    in_sosi       : IN  t_dp_sosi
   );
 END dp_block_to_mm;
 
@@ -55,20 +53,18 @@ ARCHITECTURE rtl OF dp_block_to_mm IS
   CONSTANT c_mem_size : NATURAL := g_step_size * g_nof_data;
 
   TYPE t_reg IS RECORD
-    busy       : STD_LOGIC;
     wr         : STD_LOGIC;
     word_index : NATURAL RANGE 0 TO g_data_size-1;
     step_index : NATURAL RANGE 0 TO c_mem_size;
   END RECORD;
 
-  CONSTANT c_reg_rst : t_reg := ('0', '0', 0, 0);
+  CONSTANT c_reg_rst : t_reg := ('0', 0, 0);
 
   SIGNAL r : t_reg;
   SIGNAL d : t_reg;
 
 BEGIN
 
-  in_siso.ready   <= '1';
   mm_mosi.address <= TO_MEM_ADDRESS(start_address + r.word_index + r.step_index);
   mm_mosi.wrdata  <= RESIZE_MEM_DATA(in_sosi.data);
   mm_mosi.wr      <= r.wr;
@@ -82,38 +78,28 @@ BEGIN
     END IF;
   END PROCESS;
 
-  p_comb : PROCESS(r, in_sosi, d)
+  p_comb : PROCESS(r, in_sosi)
   BEGIN
     d <= r;
     d.wr <= '0';
     
-    -- if start of block
-    IF in_sosi.sop = '1' THEN
-      d.busy       <= '1';
-      d.word_index <= 0;
-      d.step_index <= 0;
-    END IF;
-
     -- if end of block
     IF in_sosi.eop = '1' THEN
       -- prepare for next block
-      d.busy       <= '0';
       d.word_index <= 0;
       d.step_index <= 0;
     END IF;
 
     -- while receiving block
-    IF r.busy = '1' THEN
-      IF in_sosi.valid = '1' THEN
-        -- continue with block
-        IF r.step_index < c_mem_size THEN
-          d.wr <= '1';
-          IF r.word_index < g_data_size - 1 THEN
-            d.word_index <= r.word_index + 1;
-          ELSE
-            d.word_index <= 0;
-            d.step_index <= r.step_index + g_step_size;
-          END IF;
+    IF in_sosi.valid = '1' THEN
+      -- continue with block
+      IF r.step_index < c_mem_size THEN
+        d.wr <= '1';
+        IF r.word_index < g_data_size - 1 THEN
+          d.word_index <= r.word_index + 1;
+        ELSE
+          d.word_index <= 0;
+          d.step_index <= r.step_index + g_step_size;
         END IF;
       END IF;
     END IF;
diff --git a/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd b/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd
index 99d0ffa8bec813b95324d62d4f7ff9169efce106..ce57df42d3e73d76aa49cb9dd5a13981a9fd41cc 100644
--- a/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd
+++ b/libraries/base/dp/tb/vhdl/tb_dp_block_from_mm.vhd
@@ -20,9 +20,19 @@
 -- Author: 
 -- . Pieter Donker
 -- Purpose:
--- . Read a block of data from memory mapped (MM) location and stream it as a block of data.
+-- . Test bench for dp_block_from_mm.vhd and dp_block_to_mm.vhd 
+--
 -- Description:
--- . " "
+-- . data flow:
+--   p_init_ram --> u_ram_rd --> u_dp_block_from_mm --> dp_block_to_mm --> u_ram_wr --> p_verify_read
+-- . process flow:
+--   p_init_ram --> p_transfer --> p_verify_read / p_verify_check. 
+--   . p_init_ram, initializes u_ram_rd with ascending values.
+--   . p_transfer, u_dp_block_from_mm reads data (using data and step size)
+--     from u_ram_rd and stream it to u_dp_block_to_mm which write it to u_ram_wr.
+--   . p_verify_read, set ram address (using data and step size) to check and
+--     read value from ram, also set expected ram value.
+--   . p_verify_check, check if ram_value is equal to expected value. 
 -- --------------------------------------------------------------------------
 
 -- > as 10
@@ -41,7 +51,7 @@ USE dp_lib.tb_dp_pkg.ALL;
 ENTITY tb_dp_block_from_mm IS
   GENERIC (
     g_data_size : NATURAL := 2;
-    g_step_size : NATURAL := 2;
+    g_step_size : NATURAL := 4;
     g_nof_data  : NATURAL := 512  -- 512
   );
 END tb_dp_block_from_mm;
@@ -52,7 +62,7 @@ ARCHITECTURE tb OF tb_dp_block_from_mm IS
   CONSTANT c_ram_data_size : NATURAL := g_nof_data * g_step_size;
   CONSTANT c_ram_adr_w     : NATURAL := ceil_log2(c_ram_data_size);
 
-  CONSTANT c_ram : t_c_mem := (c_mem_ram_rd_latency, c_ram_adr_w, c_word_w, 2**c_ram_adr_w, '0');
+  CONSTANT c_ram : t_c_mem := (1, c_ram_adr_w, c_word_w, 2**c_ram_adr_w, '0');
 
   SIGNAL tb_end             : STD_LOGIC := '0';
   SIGNAL clk                : STD_LOGIC := '1';
@@ -75,11 +85,13 @@ ARCHITECTURE tb OF tb_dp_block_from_mm IS
   SIGNAL ram_wr_en   : STD_LOGIC := '0';
   SIGNAL ram_wr_adr  : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0) := (OTHERS=>'0');
   SIGNAL ram_wr_dat  : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0) := (OTHERS=>'0');
-  SIGNAL ram_rd_en   : STD_LOGIC := '1';
+  SIGNAL ram_rd_en   : STD_LOGIC := '0';
   SIGNAL ram_rd_adr  : STD_LOGIC_VECTOR(c_ram.adr_w-1 DOWNTO 0);
   SIGNAL ram_rd_dat  : STD_LOGIC_VECTOR(c_ram.dat_w-1 DOWNTO 0);
   SIGNAL ram_rd_val  : STD_LOGIC;
 
+  SIGNAL exp_data    : NATURAL;
+
   SIGNAL init_done    : STD_LOGIC := '0';
   SIGNAL transfer_done : STD_LOGIC := '0';
   
@@ -95,13 +107,14 @@ BEGIN
   
   p_init_ram : PROCESS
   BEGIN
+    ram_wr_en <= '0';
     proc_common_wait_until_low(clk, rst);
     proc_common_wait_some_cycles(clk, 10);
     FOR i IN 0 TO c_ram.nof_dat-1 LOOP
       ram_wr_adr <= TO_UVEC(i, c_ram.adr_w);
       ram_wr_dat <= TO_UVEC(i, c_ram.dat_w);
       ram_wr_en <= '1'; 
-      proc_common_wait_some_cycles(clk, 2);
+      proc_common_wait_some_cycles(clk, 1);
     END LOOP;
     ram_wr_en <= '0'; 
 
@@ -111,11 +124,11 @@ BEGIN
 
   p_transfer : PROCESS
   BEGIN
-    proc_common_wait_until_high(clk, init_done);
-
+    start_pulse <= '0';
     start_address <= 0;
+    proc_common_wait_until_high(clk, init_done);
     start_pulse <= '1';
-    proc_common_wait_some_cycles(clk, 20);
+    proc_common_wait_some_cycles(clk, 1);
     start_pulse <= '0';
     proc_common_wait_until_high(clk, block_done);
     
@@ -124,18 +137,30 @@ BEGIN
   END PROCESS;
 
 
-  p_verify_ram : PROCESS
+  p_verify_set_ram_addr : PROCESS
+  VARIABLE v_word_index: NATURAL := 0;
+  VARIABLE v_step_index: NATURAL := 0;
+  VARIABLE v_ram_adr   : NATURAL := 0;
   BEGIN
+    ram_rd_en <= '0';
+    ram_rd_adr <= TO_UVEC(0 , c_ram.adr_w);
+    exp_data <= 0;
     proc_common_wait_until_high(clk, transfer_done);
-    
-    FOR i IN 0 TO c_ram.nof_dat-1 LOOP
-      ram_rd_adr <= TO_UVEC(i, c_ram.adr_w);
-      ram_rd_en <= '1';
-      proc_common_wait_some_cycles(clk, 1);
-      ram_rd_en <= '0'; 
-      ASSERT i = TO_UINT(ram_rd_dat) REPORT "RAM values not equal" SEVERITY ERROR;
+    WHILE v_ram_adr < c_ram.nof_dat LOOP
+      ram_rd_adr <= TO_UVEC(v_ram_adr , c_ram.adr_w);
+      ram_rd_en  <= '1';
       proc_common_wait_some_cycles(clk, 1);
+      exp_data <= v_ram_adr;
+      
+      IF v_word_index < g_data_size-1 THEN
+        v_word_index := v_word_index + 1;
+      ELSE
+        v_word_index := 0;
+        v_step_index := v_step_index + g_step_size;
+      END IF;
+      v_ram_adr := start_address + v_step_index + v_word_index;
     END LOOP;
+    ram_rd_en <= '0'; 
 
     proc_common_wait_some_cycles(clk, 10);
     tb_end <= '1';
@@ -143,6 +168,19 @@ BEGIN
   END PROCESS;
 
 
+  p_verify_check_ram_values: PROCESS
+  BEGIN
+    proc_common_wait_until_high(clk, transfer_done);
+    WHILE tb_end = '0' LOOP
+      WAIT UNTIL rising_edge(clk);
+      IF ram_rd_val = '1' THEN
+        ASSERT exp_data = TO_UINT(ram_rd_dat) REPORT "RAM values not equal" SEVERITY ERROR;
+      END IF;
+    END LOOP;
+    WAIT;
+  END PROCESS;
+
+
   -- RAM with test data
   u_ram_rd: ENTITY common_lib.common_ram_r_w
   GENERIC MAP (
@@ -162,7 +200,7 @@ BEGIN
 
   
   -- DUT : dp_block_from_mm
-  u_dut: ENTITY work.dp_block_from_mm
+  u_dp_block_from_mm: ENTITY work.dp_block_from_mm
   GENERIC MAP (
     g_data_size => g_data_size,
     g_step_size => g_step_size,
@@ -184,7 +222,7 @@ BEGIN
   );
     
   -- convert mm back to block
-  u_tets: ENTITY work.dp_block_to_mm
+  u_dp_block_to_mm: ENTITY work.dp_block_to_mm
   GENERIC MAP (
     g_data_size => g_data_size,
     g_step_size => g_step_size,
@@ -197,10 +235,9 @@ BEGIN
     start_address => start_address,
 
     mm_mosi       => wr_mosi,
-    mm_miso       => wr_miso,
+    --mm_miso       => wr_miso,
 
-    in_sosi      => blk_sosi,
-    in_siso      => blk_siso
+    in_sosi      => blk_sosi
   );
 
   -- RAM with converted result