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 3e83fa5562545c0bd7d124192bedb2672abf3e15..4b88f228595ecc68035b9fa574b36064ebe8b91e 100644
--- a/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
+++ b/libraries/base/dp/src/vhdl/dp_block_from_mm.vhd
@@ -38,6 +38,7 @@ ENTITY dp_block_from_mm IS
     g_step_size          : NATURAL;
     g_nof_data           : NATURAL;
     g_data_w             : NATURAL := c_word_w;
+    g_mm_rd_latency      : NATURAL := 1;  -- default 1 from rd_en to rd_val, use 2 to ease timing closure
     g_reverse_word_order : BOOLEAN := FALSE
   ); 
   PORT (
@@ -71,8 +72,15 @@ ARCHITECTURE rtl OF dp_block_from_mm IS
 
   SIGNAL r     : t_reg;
   SIGNAL nxt_r : t_reg;
+
   SIGNAL mm_address      : NATURAL := 0;
   SIGNAL last_mm_address : NATURAL := 0;
+
+  SIGNAL r_sop_p  : STD_LOGIC;
+  SIGNAL r_eop_p  : STD_LOGIC;
+  SIGNAL out_sop  : STD_LOGIC;
+  SIGNAL out_eop  : STD_LOGIC;
+
 BEGIN
 
   last_mm_address <= g_step_size * (g_nof_data - 1) + g_data_size + start_address - 1;
@@ -80,15 +88,21 @@ BEGIN
   
   mm_mosi.address <= TO_MEM_ADDRESS(mm_address);
 
-  u_sosi : PROCESS(r, mm_miso)
+  -- Take care of g_mm_rd_latency for out_sosi.sop and out_sosi.eop
+  r_sop_p <= r.sop WHEN rising_edge(clk);
+  r_eop_p <= r.eop WHEN rising_edge(clk);
+  out_sop <= r.sop WHEN g_mm_rd_latency = 1 ELSE r_sop_p;
+  out_eop <= r.eop WHEN g_mm_rd_latency = 1 ELSE r_eop_p;
+
+  u_sosi : PROCESS(r, mm_miso, out_sop, out_eop)
   BEGIN
     out_sosi       <= c_dp_sosi_rst;  -- To avoid Modelsim warnings on conversion to integer from unused fields.
     out_sosi.data  <= RESIZE_DP_DATA(mm_miso.rddata(g_data_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
+    out_sosi.sop   <= out_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   <= out_eop;        -- read latency from mm_mosi.rd to mm_miso.rdval is 1, so r.eop can be used for output eop
   END PROCESS;
-  
+
   mm_done <= r.eop;
 
   p_reg : PROCESS(rst, clk)