diff --git a/verif/tb/verilog/nanosoc_tb_qs.v b/verif/tb/verilog/nanosoc_tb_qs.v
index feb123f8d7ae1be1d222c6fedc97e25a3ff3f7eb..a79fca87865ec3ce8070499990c904254a4c5875 100644
--- a/verif/tb/verilog/nanosoc_tb_qs.v
+++ b/verif/tb/verilog/nanosoc_tb_qs.v
@@ -1,5 +1,5 @@
 //-----------------------------------------------------------------------------
-// NanoSoC Testbench adpated from example Cortex-M0 controller testbench - QUICKSTART
+// NanoSoC Testbench adpated from example Cortex-M0 controller testbench
 // A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
 //
 // Contributors
@@ -36,12 +36,16 @@
 //-----------------------------------------------------------------------------
 //
 `timescale 1ns/1ps
+`include "gen_defines.v"
 
 module nanosoc_tb_qs;
 
   wire        CLK;   // crystal pin 1
   wire        TEST;  // 0 for system usage
   wire        NRST;    // active low reset
+  wire        NRST_early;  // active low reset
+  wire        NRST_late;   // active low reset
+  wire        NRST_ext;    // active low reset
 
   wire [15:0] P0;      // Port 0
   wire [15:0] P1;      // Port 1
@@ -64,15 +68,16 @@ module nanosoc_tb_qs;
   wire        debug_running; // indicate debug test is running
   wire        debug_err;     // indicate debug test has error
 
-  wire        debug_test_en1;
-  wire        debug_test_en2;
+  wire        debug_test_en1; // UART2 output trace (CMSDK)
+  wire        debug_test_en2; // FT1248 output trace (nanosoc V1)
+  wire        debug_test_en3; // EXTIO output trace (nanosoc V2)
   wire        debug_test_en; // To enable the debug tester connection to MCU GPIO P0
                              // This signal is controlled by software,
                              // Use "UartPutc((char) 0x1B)" to send ESCAPE code to start
                              // the command, use "UartPutc((char) 0x11)" to send debug test
                              // enable command, use "UartPutc((char) 0x12)" to send debug test
                              // disable command. Refer to tb_uart_capture.v file for detail
-  assign debug_test_en = debug_test_en1 | debug_test_en2; // FT1248 or UART2 control
+  assign debug_test_en = debug_test_en1 | debug_test_en2 | debug_test_en3; // UART2, FT1248 or EXTIO
 
   //-----------------------------------------
   // System options
@@ -87,7 +92,10 @@ localparam BE=0;
   localparam ADP_FILENAME="adp.cmd";
 `endif
 
+localparam DATA_IN_FILENAME="data_in.csv";
+localparam DATA_OUT_FILENAME="logs/data_out.csv";
 
+/*
 SROM_Ax32
   #(.ADDRWIDTH (8),
     .filename ("bootrom/hex/bootloader.hex"),
@@ -99,11 +107,30 @@ SROM_Ax32
     .SEL(1'b0),
     .RDATA( )
   );
-  
+*/
+
+`ifdef SDF_SIM
+initial
+  $sdf_annotate ( "../../../src/rtl/nanosoc_chip_pads_44pin.sdf"
+                 , u_nanosoc_chip_pads
+                 ,
+                 , "sdf_annotate.log"
+                 , "MAXIMUM"
+                 );
+`endif // SDF_SIM
+
+`ifdef VCD_SIM
+initial begin
+  $dumpfile("waves.vcd");
+  $dumpvars(6,u_nanosoc_chip_pads);
+  end
+`endif // VCD_SIM
+
  // --------------------------------------------------------------------------------
  // Cortex-M0/Cortex-M0+ Microcontroller
  // --------------------------------------------------------------------------------
 
+`ifdef SDF_SIM
   nanosoc_chip_pads
    u_nanosoc_chip_pads (
 `ifdef POWER_PINS
@@ -115,14 +142,33 @@ SROM_Ax32
 `endif
   .SE         (1'b0),
   .CLK        (CLK),  // input
-  .TEST       (TEST),  // output
+  .TEST       (TEST),  // input
   .NRST       (NRST),   // active low reset
-  .P0         (P0),
-  .P1         (P1),
+  .P0         (P0[7:0]),
+  .P1         (P1[7:0]),
   .SWDIO      (SWDIOTMS),
   .SWDCK      (SWCLKTCK)
   );
-
+`else
+  nanosoc_chip_pads
+   u_nanosoc_chip_pads (
+`ifdef POWER_PINS
+  .VDDIO      (VDDIO),
+  .VSSIO      (VSSIO),
+  .VDD        (VDD),
+  .VSS        (VSS),
+  .VDDACC     (VDDACC),
+`endif
+  .SE         (1'b0),
+  .CLK        (CLK),  // input
+  .TEST       (TEST),  // input
+  .NRST       (NRST),   // active low reset
+  .P0         (P0[15:0]),
+  .P1         (P1[15:0]),
+  .SWDIO      (SWDIOTMS),
+  .SWDCK      (SWCLKTCK)
+  );
+`endif
  // --------------------------------------------------------------------------------
  // Source for clock and reset
  // --------------------------------------------------------------------------------
@@ -130,14 +176,14 @@ SROM_Ax32
   nanosoc_clkreset u_nanosoc_clkreset(
   .CLK       (CLK),
   .NRST      (NRST),
-  .NRST_early( ),
-  .NRST_late ( ),
-  .NRST_ext  ( )
+  .NRST_early(NRST_early),
+  .NRST_late (NRST_late),
+  .NRST_ext  (NRST_ext )
   );
   `endif
 
   assign TEST = 1'b0;
-
+  
   // Pullup to suppress X-inputs
   pullup(P0[ 0]);
   pullup(P0[ 1]);
@@ -292,20 +338,6 @@ extio8x4_axis_target u_extio8x4_axis_target
   );
 `endif
 
-/*
-  nanosoc_axi_stream_io_8_txd_from_file #(
-    .TXDFILENAME(ADP_FILENAME),
-//    .CODEFILENAME("null.hex"),
-    .FAST_LOAD(FAST_LOAD)
-  ) u_nanosoc_axi_stream_io_dat_txd_from_file (
-    .aclk       (CLK),
-    .aresetn    (NRST),
-    .txd8_ready (axis_rx1_tready),
-    .txd8_valid (axis_rx1_tvalid),
-    .txd8_data  (axis_rx1_tdata8)
-  );
-*/
-
   nanosoc_axi_stream_io_8_rxd_to_file#(
     .RXDFILENAME("logs/extadp_out.log"),
     .VERBOSE(0)
@@ -325,40 +357,36 @@ extio8x4_axis_target u_extio8x4_axis_target
     .RXD8_READY   (    ),
     .RXD8_VALID   (axis_tx0_tvalid & axis_tx0_tready),
     .RXD8_DATA    (axis_tx0_tdata8),
-    .DEBUG_TESTER_ENABLE  ( ),
+    .DEBUG_TESTER_ENABLE  (debug_test_en3),
     .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
     .AUXCTRL              ()
   );
 
+  nanosoc_axi_stream_io_8_txd_from_datafile #(
+    .TXDFILENAME(DATA_IN_FILENAME)
+  ) u_nanosoc_axi_stream_io_8_txd_from_datafile (
+    .aclk       (CLK),
+    .aresetn    (NRST),
+    .txd8_ready (axis_rx1_tready),
+    .txd8_valid (axis_rx1_tvalid),
+    .txd8_data  (axis_rx1_tdata8)
+  );
+
+
 
   nanosoc_axi_stream_io_8_rxd_to_file#(
-    .RXDFILENAME("logs/extdat_out.log")
+    .RXDFILENAME(DATA_OUT_FILENAME)
   ) u_nanosoc_axi_stream_io_extdata_8_rxd_to_file (
     .aclk         (CLK),
     .aresetn      (NRST),
     .eof_received ( ),
-    .rxd8_ready   ( ), //axis_tx1_tready),
-    .rxd8_valid   (axis_tx1_tvalid & axis_tx1_tready),
+    .rxd8_ready   (axis_tx1_tready),
+    .rxd8_valid   (axis_tx1_tvalid),
     .rxd8_data    (axis_tx1_tdata8)
   );
 
-assign axis_tx1_tready = axis_rx1_tready;
-assign axis_rx1_tvalid = axis_tx1_tvalid;
-assign axis_rx1_tdata8 = axis_tx1_tdata8;
-`endif
-
- // --------------------------------------------------------------------------------
- // UART output capture
- // --------------------------------------------------------------------------------
-`ifdef ARM_CMSDK_SLOWSPEED_PCLK
-  // If PCLK is running at slower speed, the UART output will also be slower
-  assign PCLK = u_cmsdk_mcu.u_cmsdk_mcu.PCLK;
-`else
-  assign PCLK = CLK;
 `endif
 
- // --------------------------------------------------------------------------------
- // external UART phase lock to (known) baud rate
  // --------------------------------------------------------------------------------
  // UART output capture
  // --------------------------------------------------------------------------------
@@ -390,7 +418,8 @@ assign axis_rx1_tdata8 = axis_tx1_tdata8;
 
   wire baudx16_clk = bauddiv[8]; //prefer:// !baudclken;
 
-  wire UARTXD =  P1[5];
+///  wire UARTXD =  P1[5];
+  wire UARTXD =  P1[5] | FT1248MODE; // high if in EXTIO mode
   reg  UARTXD_del;
   always @(negedge NRST or posedge baudx16_clk)
     if (!NRST)
@@ -419,7 +448,6 @@ reg baud_clk_del;
     else
       baud_clk_del <= baud_clk;
 
-
  // --------------------------------------------------------------------------------
  // set FASTMODE true if UART simulation mode is programmed
   wire FASTMODE = 1'b0;
@@ -431,20 +459,12 @@ reg baud_clk_del;
     .RESETn               (NRST),
     .CLK                  (uart_clk), //PCLK),
     .RXD                  (UARTXD), // UART 2 use for StdOut
-    .DEBUG_TESTER_ENABLE  (debug_test_en2),
+    .DEBUG_TESTER_ENABLE  (debug_test_en1),
     .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
     .AUXCTRL              ()
   );
 `endif
 
- // --------------------------------------------------------------------------------
- // FTDI IO capture
- // --------------------------------------------------------------------------------
-
-  // UART connection cross over for UART test
-  //  assign P1[0] = P1[3];  // UART 0 RXD = UART 1 TXD
-  //  assign P1[2] = P1[1];  // UART 1 RXD = UART 0 TXD
-
  // --------------------------------------------------------------------------------
  // FTDI IO capture
  // --------------------------------------------------------------------------------
@@ -475,6 +495,7 @@ reg baud_clk_del;
   assign ft_miosio_i = (FT1248MODE) ? P1[2] : 1'b0; // & ft_miosio_z;
   bufif1 #1 (P1[2], ft_miosio_o, (FT1248MODE & !ft_miosio_z));
 
+
   //
   // AXI stream io testing
   //
@@ -487,10 +508,10 @@ reg baud_clk_del;
   wire rxd8_tvalid;
   wire [7:0] rxd8_tdata ;
 
-
 `ifndef COCOTB_SIM
   nanosoc_axi_stream_io_8_txd_from_file #(
     .TXDFILENAME(ADP_FILENAME),
+//    .CODEFILENAME("null.hex"),
     .FAST_LOAD(FAST_LOAD)
   ) u_nanosoc_axi_stream_io_8_txd_from_file (
     .aclk       (CLK),
@@ -501,7 +522,6 @@ reg baud_clk_del;
   );
 `endif
 
-
   nanosoc_ft1248x1_to_axi_streamio_v1_0 u_nanosoc_ft1248x1_to_axi_streamio_v1_0
   (
   .ft_clk_i     (ft_clk_out),
@@ -541,7 +561,7 @@ nanosoc_track_tb_iostream
   .rxd8_ready   (rxd8_tready),
   .rxd8_valid   (rxd8_tvalid),
   .rxd8_data    (rxd8_tdata),
-  .DEBUG_TESTER_ENABLE  (debug_test_en1),
+  .DEBUG_TESTER_ENABLE  (debug_test_en2),
   .AUXCTRL      ( ),
   .SIMULATIONEND( )
   );
@@ -570,22 +590,22 @@ nanosoc_ft1248x1_track
     .RESETn               (NRST),
     .CLK                  (ft_clk2uart),
     .RXD                  (ft_rxd2uart),
-    .DEBUG_TESTER_ENABLE  (debug_test_en1),
+    .DEBUG_TESTER_ENABLE  ( ), //debug_test_en2), //driven by u_nanosoc_track_tb_iostream
     .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
     .AUXCTRL              ()
   );
 `endif
 
 `ifndef COCOTB_SIM
-//  nanosoc_uart_capture  #(.LOGFILENAME("logs/ft1248_ip.log"))
-//    u_nanosoc_uart_capture2(
-//    .RESETn               (NRST),
-//    .CLK                  (ft_clk2uart),
-//    .RXD                  (ft_txd2uart),
-//    .DEBUG_TESTER_ENABLE  ( ),
-//    .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
-//    .AUXCTRL              ()
-//  );
+// nanosoc_uart_capture  #(.LOGFILENAME("logs/ft1248_ip.log"))
+//   u_nanosoc_uart_capture2(
+//   .RESETn               (NRST),
+//   .CLK                  (ft_clk2uart),
+//   .RXD                  (ft_txd2uart),
+//   .DEBUG_TESTER_ENABLE  ( ),
+//   .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
+//   .AUXCTRL              ()
+// );
 `endif
 
  // --------------------------------------------------------------------------------
@@ -785,22 +805,21 @@ nanosoc_ft1248x1_track
    pulldown(debug_err);
 
    //Tristate logic for GPIO connection
-   bufif1 (debug_command[5], P0[29-16], debug_test_en);
-   bufif1 (debug_command[4], P0[28-16], debug_test_en);
-   bufif1 (debug_command[3], P0[27-16], debug_test_en);
-   bufif1 (debug_command[2], P0[26-16], debug_test_en);
-   bufif1 (debug_command[1], P0[25-16], debug_test_en);
-   bufif1 (debug_command[0], P0[24-16], debug_test_en);
-
-   bufif1 (P0[31-16], debug_running, debug_test_en);
-   bufif1 (P0[30-16], debug_err, debug_test_en);
+   bufif1 (P0[7], debug_running, debug_test_en);
+   bufif1 (P0[6], debug_err, debug_test_en);
+   bufif1 (debug_command[5], P0[5], debug_test_en);
+   bufif1 (debug_command[4], P0[4], debug_test_en);
+   bufif1 (debug_command[3], P0[3], debug_test_en);
+   bufif1 (debug_command[2], P0[2], debug_test_en);
+   bufif1 (debug_command[1], P0[1], debug_test_en);
+   bufif1 (debug_command[0], P0[0], debug_test_en);
 
   cmsdk_debug_tester #(.ROM_MEMFILE((BE==1) ? "debugtester_be.hex" : "debugtester_le.hex"))
   u_cmsdk_debug_tester
   (
    // Clock and Reset
    .CLK                                 (CLK),
-   .PORESETn                            (NRST),
+   .PORESETn                            (NRST_ext),
 
    // Command Interface
    .DBGCMD                              (debug_command[5:0]),
@@ -828,6 +847,34 @@ nanosoc_ft1248x1_track
   // Format for time reporting
   initial    $timeformat(-9, 0, " ns", 0);
 
+  // Preload EXP rams
+  localparam aw_expram_l = u_nanosoc_chip_pads.u_nanosoc_chip.u_system.EXPRAM_L_RAM_ADDR_W;
+  localparam aw_expram_h = u_nanosoc_chip_pads.u_nanosoc_chip.u_system.EXPRAM_H_RAM_ADDR_W;
+
+  localparam awt_expram_l = ((1<<(aw_expram_l-2))-1);
+  localparam awt_expram_h = ((1<<(aw_expram_h-2))-1);
+
+  reg [7:0] fileimage_l [((1<<aw_expram_l)-1):0];
+  reg [7:0] fileimage_h [((1<<aw_expram_h)-1):0];
+  integer i,j;
+
+  initial begin
+    $readmemh("expram_l.hex", fileimage_l); 
+    for (i=0;i<awt_expram_l;i=i+1) begin 
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_l.u_expram_l.u_sram.BRAM0[i] = fileimage_l[ 4*i];
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_l.u_expram_l.u_sram.BRAM1[i] = fileimage_l[(4*i)+1];
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_l.u_expram_l.u_sram.BRAM2[i] = fileimage_l[(4*i)+2];
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_l.u_expram_l.u_sram.BRAM3[i] = fileimage_l[(4*i)+3];
+    end
+    $readmemh("expram_h.hex", fileimage_h); 
+    for (i=0;i<awt_expram_h;i=i+1) begin 
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_h.u_expram_h.u_sram.BRAM0[i] = fileimage_h[ 4*i];
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_h.u_expram_h.u_sram.BRAM1[i] = fileimage_h[(4*i)+1];
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_h.u_expram_h.u_sram.BRAM2[i] = fileimage_h[(4*i)+2];
+      u_nanosoc_chip_pads.u_nanosoc_chip.u_system.u_ss_expansion.u_region_expram_h.u_expram_h.u_sram.BRAM3[i] = fileimage_h[(4*i)+3];
+    end
+  end
+
   // Configuration checks
   initial begin
 `ifdef CORTEX_M0DESIGNSTART