mbist wrapper integration
diff --git a/openlane/yifive/base.sdc b/openlane/yifive/base.sdc
index 777ec2d..626a527 100644
--- a/openlane/yifive/base.sdc
+++ b/openlane/yifive/base.sdc
@@ -1,9 +1,4 @@
 ###############################################################################
-# Created by write_sdc
-# Mon Nov  8 09:31:35 2021
-###############################################################################
-current_design scr1_top_wb
-###############################################################################
 # Timing Constraints
 ###############################################################################
 create_clock -name core_clk -period 20.0000 [get_ports {core_clk}]
diff --git a/verilog/dv/user_basic/user_basic_tb.v b/verilog/dv/user_basic/user_basic_tb.v
index 47fe0bc..fbad972 100644
--- a/verilog/dv/user_basic/user_basic_tb.v
+++ b/verilog/dv/user_basic/user_basic_tb.v
@@ -151,8 +151,8 @@
 
 	`ifdef WFDUMP
 	   initial begin
-	   	$dumpfile("risc_boot.vcd");
-	   	$dumpvars(3, user_basic_tb);
+	   	$dumpfile("simx.vcd");
+	   	$dumpvars(4, user_basic_tb);
 	   end
        `endif
 
diff --git a/verilog/dv/user_spi/user_spi_tb.v b/verilog/dv/user_spi/user_spi_tb.v
index 137fc2a..2396183 100644
--- a/verilog/dv/user_spi/user_spi_tb.v
+++ b/verilog/dv/user_spi/user_spi_tb.v
@@ -201,12 +201,13 @@
 
 	`ifdef WFDUMP
 	   initial begin
-	   	$dumpfile("user_spi.vcd");
+	   	$dumpfile("simx.vcd");
 	   	$dumpvars(5, user_spi_tb);
 	   end
        `endif
 
 	initial begin
+		$dumpon;
 
 		#200; // Wait for reset removal
 	        repeat (10) @(posedge clock);
@@ -259,6 +260,7 @@
 		wb_user_core_read_check(32'h00000314,read_data,32'h004902B7);
 		wb_user_core_read_check(32'h00000318,read_data,32'h03130291);
 		wb_user_core_read_check(32'h0000031C,read_data,32'ha0230630);
+		$dumpoff;
 		$display("#############################################");
 		$display("Testing Direct SPI Memory Read              ");
 		$display(" SPI Mode: Normal/Single Bit                ");
@@ -1165,10 +1167,10 @@
    wire #1 io_oeb_27 = io_oeb[27];
    wire #1 io_oeb_28 = io_oeb[28];
    wire #1 io_oeb_29 = io_oeb[29];
-   tri  flash_io0 = (io_oeb_26== 1'b0) ? io_out[26] : 1'bz;
-   tri  flash_io1 = (io_oeb_27== 1'b0) ? io_out[27] : 1'bz;
-   tri  flash_io2 = (io_oeb_28== 1'b0) ? io_out[28] : 1'bz;
-   tri  flash_io3 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
+   tri  #1 flash_io0 = (io_oeb_26== 1'b0) ? io_out[26] : 1'bz;
+   tri  #1 flash_io1 = (io_oeb_27== 1'b0) ? io_out[27] : 1'bz;
+   tri  #1 flash_io2 = (io_oeb_28== 1'b0) ? io_out[28] : 1'bz;
+   tri  #1 flash_io3 = (io_oeb_29== 1'b0) ? io_out[29] : 1'bz;
 
    assign io_in[26] = flash_io0;
    assign io_in[27] = flash_io1;
diff --git a/verilog/rtl/lib/wb_stagging.sv b/verilog/rtl/lib/wb_stagging.sv
index 8f54f0f..2661005 100644
--- a/verilog/rtl/lib/wb_stagging.sv
+++ b/verilog/rtl/lib/wb_stagging.sv
@@ -81,21 +81,27 @@
          input   logic	[31:0]	m_wbd_dat_i,
          input   logic  [31:0]	m_wbd_adr_i,
          input   logic  [3:0]	m_wbd_sel_i,
+         input   logic  [9:0]	m_wbd_bl_i,
+         input   logic  	m_wbd_bry_i,
          input   logic  	m_wbd_we_i,
          input   logic  	m_wbd_cyc_i,
          input   logic  	m_wbd_stb_i,
          input   logic  [3:0]	m_wbd_tid_i,
          output  logic	[31:0]	m_wbd_dat_o,
          output  logic		m_wbd_ack_o,
+         output  logic		m_wbd_lack_o,
          output  logic		m_wbd_err_o,
 
          // Slave Interface
          input	logic [31:0]	s_wbd_dat_i,
          input	logic 	        s_wbd_ack_i,
+         input	logic 	        s_wbd_lack_i,
          input	logic 	        s_wbd_err_i,
          output	logic [31:0]	s_wbd_dat_o,
          output	logic [31:0]	s_wbd_adr_o,
          output	logic [3:0]	s_wbd_sel_o,
+         output	logic [9:0]	s_wbd_bl_o,
+         output	logic    	s_wbd_bry_o,
          output	logic 	        s_wbd_we_o,
          output	logic 	        s_wbd_cyc_o,
          output	logic 	        s_wbd_stb_o,
@@ -103,22 +109,26 @@
 
 );
 
-logic        holding_busy   ; // Indicate Stagging for Free or not
 logic [31:0] m_wbd_dat_i_ff ; // Flopped vesion of m_wbd_dat_i
 logic [31:0] m_wbd_adr_i_ff ; // Flopped vesion of m_wbd_adr_i
 logic [3:0]  m_wbd_sel_i_ff ; // Flopped vesion of m_wbd_sel_i
+logic [9:0]  m_wbd_bl_i_ff ;  // Flopped vesion of m_wbd_bl_i
+logic        m_wbd_bry_i_ff ; // Flopped vesion of m_wbd_bry_i
 logic        m_wbd_we_i_ff  ; // Flopped vesion of m_wbd_we_i
 logic        m_wbd_cyc_i_ff ; // Flopped vesion of m_wbd_cyc_i
 logic        m_wbd_stb_i_ff ; // Flopped vesion of m_wbd_stb_i
 logic [3:0]  m_wbd_tid_i_ff ; // Flopped vesion of m_wbd_tid_i
 logic [31:0] s_wbd_dat_i_ff ; // Flopped vesion of s_wbd_dat_i
 logic        s_wbd_ack_i_ff ; // Flopped vesion of s_wbd_ack_i
+logic        s_wbd_lack_i_ff ; // Flopped vesion of s_wbd_ack_i
 logic        s_wbd_err_i_ff ; // Flopped vesion of s_wbd_err_i
 
 
 assign s_wbd_dat_o = m_wbd_dat_i_ff;
 assign s_wbd_adr_o = m_wbd_adr_i_ff;
 assign s_wbd_sel_o = m_wbd_sel_i_ff;
+assign s_wbd_bl_o  = m_wbd_bl_i_ff;
+assign s_wbd_bry_o = m_wbd_bry_i_ff;
 assign s_wbd_we_o  = m_wbd_we_i_ff;
 assign s_wbd_cyc_o = m_wbd_cyc_i_ff;
 assign s_wbd_stb_o = m_wbd_stb_i_ff;
@@ -126,28 +136,32 @@
 
 assign m_wbd_dat_o = s_wbd_dat_i_ff;
 assign m_wbd_ack_o = s_wbd_ack_i_ff;
+assign m_wbd_lack_o = s_wbd_lack_i_ff;
 assign m_wbd_err_o = s_wbd_err_i_ff;
 
 always @(negedge rst_n or posedge clk_i)
 begin
    if(rst_n == 1'b0) begin
-       holding_busy   <= 1'b0;
        m_wbd_dat_i_ff <= 'h0;
        m_wbd_adr_i_ff <= 'h0;
        m_wbd_sel_i_ff <= 'h0;
+       m_wbd_bl_i_ff  <= 'h0;
+       m_wbd_bry_i_ff <= 'b0;
        m_wbd_we_i_ff  <= 'h0;
        m_wbd_cyc_i_ff <= 'h0;
        m_wbd_stb_i_ff <= 'h0;
        m_wbd_tid_i_ff <= 'h0;
        s_wbd_dat_i_ff <= 'h0;
        s_wbd_ack_i_ff <= 'h0;
+       s_wbd_lack_i_ff <= 'h0;
        s_wbd_err_i_ff <= 'h0;
    end else begin
-       s_wbd_dat_i_ff <= s_wbd_dat_i;
-       s_wbd_ack_i_ff <= s_wbd_ack_i;
+       s_wbd_dat_i_ff  <= s_wbd_dat_i;
+       s_wbd_ack_i_ff  <= s_wbd_ack_i;
+       s_wbd_lack_i_ff <= s_wbd_lack_i;
        s_wbd_err_i_ff <= s_wbd_err_i;
-       if(m_wbd_stb_i && holding_busy == 0 && m_wbd_ack_o == 0) begin
-          holding_busy   <= 1'b1;
+       if((m_wbd_stb_i && m_wbd_bry_i && s_wbd_ack_i == 0 && m_wbd_lack_o == 0) ||
+          (m_wbd_stb_i && m_wbd_bry_i && s_wbd_ack_i == 1 && s_wbd_lack_i == 0)) begin
           m_wbd_dat_i_ff <= m_wbd_dat_i;
           m_wbd_adr_i_ff <= m_wbd_adr_i;
           m_wbd_sel_i_ff <= m_wbd_sel_i;
@@ -155,8 +169,11 @@
           m_wbd_cyc_i_ff <= m_wbd_cyc_i;
           m_wbd_stb_i_ff <= m_wbd_stb_i;
           m_wbd_tid_i_ff <= m_wbd_tid_i;
-       end else if (holding_busy && s_wbd_ack_i) begin
-          holding_busy   <= 1'b0;
+          m_wbd_bl_i_ff  <= m_wbd_bl_i;
+          m_wbd_bry_i_ff <= 'b1;
+       end else  if ((m_wbd_stb_i && !m_wbd_bry_i && s_wbd_ack_i == 1 && s_wbd_lack_i == 0)) begin // De-Assert burst ready
+          m_wbd_bry_i_ff <= 'b0;
+       end else if (s_wbd_lack_i) begin
           m_wbd_dat_i_ff <= 'h0;
           m_wbd_adr_i_ff <= 'h0;
           m_wbd_sel_i_ff <= 'h0;
@@ -164,6 +181,8 @@
           m_wbd_cyc_i_ff <= 'h0;
           m_wbd_stb_i_ff <= 'h0;
           m_wbd_tid_i_ff <= 'h0;
+          m_wbd_bl_i_ff  <= 'h0;
+          m_wbd_bry_i_ff <= 'b0;
        end
    end
 end
diff --git a/verilog/rtl/mbist_wrapper/src/mbist_wrapper.sv b/verilog/rtl/mbist_wrapper/src/mbist_wrapper.sv
new file mode 100644
index 0000000..e33134a
--- /dev/null
+++ b/verilog/rtl/mbist_wrapper/src/mbist_wrapper.sv
@@ -0,0 +1,319 @@
+//////////////////////////////////////////////////////////////////////////////
+// SPDX-FileCopyrightText: 2021 , Dinesh Annayya                          
+// 
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+// SPDX-License-Identifier: Apache-2.0
+// SPDX-FileContributor: Created by Dinesh Annayya <dinesha@opencores.org>
+//
+//////////////////////////////////////////////////////////////////////
+////                                                              ////
+////  MBIST TOP                                                   ////
+////                                                              ////
+////  This file is part of the mbist_ctrl cores project           ////
+////  https://github.com/dineshannayya/mbist_ctrl.git             ////
+////                                                              ////
+////  Description                                                 ////
+////      This block integrate mbist controller with row          ////
+////      redendency feature                                      ////
+////                                                              ////
+////  To Do:                                                      ////
+////    nothing                                                   ////
+////                                                              ////
+////  Author(s):                                                  ////
+////      - Dinesh Annayya, dinesha@opencores.org                 ////
+////                                                              ////
+////  Revision :                                                  ////
+////    0.0 - 11th Oct 2021, Dinesh A                             ////
+////          Initial integration                                 ////
+////    0.1 - 26th Oct 2021, Dinesh A                             ////
+////          Fixed Error Address are serial shifted through      ////
+////          sdi/sdo                                             ////
+////    0.2 - 15 Dec 2021, Dinesh A                               ////
+////          Added support for common MBIST for 4 SRAM           ////
+////    0.3 - 29th Dec 2021, Dinesh A                             ////
+////          yosys synthesis issue for two dimension variable    ////
+////          changed the variable defination from logic to wire  ////
+////                                                              ////
+//////////////////////////////////////////////////////////////////////
+
+`include "mbist_def.svh"
+module mbist_wrapper
+     #(  
+         parameter BIST_NO_SRAM           = 4,
+	 parameter BIST_ADDR_WD           = 9,
+	 parameter BIST_DATA_WD           = 32,
+	 parameter BIST_ADDR_START        = 9'h000,
+	 parameter BIST_ADDR_END          = 9'h1FB,
+	 parameter BIST_REPAIR_ADDR_START = 9'h1FC,
+	 parameter BIST_RAD_WD_I          = BIST_ADDR_WD,
+	 parameter BIST_RAD_WD_O          = BIST_ADDR_WD) (
+
+`ifdef USE_POWER_PINS
+    inout vccd1,	// User area 1 1.8V supply
+    inout vssd1,	// User area 1 digital ground
+`endif
+
+    // Clock Skew Adjust
+       input  wire                           wbd_clk_int, 
+       output wire                           wbd_clk_mbist,
+       input  wire [3:0]                     cfg_cska_mbist, // clock skew adjust for web host
+
+	input logic                            rst_n,
+
+	// MBIST I/F
+	input wire                           bist_en,
+	input wire                            bist_run,
+	input wire                            bist_shift,
+	input wire                            bist_load,
+	input wire                            bist_sdi,
+
+	output wire [3:0]                     bist_error_cnt0,
+	output wire [3:0]                     bist_error_cnt1,
+	output wire [3:0]                     bist_error_cnt2,
+	output wire [3:0]                     bist_error_cnt3,
+	output wire [BIST_NO_SRAM-1:0]        bist_correct   ,
+	output wire [BIST_NO_SRAM-1:0]        bist_error     ,
+	output wire                           bist_done,
+	output wire                           bist_sdo,
+
+
+        // WB I/F
+        input   wire                          wb_clk_i,  // System clock
+        input   wire                          wb_clk2_i, // System clock2 is no cts
+        input   wire                          wb_cyc_i,  // strobe/request
+        input   wire                          wb_stb_i,  // strobe/request
+	input   wire [(BIST_NO_SRAM+1)/2-1:0] wb_cs_i,
+        input   wire [BIST_ADDR_WD-1:0]       wb_adr_i,  // address
+        input   wire                          wb_we_i ,  // write
+        input   wire [BIST_DATA_WD-1:0]       wb_dat_i,  // data output
+        input   wire [BIST_DATA_WD/8-1:0]     wb_sel_i,  // byte enable
+        output  wire [BIST_DATA_WD-1:0]       wb_dat_o,  // data input
+        output  wire                          wb_ack_o,  // acknowlegement
+        output  wire                          wb_err_o  // error
+
+
+
+
+
+);
+
+parameter     BIST_NO_SRAM= 4; // NO of MBIST MEMORY
+parameter  NO_SRAM_WD = (BIST_NO_SRAM+1)/2;
+parameter     BIST1_ADDR_WD = 11; // 512x32 SRAM
+parameter     BIST_DATA_WD = 32;
+
+// FUNCTIONAL PORT 
+// towards memory MBIST1
+// PORT-A
+wire   [BIST_NO_SRAM-1:0]      mem_clk_a;
+wire   [BIST1_ADDR_WD-1:2]     mem0_addr_a;
+wire   [BIST1_ADDR_WD-1:2]     mem1_addr_a;
+wire   [BIST1_ADDR_WD-1:2]     mem2_addr_a;
+wire   [BIST1_ADDR_WD-1:2]     mem3_addr_a;
+wire   [BIST_NO_SRAM-1:0]      mem_cen_a;
+wire   [BIST_NO_SRAM-1:0]      mem_web_a;
+wire [BIST_DATA_WD/8-1:0]      mem0_mask_a;
+wire [BIST_DATA_WD/8-1:0]      mem1_mask_a;
+wire [BIST_DATA_WD/8-1:0]      mem2_mask_a;
+wire [BIST_DATA_WD/8-1:0]      mem3_mask_a;
+wire   [BIST_DATA_WD-1:0]      mem0_din_a;
+wire   [BIST_DATA_WD-1:0]      mem1_din_a;
+wire   [BIST_DATA_WD-1:0]      mem2_din_a;
+wire   [BIST_DATA_WD-1:0]      mem3_din_a;
+wire   [BIST_DATA_WD-1:0]      mem0_dout_a;
+wire   [BIST_DATA_WD-1:0]      mem1_dout_a;
+wire   [BIST_DATA_WD-1:0]      mem2_dout_a;
+wire   [BIST_DATA_WD-1:0]      mem3_dout_a;
+
+// PORT-B
+wire [BIST_NO_SRAM-1:0]        mem_clk_b;
+wire [BIST_NO_SRAM-1:0]        mem_cen_b;
+wire [BIST1_ADDR_WD-1:2]       mem0_addr_b;
+wire [BIST1_ADDR_WD-1:2]       mem1_addr_b;
+wire [BIST1_ADDR_WD-1:2]       mem2_addr_b;
+wire [BIST1_ADDR_WD-1:2]       mem3_addr_b;
+
+
+mbist_top  #(
+	`ifndef SYNTHESIS
+	.BIST_NO_SRAM           (4                      ),
+	.BIST_ADDR_WD           (BIST1_ADDR_WD-2        ),
+	.BIST_DATA_WD           (BIST_DATA_WD           ),
+	.BIST_ADDR_START        (9'h000                 ),
+	.BIST_ADDR_END          (9'h1FB                 ),
+	.BIST_REPAIR_ADDR_START (9'h1FC                 ),
+	.BIST_RAD_WD_I          (BIST1_ADDR_WD-2        ),
+	.BIST_RAD_WD_O          (BIST1_ADDR_WD-2        )
+        `endif
+     ) 
+	     u_mbist (
+
+`ifdef USE_POWER_PINS
+       .vccd1                  (vccd1                     ),// User area 1 1.8V supply
+       .vssd1                  (vssd1                     ),// User area 1 digital ground
+`endif
+
+     // Clock Skew adjust
+	.wbd_clk_int          (wbd_clk_int          ), 
+	.cfg_cska_mbist       (cfg_cska_mbist       ), 
+	.wbd_clk_mbist        (wbd_clk_mbist        ),
+
+	// WB I/F
+        .wb_clk2_i            (wb_clk2_i            ),  
+        .wb_clk_i             (wb_clk_i             ),  
+        .wb_cyc_i             (wb_cyc_i             ),  
+        .wb_stb_i             (wb_stb_i             ),  
+	.wb_cs_i              (wb_cs_i              ),
+        .wb_adr_i             (wb_adr_i             ),  
+        .wb_we_i              (wb_we_i              ),  
+        .wb_dat_i             (wb_dat_i             ),  
+        .wb_sel_i             (wb_sel_i             ),  
+        .wb_dat_o             (wb_dat_o             ),  
+        .wb_ack_o             (wb_ack_o             ),  
+        .wb_err_o             (                     ), 
+
+	.rst_n                (rst_n                ),
+
+	
+	.bist_en              (bist_en              ),
+	.bist_run             (bist_run             ),
+	.bist_shift           (bist_shift           ),
+	.bist_load            (bist_load            ),
+	.bist_sdi             (bist_sdi             ),
+
+	.bist_error_cnt3      (bist_error_cnt3  ),
+	.bist_error_cnt2      (bist_error_cnt2  ),
+	.bist_error_cnt1      (bist_error_cnt1  ),
+	.bist_error_cnt0      (bist_error_cnt0  ),
+	.bist_correct         (bist_correct     ),
+	.bist_error           (bist_error       ),
+	.bist_done            (bist_done        ),
+	.bist_sdo             (bist_sdo         ),
+
+     // towards memory
+     // PORT-A
+        .mem_clk_a            (mem_clk_a         ),
+        .mem_addr_a0          (mem0_addr_a       ),
+        .mem_addr_a1          (mem1_addr_a       ),
+        .mem_addr_a2          (mem2_addr_a       ),
+        .mem_addr_a3          (mem3_addr_a       ),
+        .mem_cen_a            (mem_cen_a         ),
+        .mem_web_a            (mem_web_a         ),
+        .mem_mask_a0          (mem0_mask_a       ),
+        .mem_mask_a1          (mem1_mask_a       ),
+        .mem_mask_a2          (mem2_mask_a       ),
+        .mem_mask_a3          (mem3_mask_a       ),
+        .mem_din_a0           (mem0_din_a        ),
+        .mem_din_a1           (mem1_din_a        ),
+        .mem_din_a2           (mem2_din_a        ),
+        .mem_din_a3           (mem3_din_a        ),
+        .mem_dout_a0          (mem0_dout_a       ),
+        .mem_dout_a1          (mem1_dout_a       ),
+        .mem_dout_a2          (mem2_dout_a       ),
+        .mem_dout_a3          (mem3_dout_a       ),
+     // PORT-B
+        .mem_clk_b            (mem_clk_b         ),
+        .mem_cen_b            (mem_cen_b         ),
+        .mem_addr_b0          (mem0_addr_b       ),
+        .mem_addr_b1          (mem1_addr_b       ),
+        .mem_addr_b2          (mem2_addr_b       ),
+        .mem_addr_b3          (mem3_addr_b       )
+
+
+);
+
+
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram0_2kb(
+`ifdef USE_POWER_PINS
+    .vccd1 (vccd1),// User area 1 1.8V supply
+    .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+    .clk0     (mem_clk_a[0]),
+    .csb0     (mem_cen_a[0]),
+    .web0     (mem_web_a[0]),
+    .wmask0   (mem0_mask_a),
+    .addr0    (mem0_addr_a),
+    .din0     (mem0_din_a),
+    .dout0    (mem0_dout_a),
+// Port 1: R
+    .clk1     (mem_clk_b[0]),
+    .csb1     (mem_cen_b[0]),
+    .addr1    (mem0_addr_b),
+    .dout1    ()
+  );
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram1_2kb(
+`ifdef USE_POWER_PINS
+    .vccd1 (vccd1),// User area 1 1.8V supply
+    .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+    .clk0     (mem_clk_a[1]),
+    .csb0     (mem_cen_a[1]),
+    .web0     (mem_web_a[1]),
+    .wmask0   (mem1_mask_a),
+    .addr0    (mem1_addr_a),
+    .din0     (mem1_din_a),
+    .dout0    (mem1_dout_a),
+// Port 1: R
+    .clk1     (mem_clk_b[1]),
+    .csb1     (mem_cen_b[1]),
+    .addr1    (mem1_addr_b),
+    .dout1    ()
+  );
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram2_2kb(
+`ifdef USE_POWER_PINS
+    .vccd1 (vccd1),// User area 1 1.8V supply
+    .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+    .clk0     (mem_clk_a[2]),
+    .csb0     (mem_cen_a[2]),
+    .web0     (mem_web_a[2]),
+    .wmask0   (mem2_mask_a),
+    .addr0    (mem2_addr_a),
+    .din0     (mem2_din_a),
+    .dout0    (mem2_dout_a),
+// Port 1: R
+    .clk1     (mem_clk_b[2]),
+    .csb1     (mem_cen_b[2]),
+    .addr1    (mem2_addr_b),
+    .dout1    ()
+  );
+
+
+sky130_sram_2kbyte_1rw1r_32x512_8 u_sram3_2kb(
+`ifdef USE_POWER_PINS
+    .vccd1 (vccd1),// User area 1 1.8V supply
+    .vssd1 (vssd1),// User area 1 digital ground
+`endif
+// Port 0: RW
+    .clk0     (mem_clk_a[3]),
+    .csb0     (mem_cen_a[3]),
+    .web0     (mem_web_a[3]),
+    .wmask0   (mem3_mask_a),
+    .addr0    (mem3_addr_a),
+    .din0     (mem3_din_a),
+    .dout0    (mem3_dout_a),
+// Port 1: R
+    .clk1     (mem_clk_b[3]),
+    .csb1     (mem_cen_b[3]),
+    .addr1    (mem3_addr_b),
+    .dout1    ()
+  );
+
+endmodule
+
diff --git a/verilog/rtl/qspim b/verilog/rtl/qspim
index b9ef372..f7a1f82 160000
--- a/verilog/rtl/qspim
+++ b/verilog/rtl/qspim
@@ -1 +1 @@
-Subproject commit b9ef37289d55f9982427331b4621dc531a09d1d1
+Subproject commit f7a1f824fda54c5103bcbd5b9401f36d28551491
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index fb4aea9..0c0f7cf 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -280,9 +280,12 @@
 wire                           wbd_spim_we_o;  // write
 wire   [WB_WIDTH-1:0]          wbd_spim_dat_o; // data output
 wire   [3:0]                   wbd_spim_sel_o; // byte enable
+wire   [9:0]                   wbd_spim_bl_o;  // Burst count
+wire                           wbd_spim_bry_o; // Busrt Ready
 wire                           wbd_spim_cyc_o ;
 wire   [WB_WIDTH-1:0]          wbd_spim_dat_i; // data input
 wire                           wbd_spim_ack_i; // acknowlegement
+wire                           wbd_spim_lack_i;// Last acknowlegement
 wire                           wbd_spim_err_i;  // error
 
 //---------------------------------------------------------------------
@@ -347,6 +350,7 @@
 wire                              i2c_rst_n     ;// i2c reset
 wire                              usb_rst_n     ;// i2c reset
 wire   [3:0]                      boot_remap    ;// Boot Remap
+wire   [3:0]                      dcache_remap  ;// Remap the dcache address
 wire                              cpu_clk       ;
 wire                              rtc_clk       ;
 wire                              usb_clk       ;
@@ -599,6 +603,7 @@
 assign  cfg_cska_mbist2   = cfg_clk_ctrl2[7:4];
 assign  cfg_cska_mbist3   = cfg_clk_ctrl2[11:8];
 assign  cfg_cska_mbist4   = cfg_clk_ctrl2[15:12];
+assign  dcache_remap      = cfg_clk_ctrl2[27:24];
 assign  boot_remap        = cfg_clk_ctrl2[31:28];
 
 //assign la_data_out    = {riscv_debug,spi_debug,sdram_debug};
@@ -840,8 +845,11 @@
     .wbd_we_i               (wbd_spim_we_o             ), 
     .wbd_dat_i              (wbd_spim_dat_o            ),
     .wbd_sel_i              (wbd_spim_sel_o            ),
+    .wbd_bl_i               (wbd_spim_bl_o             ),
+    .wbd_bry_i              (wbd_spim_bry_o            ),
     .wbd_dat_o              (wbd_spim_dat_i            ),
     .wbd_ack_o              (wbd_spim_ack_i            ),
+    .wbd_lack_o             (wbd_spim_lack_i           ),
     .wbd_err_o              (wbd_spim_err_i            ),
 
     .spi_debug              (spi_debug                 ),
@@ -969,6 +977,7 @@
 
          .clk_i         (wbd_clk_wi_skew       ), 
          .rst_n         (wbd_int_rst_n         ),
+	 .dcache_remap  (dcache_remap          ),
 	 .boot_remap    (boot_remap            ),
 
          // Master 0 Interface
@@ -1009,8 +1018,11 @@
          // .s0_wbd_err_i  (1'b0           ), - Moved inside IP
          .s0_wbd_dat_i  (wbd_spim_dat_i ),
          .s0_wbd_ack_i  (wbd_spim_ack_i ),
+         .s0_wbd_lack_i (wbd_spim_lack_i ),
          .s0_wbd_dat_o  (wbd_spim_dat_o ),
          .s0_wbd_adr_o  (wbd_spim_adr_o ),
+         .s0_wbd_bry_o  (wbd_spim_bry_o ),
+         .s0_wbd_bl_o   (wbd_spim_bl_o ),
          .s0_wbd_sel_o  (wbd_spim_sel_o ),
          .s0_wbd_we_o   (wbd_spim_we_o  ),  
          .s0_wbd_cyc_o  (wbd_spim_cyc_o ),
diff --git a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
index f6ee7d8..14e716e 100644
--- a/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
+++ b/verilog/rtl/wb_interconnect/src/wb_interconnect.sv
@@ -122,6 +122,13 @@
 	 input logic  [3:0]     boot_remap, // When remap is enabled
 	                                     // [0] - 0x0000_0000 - 0x0000_07FF Map to MBIST1
 					     // [1] - 0x0000_0800 - 0x0000_0FFF Map to MBIST2
+					     // [2] - 0x0000_1000 - 0x0000_17FF Map to MBIST3
+					     // [3] - 0x0000_1800 - 0x0000_1FFF Map to MBIST4
+	 input logic  [3:0]     dcache_remap, // When dcache remap is enabled, 
+	                                     // [0] - 0x0800_0000 - 0x0800_07FF Map to MBIST1
+					     // [1] - 0x0800_0800 - 0x0800_0FFF Map to MBIST2
+					     // [2] - 0x0800_1000 - 0x0800_17FF Map to MBIST3
+					     // [3] - 0x0800_1800 - 0x0800_1FFF Map to MBIST4
          
          // Master 0 Interface
          input   logic	[31:0]	m0_wbd_dat_i,
@@ -132,6 +139,7 @@
          input   logic  	m0_wbd_stb_i,
          output  logic	[31:0]	m0_wbd_dat_o,
          output  logic		m0_wbd_ack_o,
+         output  logic		m0_wbd_lack_o,
          output  logic		m0_wbd_err_o,
          
          // Master 1 Interface
@@ -143,6 +151,7 @@
          input	logic 	        m1_wbd_stb_i,
          output	logic [31:0]	m1_wbd_dat_o,
          output	logic 	        m1_wbd_ack_o,
+         output	logic 	        m1_wbd_lack_o,
          output	logic 	        m1_wbd_err_o,
          
          // Master 2 Interface
@@ -154,16 +163,20 @@
          input	logic 	        m2_wbd_stb_i,
          output	logic [31:0]	m2_wbd_dat_o,
          output	logic 	        m2_wbd_ack_o,
+         output	logic 	        m2_wbd_lack_o,
          output	logic 	        m2_wbd_err_o,
          
          
          // Slave 0 Interface
          input	logic [31:0]	s0_wbd_dat_i,
          input	logic 	        s0_wbd_ack_i,
+         input	logic 	        s0_wbd_lack_i,
          //input	logic 	s0_wbd_err_i, - unused
          output	logic [31:0]	s0_wbd_dat_o,
          output	logic [31:0]	s0_wbd_adr_o,
          output	logic [3:0]	s0_wbd_sel_o,
+         output	logic [9:0]	s0_wbd_bl_o,
+         output	logic 	        s0_wbd_bry_o,
          output	logic 	        s0_wbd_we_o,
          output	logic 	        s0_wbd_cyc_o,
          output	logic 	        s0_wbd_stb_o,
@@ -219,6 +232,8 @@
   logic	[31:0]	wbd_dat;
   logic  [31:0]	wbd_adr;
   logic  [3:0]	wbd_sel;
+  logic  [9:0]	wbd_bl;
+  logic  	wbd_bry;
   logic  	wbd_we;
   logic  	wbd_cyc;
   logic  	wbd_stb;
@@ -229,6 +244,7 @@
 typedef struct packed { 
   logic	[31:0]	wbd_dat;
   logic  	wbd_ack;
+  logic  	wbd_lack;
   logic  	wbd_err;
 } type_wb_rd_intf;
 
@@ -320,6 +336,10 @@
 	                      (boot_remap[1] && m1_wbd_adr_i[31:11] == 21'h1) ? TARGET_MBIST:
 	                      (boot_remap[2] && m1_wbd_adr_i[31:11] == 21'h2) ? TARGET_MBIST:
 	                      (boot_remap[3] && m1_wbd_adr_i[31:11] == 21'h3) ? TARGET_MBIST:
+			      (dcache_remap[0] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0000_0) ? TARGET_MBIST:
+	                      (dcache_remap[1] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0000_1) ? TARGET_MBIST:
+	                      (dcache_remap[2] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0001_0) ? TARGET_MBIST:
+	                      (dcache_remap[3] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0001_1) ? TARGET_MBIST:
 	                      (m1_wbd_adr_i[31:28] ==  4'b0000 ) ? TARGET_SPI_MEM :
                               (m1_wbd_adr_i[31:16] == 16'h1000 ) ? TARGET_SPI_REG :
                               (m1_wbd_adr_i[31:16] == 16'h1001 ) ? TARGET_UART :
@@ -331,6 +351,10 @@
 	                      (boot_remap[1] && m2_wbd_adr_i[31:11] == 21'h1) ? TARGET_MBIST:
 	                      (boot_remap[2] && m2_wbd_adr_i[31:11] == 21'h2) ? TARGET_MBIST:
 	                      (boot_remap[3] && m2_wbd_adr_i[31:11] == 21'h3) ? TARGET_MBIST:
+			      (dcache_remap[0] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0000_0) ? TARGET_MBIST:
+	                      (dcache_remap[1] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0000_1) ? TARGET_MBIST:
+	                      (dcache_remap[2] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0001_0) ? TARGET_MBIST:
+	                      (dcache_remap[3] && m1_wbd_adr_i[31:11] == 21'b0000_1000_0000_0000_0001_1) ? TARGET_MBIST:
 	                      (m2_wbd_adr_i[31:28] ==  4'b0000 ) ? TARGET_SPI_MEM :
                               (m2_wbd_adr_i[31:16] == 16'h1000 ) ? TARGET_SPI_REG :
                               (m2_wbd_adr_i[31:16] == 16'h1001 ) ? TARGET_UART : 
@@ -343,6 +367,8 @@
 assign m0_wb_wr.wbd_dat = m0_wbd_dat_i;
 assign m0_wb_wr.wbd_adr = {m0_wbd_adr_i[31:2],2'b00};
 assign m0_wb_wr.wbd_sel = m0_wbd_sel_i;
+assign m0_wb_wr.wbd_bl  = 'h1;
+assign m0_wb_wr.wbd_bry = 'b1;
 assign m0_wb_wr.wbd_we  = m0_wbd_we_i;
 assign m0_wb_wr.wbd_cyc = m0_wbd_cyc_i;
 assign m0_wb_wr.wbd_stb = m0_wbd_stb_i;
@@ -351,6 +377,8 @@
 assign m1_wb_wr.wbd_dat = m1_wbd_dat_i;
 assign m1_wb_wr.wbd_adr = {m1_wbd_adr_i[31:2],2'b00};
 assign m1_wb_wr.wbd_sel = m1_wbd_sel_i;
+assign m1_wb_wr.wbd_bl  = 'h1;
+assign m1_wb_wr.wbd_bry = 'b1;
 assign m1_wb_wr.wbd_we  = m1_wbd_we_i;
 assign m1_wb_wr.wbd_cyc = m1_wbd_cyc_i;
 assign m1_wb_wr.wbd_stb = m1_wbd_stb_i;
@@ -359,6 +387,8 @@
 assign m2_wb_wr.wbd_dat = m2_wbd_dat_i;
 assign m2_wb_wr.wbd_adr = {m2_wbd_adr_i[31:2],2'b00};
 assign m2_wb_wr.wbd_sel = m2_wbd_sel_i;
+assign m2_wb_wr.wbd_bl  = 'h1;
+assign m2_wb_wr.wbd_bry = 'b1;
 assign m2_wb_wr.wbd_we  = m2_wbd_we_i;
 assign m2_wb_wr.wbd_cyc = m2_wbd_cyc_i;
 assign m2_wb_wr.wbd_stb = m2_wbd_stb_i;
@@ -366,14 +396,17 @@
 
 assign m0_wbd_dat_o  =  m0_wb_rd.wbd_dat;
 assign m0_wbd_ack_o  =  m0_wb_rd.wbd_ack;
+assign m0_wbd_lack_o =  m0_wb_rd.wbd_lack;
 assign m0_wbd_err_o  =  m0_wb_rd.wbd_err;
 
 assign m1_wbd_dat_o  =  m1_wb_rd.wbd_dat;
 assign m1_wbd_ack_o  =  m1_wb_rd.wbd_ack;
+assign m1_wbd_lack_o =  m1_wb_rd.wbd_lack;
 assign m1_wbd_err_o  =  m1_wb_rd.wbd_err;
 
 assign m2_wbd_dat_o  =  m2_wb_rd.wbd_dat;
 assign m2_wbd_ack_o  =  m2_wb_rd.wbd_ack;
+assign m2_wbd_lack_o =  m2_wb_rd.wbd_lack;
 assign m2_wbd_err_o  =  m2_wb_rd.wbd_err;
 
 //----------------------------------------
@@ -383,6 +416,8 @@
  assign  s0_wbd_dat_o =  s0_wb_wr.wbd_dat ;
  assign  s0_wbd_adr_o =  s0_wb_wr.wbd_adr ;
  assign  s0_wbd_sel_o =  s0_wb_wr.wbd_sel ;
+ assign  s0_wbd_bl_o  =  s0_wb_wr.wbd_bl ;
+ assign  s0_wbd_bry_o =  s0_wb_wr.wbd_bry ;
  assign  s0_wbd_we_o  =  s0_wb_wr.wbd_we  ;
  assign  s0_wbd_cyc_o =  s0_wb_wr.wbd_cyc ;
  assign  s0_wbd_stb_o =  s0_wb_wr.wbd_stb ;
@@ -409,20 +444,24 @@
  assign  s3_wbd_stb_o =  s3_wb_wr.wbd_stb ;
  
  
- assign s0_wb_rd.wbd_dat  = s0_wbd_dat_i ;
- assign s0_wb_rd.wbd_ack  = s0_wbd_ack_i ;
+ assign s0_wb_rd.wbd_dat   = s0_wbd_dat_i ;
+ assign s0_wb_rd.wbd_ack   = s0_wbd_ack_i ;
+ assign s0_wb_rd.wbd_lack  = s0_wbd_lack_i ;
  assign s0_wb_rd.wbd_err  = 1'b0; // s0_wbd_err_i ; - unused
  
  assign s1_wb_rd.wbd_dat  = s1_wbd_dat_i ;
  assign s1_wb_rd.wbd_ack  = s1_wbd_ack_i ;
+ assign s1_wb_rd.wbd_lack  = s1_wbd_ack_i ;
  assign s1_wb_rd.wbd_err  = 1'b0; // s1_wbd_err_i ; - unused
  
  assign s2_wb_rd.wbd_dat  = s2_wbd_dat_i ;
  assign s2_wb_rd.wbd_ack  = s2_wbd_ack_i ;
+ assign s2_wb_rd.wbd_lack = s2_wbd_ack_i ;
  assign s2_wb_rd.wbd_err  = 1'b0; // s2_wbd_err_i ; - unused
 
  assign s3_wb_rd.wbd_dat  = s3_wbd_dat_i ;
  assign s3_wb_rd.wbd_ack  = s3_wbd_ack_i ;
+ assign s3_wb_rd.wbd_lack = s3_wbd_ack_i ;
  assign s3_wb_rd.wbd_err  = 1'b0; // s3_wbd_err_i ; - unused
 
 //
@@ -433,9 +472,9 @@
 wb_arb	u_wb_arb(
 	.clk(clk_i), 
 	.rstn(rst_n),
-	.req({	m2_wbd_stb_i & !m2_wbd_ack_o,
-		m1_wbd_stb_i & !m1_wbd_ack_o,
-		m0_wbd_stb_i & !m0_wbd_ack_o}),
+	.req({	m2_wbd_stb_i & !m2_wbd_lack_o,
+		m1_wbd_stb_i & !m1_wbd_lack_o,
+		m0_wbd_stb_i & !m0_wbd_lack_o}),
 	.gnt(gnt)
 );
 
@@ -484,21 +523,27 @@
          .m_wbd_dat_i      (m_bus_wr.wbd_dat    ),
          .m_wbd_adr_i      (m_bus_wr.wbd_adr    ),
          .m_wbd_sel_i      (m_bus_wr.wbd_sel    ),
+         .m_wbd_bl_i       (m_bus_wr.wbd_bl     ),
+         .m_wbd_bry_i      (m_bus_wr.wbd_bry    ),
          .m_wbd_we_i       (m_bus_wr.wbd_we     ),
          .m_wbd_cyc_i      (m_bus_wr.wbd_cyc    ),
          .m_wbd_stb_i      (m_bus_wr.wbd_stb    ),
          .m_wbd_tid_i      (m_bus_wr.wbd_tid    ),
          .m_wbd_dat_o      (m_bus_rd.wbd_dat    ),
          .m_wbd_ack_o      (m_bus_rd.wbd_ack    ),
+         .m_wbd_lack_o     (m_bus_rd.wbd_lack   ),
          .m_wbd_err_o      (m_bus_rd.wbd_err    ),
 
          // Slave Interface
          .s_wbd_dat_i      (s_bus_rd.wbd_dat    ),
          .s_wbd_ack_i      (s_bus_rd.wbd_ack    ),
+         .s_wbd_lack_i     (s_bus_rd.wbd_lack   ),
          .s_wbd_err_i      (s_bus_rd.wbd_err    ),
          .s_wbd_dat_o      (s_bus_wr.wbd_dat    ),
          .s_wbd_adr_o      (s_bus_wr.wbd_adr    ),
          .s_wbd_sel_o      (s_bus_wr.wbd_sel    ),
+         .s_wbd_bl_o       (s_bus_wr.wbd_bl    ),
+         .s_wbd_bry_o      (s_bus_wr.wbd_bry    ),
          .s_wbd_we_o       (s_bus_wr.wbd_we     ),
          .s_wbd_cyc_o      (s_bus_wr.wbd_cyc    ),
          .s_wbd_stb_o      (s_bus_wr.wbd_stb    ),