diff --git a/flist/nanosoc_vip.flist b/flist/nanosoc_vip.flist
index 284ad30e6cc346521c28861a9bed34faa6ed7dd4..f610d0842edee329fa343f985a938e2f6f2a684d 100644
--- a/flist/nanosoc_vip.flist
+++ b/flist/nanosoc_vip.flist
@@ -28,3 +28,4 @@ $(SOCLABS_NANOSOC_TECH_DIR)/verif/trace/verilog/nanosoc_track_tb_iostream.v
 $(SOCLABS_NANOSOC_TECH_DIR)/verif/trace/verilog/nanosoc_ft1248x1_track.v
 $(SOCLABS_NANOSOC_TECH_DIR)/verif/trace/verilog/nanosoc_dma_log_to_file.v
 $(SOCLABS_NANOSOC_TECH_DIR)/verif/trace/verilog/nanosoc_accelerator_ss_logger.v
+$(SOCLABS_NANOSOC_TECH_DIR)/verif/trace/verilog/nanosoc_axi_stream_io_8_txd_from_datafile.v
diff --git a/flows/makefile.software b/flows/makefile.software
index 26f551705c4b280588f5a8df7ec40c4f18f892b3..6447521c6a963883c99a663445dde4adb780ed02 100644
--- a/flows/makefile.software
+++ b/flows/makefile.software
@@ -73,6 +73,9 @@ endif
 	    mkdir -p $(SIM_DIR) ; \
 	    cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
 	    cp adp.cmd $(SIM_DIR)/adp.cmd ; \
+	    if [ -e data_in.csv ] ; then \
+	  	cp data_in.csv $(SIM_DIR)/data_in.csv ; \
+	    fi ;\
 	  else \
 	    while [ ! -e $(TESTNAME).hex ] ; do \
 	      echo Wait for $(TESTNAME).hex file ...; \
@@ -94,6 +97,9 @@ endif
 	  if [ -e expram_h.hex ] ; then \
 	  	cp expram_h.hex $(SIM_DIR)/expram_h.hex ; \
 	  fi ;\
+	  if [ -e data_in.csv ] ; then \
+	  	cp data_in.csv $(SIM_DIR)/data_in.csv ; \
+	  fi ;\
 	  cd $(SIM_DIR) ;\
 	elif [ -d "$(PROJ_SW_DIR)/$(TESTNAME)" ] ; then \
 	  cd $(PROJ_SW_DIR)/$(TESTNAME) ;\
@@ -105,6 +111,9 @@ endif
 	    mkdir -p $(SIM_DIR) ; \
 	    cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
 	    cp adp.cmd $(SIM_DIR)/adp.cmd ; \
+	    if [ -e data_in.csv ] ; then \
+	  	cp data_in.csv $(SIM_DIR)/data_in.csv ; \
+	    fi ;\
 	  else \
 	    while [ ! -e $(TESTNAME).hex ] ; do \
 	      echo Wait for $(TESTNAME).hex file ...; \
@@ -202,4 +211,4 @@ clean_all_code:
 # Remove only bootloader and default selected test
 clean_code:
 	@(cd $(TESTCODES_DIR)/$(BOOTLOADER) ; $(MAKE) clean; cd $(SIM_DIR); )
-	@(cd $(TESTCODES_DIR)/$(TESTNAME)   ; $(MAKE) clean; cd $(SIM_DIR); )
\ No newline at end of file
+	@(cd $(TESTCODES_DIR)/$(TESTNAME)   ; $(MAKE) clean; cd $(SIM_DIR); )
diff --git a/nanosoc/socdebug_tech b/nanosoc/socdebug_tech
index 049294a8aa4385e4b2e2a03210b315a574e2a787..9ef8d848da72e57f806b24eed5c2f6bbdce66668 160000
--- a/nanosoc/socdebug_tech
+++ b/nanosoc/socdebug_tech
@@ -1 +1 @@
-Subproject commit 049294a8aa4385e4b2e2a03210b315a574e2a787
+Subproject commit 9ef8d848da72e57f806b24eed5c2f6bbdce66668
diff --git a/testcodes/dataio_tests/data_in.csv b/testcodes/dataio_tests/data_in.csv
new file mode 100644
index 0000000000000000000000000000000000000000..bcc1e4425ed3a795097bdf1627046f1a91dbe268
--- /dev/null
+++ b/testcodes/dataio_tests/data_in.csv
@@ -0,0 +1,6 @@
+0000100101000110,0000110001000110,0000110001000110,0000100101000110,0000011001000110,0000011001000110,0000010101000110,0000100001000110,0000110101000110,0000101101000110,0000100001000110,0000010001000110,0000001101000110,0000100001000110,0000100101000110,0000101001000110,0000100101000111,0000010101000111,0000010101000111,0000010101000111,0000011101000111,0000100101000111,0000101001000111,0000100001000111,0000010001000111,0000001001000111,0000010001000111,0000100001000111,0000101101000111,0000100101000111,0000011001000111,0000010001000111,0000010001000111,0000011001000111,0000100101000111,0000101001000111,0000100101000111,0000010101000111,0000001001000111,0000010101000111
+0000010100101010,1111110100101010,0000010100101010,0000000100101001,1111111000101010,0000011000101001,0000000100101001,0000010100101000,0000010100101000,0000000100101000,0000101100101000,0000101000101000,0000011100100111,0000101000101000,0000101100100111,0000110100100111,0000101100100111,0000100100100111,0000111000100111,0000101000100111,0000001100100111,0000101000100111,0000011100100110,0000001000100110,0000011100100110,0000011100100110,0000100100100110,0000101000100110,0000001100100101,0000101000100101,0000010100100101,0000000000100101,0000011000100101,0000010000100101,0000001000100100,0000010000100100,1111111100100101,0000011000100100,0000001000100100,1111110000100100
+0000000000000000,0000000000000001,0000000000000011,0000000000000111,0000000000001111,0000000000011111,0000000000111111,0000000001111111,0000000011111111,0000000111111111,0000001111111111,0000011111111111,0000111111111111,0001111111111111,0011111111111111,0111111111111111,1111111111111111
+1111111111111111,1111111111111110,1111111111111100,1111111111111000,1111111111110000,1111111111100000,1111111111000000,1111111110000000,1111111100000000,1111111000000000,1111110000000000,1111100000000000,1111000000000000,1110000000000000,1100000000000000,1000000000000000,0000000000000000
+0000000000000000,0000000000000001,0000000000000010,0000000000000100,0000000000001000,0000000000010000,0000000000100000,0000000001000000,0000000010000000,0000000100000000,0000001000000000,0000010000000000,0000100000000000,0001000000000000,0010000000000000,0100000000000000,1000000000000000
+
diff --git a/testcodes/dataio_tests/dataio_functions.c b/testcodes/dataio_tests/dataio_functions.c
new file mode 100644
index 0000000000000000000000000000000000000000..ade2e12ee35c2b9902be93a731f886a0aae7b89f
--- /dev/null
+++ b/testcodes/dataio_tests/dataio_functions.c
@@ -0,0 +1,84 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright (c) 2025 SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+#include "CMSDK_CM0.h"
+
+#define DATA_UART  ((CMSDK_UART_TypeDef   *) CMSDK_UART1_BASE   )
+
+#define UART_STATE_TXFULL CMSDK_UART_STATE_TXBF_Msk
+#define UART_STATE_RXFULL CMSDK_UART_STATE_RXBF_Msk
+
+#define UART_CTRL_TXEN         CMSDK_UART_CTRL_TXEN_Msk
+#define UART_CTRL_RXEN         CMSDK_UART_CTRL_RXEN_Msk
+#define UART_CTRL_TXRXEN       (CMSDK_UART_CTRL_TXEN_Msk + CMSDK_UART_CTRL_RXEN_Msk)
+#define UART_CTRL_TXIRQEN      (CMSDK_UART_CTRL_TXIRQEN_Msk + UART_CTRL_TXRXEN)
+#define UART_CTRL_RXIRQEN      (CMSDK_UART_CTRL_RXIRQEN_Msk + UART_CTRL_TXRXEN)
+
+
+unsigned int DataIO_enable(void) {
+  DATA_UART->CTRL    = 0x00;             // re-initialise/flush
+  DATA_UART->CTRL    = UART_CTRL_TXRXEN; // enble TX and RX
+  return(0);
+}
+
+unsigned int DataIO_init(void) {
+  DATA_UART->CTRL    = 0x00;             // re-initialise/flush
+  DATA_UART->CTRL    = UART_CTRL_TXRXEN; // enble TX and RX
+  return(0);
+}
+
+// Output ready check
+unsigned int DataIO_putc_ready(void) {
+  return((DATA_UART->STATE & UART_STATE_TXFULL) == 0); // ready if TXBUF empty
+}
+
+// Output Busy check
+unsigned int DataIO_putc_busy(void) {
+  return((DATA_UART->STATE & UART_STATE_TXFULL) != 0); // busy if TXBUF full
+}
+
+// Output a character
+unsigned char DataIO_putc(unsigned char my_ch) {
+  while (DataIO_putc_busy()) ; // busy wait
+  DATA_UART->DATA = my_ch; // output the character
+  return (my_ch);
+}
+
+
+// Output a (zero-terminated) string
+void DataIO_puts(unsigned char * mytext) {
+  unsigned char string_ch;
+  do {
+    string_ch = *mytext;
+    if (string_ch != (char) 0x0) {
+      DataIO_putc(string_ch);  // Normal data
+      }
+    *mytext++;
+  } while (string_ch != 0);
+  return;
+}
+
+// Input ready check
+unsigned int DataIO_getc_ready(void) {
+  return((DATA_UART->STATE & UART_STATE_RXFULL) != 0); // ready if RXBUF set
+}
+
+
+// Input Busy check
+unsigned int DataIO_getc_busy(void) {
+  return((DATA_UART->STATE & UART_STATE_RXFULL) == 0); // busy if RXBUF not set
+}
+
+// Input a character
+unsigned char DataIO_getc(void) {
+  while (DataIO_getc_busy()) ; // busy wait
+  return (DATA_UART->DATA);
+}
diff --git a/testcodes/dataio_tests/dataio_functions.h b/testcodes/dataio_tests/dataio_functions.h
new file mode 100644
index 0000000000000000000000000000000000000000..9d49f950a8e6f3202abd54f6623ff1ae17be3460
--- /dev/null
+++ b/testcodes/dataio_tests/dataio_functions.h
@@ -0,0 +1,69 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright (c) 2025 SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+// IO enable
+extern unsigned int DataIO_enable(void);
+extern unsigned int DataIO_init(void);
+
+// Output ready check
+extern unsigned char DataIO_putc_ready(void);
+
+// Output busy check
+extern unsigned int DataIO_putc_busy(void);
+
+// Output a character
+extern unsigned char DataIO_putc(unsigned char my_ch);
+
+// DataIO string output
+extern void DataIO_puts(unsigned char * mytext);
+
+// Input ready check
+extern unsigned int DataIO_getc_ready(void);
+
+// Input busy check
+extern unsigned int DataIO_getc_busy(void);
+
+// Input a character
+extern unsigned char DataIO_getc(void);
+
+/* example usage
+
+#include "CMSDK_CM0.h"
+#include <string.h>
+#include "uart_stdout.h"
+#include <stdio.h>
+
+#include "DataIO_functions.h"
+
+int main(void) {
+  unsigned char ch;
+  char tx_buf[32];
+  
+  
+  UartStdOutInit(); // console channel init
+  printf("Data Channel CSV Reader/Writer (ASC binary -> Hex) tests\n");
+  DataIO_init();  // datachannel init
+    do { // rx process CSV entry
+      if (DataIO_getc_ready()) {
+        ch = DataIO_Getc();
+        // ...
+      }
+    
+    DataIO_puts((unsigned char*) tx_buf);
+    
+    do { // tx process
+      if (DataIO_putc_ready()) {
+        DataIO_putc(tx_buf[<i>]);
+      }
+
+*/
+
+
diff --git a/testcodes/dataio_tests/dataio_tests.c b/testcodes/dataio_tests/dataio_tests.c
new file mode 100644
index 0000000000000000000000000000000000000000..fe64e086738dd8280350eaef98a53d100d21977b
--- /dev/null
+++ b/testcodes/dataio_tests/dataio_tests.c
@@ -0,0 +1,72 @@
+#include "CMSDK_CM0.h"
+#include <string.h>
+#include "uart_stdout.h"
+#include <stdio.h>
+
+#include "dataio_functions.h"
+
+
+int main(void) {
+  unsigned char ch;
+  char         tx_buf[20];
+  unsigned int tx_count;
+  unsigned int rx_count;
+  unsigned int value;
+  unsigned int end_of_record ;
+  unsigned int end_of_data ;
+////  FILE *datain, *dataout;
+  
+  UartStdOutInit();
+  printf("Data Channel CSV Reader/Writer (ASC binary -> Hex) tests\n");
+
+  DataIO_init();
+
+  end_of_data = 0;
+  do { // record at a time 
+    tx_count = 0;
+    rx_count = 0;
+    value    = 0;
+    end_of_record = 0;
+    do { // rx process CSV entry
+      if (DataIO_getc_ready()) {
+        ch = DataIO_getc();
+        if  (ch == '0') { value = (value << 1);      rx_count++; }
+        if  (ch == '1') { value = (value << 1) + 1;  rx_count++; }
+        if  (ch == ',')  end_of_record = 1;
+        if ((ch == '\n') || (ch == '\r')) end_of_record = 1;
+        if ((ch == '\n') || (ch == '\r')) end_of_data = (rx_count == 0) ? 1 : 0;
+        }
+    } while ((rx_count <= 16) && (end_of_record == 0));
+    if (rx_count > 0) {
+      if (ch == ',')
+        printf(","); // ',' per CSV record
+      else
+        printf(".\n"); // newline delimiter
+
+      if (ch == ',')
+        sprintf(tx_buf,"%04x,", value);
+      else
+        sprintf(tx_buf,"%04x\n", value);
+
+      tx_buf[5]=0; // string zero terminate
+      
+      DataIO_puts((unsigned char*) tx_buf);
+//      do { /*tx process */
+//        if (DataIO_putc_ready()) {
+//          DataIO_putc(tx_buf[tx_count++]);
+//         }
+//      } while (tx_count < 5);
+    }
+  } while (end_of_data == 0); // outer record loop
+  
+  printf("** DATA FILE PROCESSING ** TEST PASSED **\n");
+  
+////  dataout = fopen("dataout","w");
+////  printf("file handle =,%08x\n",dataout);
+////  fputc(127, dataout);
+////  fclose(dataout);
+  
+  UartEndSimulation();
+  return 0;
+
+}
diff --git a/testcodes/dataio_tests/dataio_tests.hex b/testcodes/dataio_tests/dataio_tests.hex
new file mode 100644
index 0000000000000000000000000000000000000000..68a237a52d1c19c1703ffb4f6697313c5917db6f
--- /dev/null
+++ b/testcodes/dataio_tests/dataio_tests.hex
@@ -0,0 +1,2156 @@
+68
+04
+00
+30
+B9
+02
+00
+00
+C1
+02
+00
+00
+C3
+02
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+C5
+02
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+C7
+02
+00
+00
+C9
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+CB
+02
+00
+00
+00
+F0
+02
+F8
+00
+F0
+46
+F8
+0C
+A0
+30
+C8
+08
+38
+24
+18
+2D
+18
+A2
+46
+67
+1E
+AB
+46
+54
+46
+5D
+46
+AC
+42
+01
+D1
+00
+F0
+38
+F8
+7E
+46
+0F
+3E
+0F
+CC
+B6
+46
+01
+26
+33
+42
+00
+D0
+FB
+1A
+A2
+46
+AB
+46
+33
+43
+18
+47
+48
+07
+00
+00
+68
+07
+00
+00
+10
+3A
+02
+D3
+78
+C8
+78
+C1
+FA
+D8
+52
+07
+01
+D3
+30
+C8
+30
+C1
+01
+D5
+04
+68
+0C
+60
+70
+47
+00
+00
+00
+23
+00
+24
+00
+25
+00
+26
+10
+3A
+01
+D3
+78
+C1
+FB
+D8
+52
+07
+00
+D3
+30
+C1
+00
+D5
+0B
+60
+70
+47
+10
+B5
+78
+29
+02
+D1
+00
+F0
+D9
+F9
+10
+BD
+00
+20
+10
+BD
+1F
+B5
+1F
+BD
+10
+B5
+10
+BD
+00
+F0
+26
+FB
+11
+46
+FF
+F7
+F7
+FF
+00
+F0
+09
+F8
+00
+F0
+3E
+FB
+03
+B4
+FF
+F7
+F2
+FF
+03
+BC
+00
+F0
+D2
+F8
+00
+00
+F0
+B5
+87
+B0
+00
+F0
+CE
+F8
+28
+A0
+00
+F0
+71
+F9
+00
+F0
+2E
+F9
+00
+20
+05
+90
+00
+24
+26
+46
+27
+46
+00
+F0
+4F
+F9
+00
+28
+1B
+D0
+00
+F0
+56
+F9
+05
+46
+30
+28
+08
+D0
+31
+2D
+09
+D0
+2C
+2D
+0B
+D0
+0A
+2D
+0B
+D0
+0D
+2D
+09
+D0
+0D
+E0
+76
+00
+64
+1C
+0A
+E0
+76
+00
+64
+1C
+76
+1C
+06
+E0
+01
+27
+04
+E0
+01
+27
+00
+2C
+1A
+D0
+00
+20
+05
+90
+10
+2C
+03
+D8
+00
+2F
+DB
+D0
+00
+2C
+0F
+D0
+2C
+2D
+18
+D0
+1E
+A0
+00
+F0
+3F
+F9
+32
+46
+1D
+A1
+68
+46
+00
+F0
+48
+F9
+00
+20
+69
+46
+48
+71
+68
+46
+00
+F0
+0F
+F9
+05
+98
+00
+28
+C3
+D0
+19
+A0
+00
+F0
+2E
+F9
+00
+F0
+D2
+F8
+00
+20
+07
+B0
+F0
+BD
+20
+A0
+00
+F0
+26
+F9
+32
+46
+1F
+A1
+E5
+E7
+00
+00
+44
+61
+74
+61
+20
+43
+68
+61
+6E
+6E
+65
+6C
+20
+43
+53
+56
+20
+52
+65
+61
+64
+65
+72
+2F
+57
+72
+69
+74
+65
+72
+20
+28
+41
+53
+43
+20
+62
+69
+6E
+61
+72
+79
+20
+2D
+3E
+20
+48
+65
+78
+29
+20
+74
+65
+73
+74
+73
+0A
+00
+00
+00
+2E
+0A
+00
+00
+25
+30
+34
+78
+0A
+00
+00
+00
+2A
+2A
+20
+44
+41
+54
+41
+20
+46
+49
+4C
+45
+20
+50
+52
+4F
+43
+45
+53
+53
+49
+4E
+47
+20
+2A
+2A
+20
+54
+45
+53
+54
+20
+50
+41
+53
+53
+45
+44
+20
+2A
+2A
+0A
+00
+00
+2C
+00
+00
+00
+25
+30
+34
+78
+2C
+00
+00
+00
+04
+49
+03
+48
+08
+60
+70
+47
+02
+49
+01
+48
+08
+60
+70
+47
+00
+1C
+4E
+0E
+00
+00
+00
+30
+07
+48
+80
+47
+07
+48
+00
+47
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+04
+48
+05
+49
+05
+4A
+06
+4B
+70
+47
+00
+00
+A9
+02
+00
+00
+C1
+00
+00
+00
+68
+00
+00
+30
+68
+04
+00
+30
+68
+02
+00
+30
+68
+02
+00
+30
+10
+B5
+C0
+B2
+00
+F0
+36
+F8
+10
+BD
+10
+B5
+00
+F0
+41
+F8
+00
+F0
+30
+F8
+10
+BD
+00
+20
+C0
+43
+70
+47
+10
+B5
+C0
+B2
+00
+F0
+28
+F8
+10
+BD
+FE
+E7
+27
+48
+00
+21
+81
+60
+27
+49
+01
+61
+01
+21
+81
+60
+26
+48
+03
+21
+01
+61
+81
+60
+25
+49
+20
+20
+88
+61
+70
+47
+25
+48
+23
+49
+01
+60
+24
+49
+81
+61
+01
+21
+C1
+60
+C3
+21
+81
+60
+01
+69
+C9
+07
+FC
+D0
+1D
+49
+20
+20
+88
+61
+1A
+48
+00
+21
+81
+60
+30
+21
+01
+61
+03
+21
+81
+60
+70
+47
+16
+49
+8A
+68
+D2
+07
+04
+D0
+4A
+68
+D2
+07
+FC
+D1
+08
+60
+70
+47
+10
+4A
+53
+68
+DB
+07
+FC
+D1
+10
+60
+F7
+E7
+0D
+48
+0E
+49
+42
+68
+4B
+68
+92
+07
+D2
+17
+9B
+07
+DB
+17
+52
+1C
+5B
+1C
+1A
+42
+F5
+D1
+42
+68
+92
+07
+01
+D5
+00
+68
+03
+E0
+48
+68
+80
+07
+01
+D5
+08
+68
+C0
+B2
+70
+47
+04
+20
+FF
+F7
+D7
+FF
+FE
+E7
+00
+60
+00
+40
+6A
+18
+00
+00
+00
+E0
+00
+40
+00
+10
+01
+40
+8E
+0C
+01
+00
+00
+20
+00
+40
+24
+F4
+00
+00
+21
+48
+00
+21
+81
+60
+03
+21
+81
+60
+00
+20
+70
+47
+1E
+48
+00
+21
+81
+60
+03
+21
+81
+60
+00
+20
+70
+47
+1A
+48
+40
+68
+C0
+07
+C0
+17
+40
+1C
+70
+47
+17
+48
+40
+68
+C0
+07
+C0
+0F
+70
+47
+00
+B5
+01
+46
+FF
+F7
+F7
+FF
+00
+28
+FB
+D1
+12
+48
+01
+60
+08
+46
+00
+BD
+00
+B5
+02
+46
+13
+78
+00
+2B
+02
+D0
+18
+46
+FF
+F7
+EE
+FF
+52
+1C
+00
+2B
+F6
+D1
+00
+BD
+0A
+48
+40
+68
+80
+07
+C0
+0F
+70
+47
+07
+48
+40
+68
+80
+07
+C0
+17
+40
+1C
+70
+47
+00
+B5
+FF
+F7
+F7
+FF
+00
+28
+FB
+D1
+02
+48
+00
+68
+C0
+B2
+00
+BD
+00
+00
+00
+50
+00
+40
+70
+47
+00
+00
+0F
+B4
+05
+49
+10
+B5
+03
+AA
+02
+98
+00
+F0
+85
+F9
+10
+BC
+08
+BC
+04
+B0
+18
+47
+00
+00
+04
+00
+00
+30
+0F
+B4
+1C
+B5
+07
+4B
+06
+AA
+7B
+44
+69
+46
+00
+90
+05
+98
+00
+F0
+5B
+F9
+00
+20
+69
+46
+00
+F0
+6A
+F9
+1C
+BC
+08
+BC
+04
+B0
+18
+47
+E5
+02
+00
+00
+70
+B5
+04
+46
+85
+69
+00
+68
+C1
+06
+01
+D5
+30
+26
+00
+E0
+20
+26
+C0
+07
+07
+D0
+70
+BD
+62
+68
+30
+46
+A1
+68
+90
+47
+20
+6A
+40
+1C
+20
+62
+6D
+1E
+F6
+D5
+70
+BD
+70
+B5
+04
+46
+85
+69
+00
+78
+C0
+07
+07
+D1
+70
+BD
+62
+68
+A1
+68
+20
+20
+90
+47
+20
+6A
+40
+1C
+20
+62
+6D
+1E
+F6
+D5
+70
+BD
+00
+00
+70
+B5
+04
+46
+0D
+46
+21
+46
+10
+68
+C0
+46
+C0
+46
+21
+88
+09
+05
+02
+D5
+0F
+4A
+7A
+44
+02
+E0
+0E
+4A
+7A
+44
+0E
+32
+23
+46
+00
+21
+24
+33
+05
+E0
+06
+07
+00
+09
+36
+0F
+96
+5D
+5E
+54
+49
+1C
+00
+28
+F7
+D1
+20
+78
+00
+23
+00
+07
+05
+D5
+70
+2D
+03
+D0
+00
+29
+01
+D0
+02
+23
+11
+32
+20
+46
+00
+F0
+A2
+F8
+70
+BD
+F8
+02
+00
+00
+F3
+B5
+04
+46
+00
+20
+81
+B0
+20
+62
+20
+46
+E1
+68
+88
+47
+00
+28
+7D
+D0
+25
+28
+02
+D0
+62
+68
+A1
+68
+83
+E0
+45
+4F
+00
+25
+7F
+44
+20
+46
+E1
+68
+88
+47
+20
+28
+06
+46
+08
+DB
+31
+2E
+06
+D2
+B8
+19
+20
+38
+00
+78
+00
+28
+01
+D0
+05
+43
+F0
+E7
+A8
+07
+01
+D5
+04
+20
+85
+43
+00
+20
+E0
+61
+07
+46
+A0
+61
+2A
+2E
+0A
+D0
+30
+46
+00
+F0
+28
+F9
+00
+28
+27
+D0
+B8
+00
+00
+19
+30
+3E
+00
+90
+86
+61
+19
+E0
+02
+98
+BA
+00
+12
+19
+02
+C8
+91
+61
+02
+90
+20
+46
+E1
+68
+88
+47
+01
+2F
+06
+46
+17
+D1
+E0
+69
+00
+28
+1F
+DA
+20
+20
+85
+43
+1C
+E0
+00
+98
+0A
+21
+80
+69
+48
+43
+00
+99
+80
+19
+30
+38
+88
+61
+20
+46
+E1
+68
+88
+47
+06
+46
+00
+F0
+00
+F9
+00
+28
+EF
+D1
+01
+2F
+0A
+D0
+2E
+2E
+08
+D1
+20
+46
+E1
+68
+88
+47
+06
+46
+20
+20
+05
+43
+7F
+1C
+02
+2F
+C3
+DB
+A0
+69
+00
+28
+03
+DA
+40
+42
+A0
+61
+01
+20
+05
+43
+E8
+07
+01
+D0
+10
+20
+85
+43
+00
+2E
+24
+D0
+30
+46
+41
+38
+19
+28
+03
+D8
+01
+20
+C0
+02
+05
+43
+20
+36
+20
+46
+25
+60
+31
+46
+02
+9A
+15
+46
+FF
+F7
+75
+FD
+00
+28
+0C
+D0
+01
+28
+07
+D0
+ED
+1D
+E8
+08
+00
+E0
+0D
+E0
+C0
+00
+08
+30
+02
+90
+77
+E7
+2D
+1D
+02
+95
+74
+E7
+62
+68
+30
+46
+A1
+68
+90
+47
+20
+6A
+40
+1C
+6C
+E7
+20
+6A
+FE
+BD
+00
+00
+BC
+02
+00
+00
+70
+47
+70
+47
+70
+47
+FF
+B5
+04
+46
+0D
+46
+81
+B0
+24
+30
+00
+90
+21
+68
+88
+06
+04
+D5
+10
+22
+E0
+69
+91
+43
+21
+60
+00
+E0
+01
+20
+A8
+42
+01
+DD
+47
+1B
+00
+E0
+00
+27
+04
+98
+A1
+69
+7A
+19
+10
+18
+08
+1A
+A0
+61
+20
+78
+C0
+06
+02
+D4
+20
+46
+FF
+F7
+ED
+FE
+00
+26
+08
+E0
+03
+98
+62
+68
+A1
+68
+80
+5D
+90
+47
+20
+6A
+40
+1C
+76
+1C
+20
+62
+04
+98
+86
+42
+F3
+DB
+20
+78
+C0
+06
+0A
+D5
+20
+46
+FF
+F7
+D9
+FE
+06
+E0
+62
+68
+A1
+68
+30
+20
+90
+47
+20
+6A
+40
+1C
+20
+62
+38
+46
+7F
+1E
+00
+28
+F4
+DC
+07
+E0
+00
+98
+62
+68
+A1
+68
+40
+5D
+90
+47
+20
+6A
+40
+1C
+20
+62
+28
+46
+6D
+1E
+00
+28
+F3
+DC
+20
+46
+FF
+F7
+D3
+FE
+20
+78
+00
+06
+02
+D5
+02
+20
+05
+B0
+F0
+BD
+01
+20
+FB
+E7
+00
+00
+01
+69
+4A
+1C
+02
+61
+08
+78
+70
+47
+00
+B5
+8F
+B0
+02
+91
+00
+21
+05
+91
+05
+49
+01
+93
+79
+44
+03
+91
+11
+46
+04
+90
+68
+46
+FF
+F7
+F5
+FE
+0F
+B0
+00
+BD
+00
+00
+E5
+FF
+FF
+FF
+0A
+68
+10
+70
+52
+1C
+0A
+60
+70
+47
+00
+00
+08
+4B
+70
+B5
+0D
+46
+7B
+44
+FF
+F7
+E1
+FF
+04
+46
+28
+46
+FF
+F7
+BB
+FD
+00
+28
+02
+D0
+00
+20
+C0
+43
+70
+BD
+20
+46
+70
+BD
+00
+00
+6B
+FB
+FF
+FF
+75
+46
+00
+F0
+25
+F8
+AE
+46
+05
+00
+69
+46
+53
+46
+C0
+08
+C0
+00
+85
+46
+18
+B0
+20
+B5
+FF
+F7
+86
+FD
+60
+BC
+00
+27
+49
+08
+B6
+46
+00
+26
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+40
+3D
+49
+00
+8D
+46
+70
+47
+10
+B5
+04
+46
+C0
+46
+C0
+46
+20
+46
+FF
+F7
+BB
+FC
+10
+BD
+00
+00
+00
+48
+70
+47
+08
+00
+00
+30
+30
+38
+0A
+28
+01
+D2
+01
+20
+70
+47
+00
+20
+70
+47
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+41
+42
+43
+44
+45
+46
+40
+30
+58
+00
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+61
+62
+63
+64
+65
+66
+40
+30
+78
+00
+04
+00
+00
+08
+00
+00
+00
+00
+00
+00
+00
+02
+00
+01
+00
+00
+10
+00
+64
+08
+00
+00
+00
+00
+00
+30
+08
+00
+00
+00
+04
+01
+00
+00
+6C
+08
+00
+00
+08
+00
+00
+30
+60
+04
+00
+00
+20
+01
+00
+00
+00
+1C
+4E
+0E
+00
+00
+00
+00
diff --git a/testcodes/dataio_tests/makefile b/testcodes/dataio_tests/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e63bcfd43be8bd775c2c3cd9298d4eaf09356bf9
--- /dev/null
+++ b/testcodes/dataio_tests/makefile
@@ -0,0 +1,256 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0
+
+# Shared software directory
+SOFTWARE_DIR = $(SOCLABS_NANOSOC_TECH_DIR)/software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = dataio_tests
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -Ospace -I $(DEVICE_DIR)/Include  -I $(CORE_DIR) \
+		   -I $(SOFTWARE_DIR)/common/retarget -I $(SOFTWARE_DIR)/drivers $(USER_DEFINE)
+ARM_ASM_OPTIONS  = 
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --no_debug --rw_base 0x30000000 --ro_base 0x00000000 --map  --info sizes
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst $(TESTNAME).bin
+
+$(TESTNAME).o :  $(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+dataio_functions.o :  dataio_functions.c dataio_functions.h $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o dataio_functions.o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o dataio_functions.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+$(TESTNAME).bin : $(TESTNAME).ELF
+	fromelf --bin $< --output $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s -z -v $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+        -I $(SOFTWARE_DIR)/common/retarget  \
+		-I $(SOFTWARE_DIR)/drivers \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/testcodes/software_list.txt b/testcodes/software_list.txt
index d042b828d7b8ae09024cbccc96da9a0ba0b059b7..ebe811048e0ae468b6f0ccb3911cab45b6338594 100644
--- a/testcodes/software_list.txt
+++ b/testcodes/software_list.txt
@@ -17,3 +17,4 @@ apb_mux_tests
 memory_tests
 romtable_tests
 interrupt_demo
+dataio_tests
diff --git a/verif/tb/verilog/nanosoc_tb.v b/verif/tb/verilog/nanosoc_tb.v
index 837dbefa2a814f94916e21dda930364989ca5ccf..3ab628e10101c8afd73be3e997ee34036b2277ab 100644
--- a/verif/tb/verilog/nanosoc_tb.v
+++ b/verif/tb/verilog/nanosoc_tb.v
@@ -92,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"),
@@ -104,6 +107,7 @@ SROM_Ax32
     .SEL(1'b0),
     .RDATA( )
   );
+*/
 
 `ifdef SDF_SIM
 initial
@@ -334,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)
@@ -372,21 +362,29 @@ extio8x4_axis_target u_extio8x4_axis_target
     .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
 
  // --------------------------------------------------------------------------------
diff --git a/verif/trace/verilog/nanosoc_axi_stream_io_8_txd_from_datafile.v b/verif/trace/verilog/nanosoc_axi_stream_io_8_txd_from_datafile.v
new file mode 100644
index 0000000000000000000000000000000000000000..964c44f903241d7de82c2df16791814e15f52dcd
--- /dev/null
+++ b/verif/trace/verilog/nanosoc_axi_stream_io_8_txd_from_datafile.v
@@ -0,0 +1,75 @@
+//-----------------------------------------------------------------------------
+// 8-bit AXI-Stream File TX playback
+//
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright (c) 2023-25, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module nanosoc_axi_stream_io_8_txd_from_datafile
+  #(parameter TXDFILENAME = "data.txt",
+    parameter WAITSTATE = 0,
+    parameter VERBOSE = 0)
+  (
+  input  wire  aclk,
+  input  wire  aresetn,
+  input  wire  txd8_ready,
+  output wire  txd8_valid,
+  output wire  [7:0] txd8_data
+  );
+
+
+ //----------------------------------------------
+ //-- File I/O
+ //----------------------------------------------
+
+
+   integer        fd;       // channel descriptor for cmd file input
+   integer        ch;
+   integer        i;
+   
+`define EOF -1
+
+   reg       valid;
+   reg [7:0] data8;
+   reg       eot; // Ctrl-D encountered
+   
+   initial
+     begin
+       eot <= 1'b0;
+       valid <= 1'b0;
+//       $timeformat(-9, 0, " ns", 14);
+       fd= $fopen(TXDFILENAME,"r");
+       if (fd == 0)
+          $write("** %m : input file failed to open **\n");
+       else begin
+         @(posedge aresetn);
+         ch =  $fgetc(fd);
+         while ((ch != `EOF) && (!eot)) begin
+           @(posedge aclk);
+           data8 <= (ch & 8'hff);
+           valid <= 1'b1;
+           if (ch == 8'h04)
+               eot <= 1'b1;
+           @(posedge aclk);
+           while (txd8_ready == 1'b0)
+             @(posedge aclk);
+           valid <= 1'b0;
+           ch =  (eot) ? `EOF : $fgetc(fd);
+           for (i=0; i <  WAITSTATE; i=i+1)
+             @(posedge aclk);
+         end
+         $write("** %m : file closed after stream TX completed **\n");
+         $fclose(fd);
+         valid <= 1'b0;
+       end
+     end
+
+assign txd8_valid = valid;
+assign txd8_data = data8;
+
+endmodule
diff --git a/verif/trace/verilog/soclabs_axis8_capture.v b/verif/trace/verilog/soclabs_axis8_capture.v
index b98a00b5a2d78fa9e382235ae067aa8eb5b31330..eb04dccf627deaf393530928514a49b3deb2981a 100644
--- a/verif/trace/verilog/soclabs_axis8_capture.v
+++ b/verif/trace/verilog/soclabs_axis8_capture.v
@@ -58,7 +58,6 @@ module soclabs_axis8_capture
   (
   input  wire       RESETn,              // Power on reset
   input  wire       CLK,                 // Clock (baud rate)
-  input  wire       RXD,                 // Received data
 
   output wire       RXD8_READY,
   input  wire       RXD8_VALID,
@@ -69,7 +68,6 @@ module soclabs_axis8_capture
   output wire [7:0] AUXCTRL);            // Auxiliary control
 
   reg [8:0]        rx_shift_reg;
-  wire [8:0]       nxt_rx_shift;
   reg [6:0]        string_length;
   reg [7:0]        tube_string [127:0];
   reg [7:0]        text_char;
@@ -104,20 +102,7 @@ assign RXD8_READY = rx_shift_reg[0]; // ready except for a cycle processing
      end
 
   // Receive shift register
-  assign nxt_rx_shift  = {RXD,rx_shift_reg[8:1]};
   assign char_received = (rx_shift_reg[0]==1'b0);
-/*
-  always @(posedge CLK or negedge RESETn)
-  begin
-    if (~RESETn)
-      rx_shift_reg <= {9{1'b0}};
-    else
-      if (rx_shift_reg[0]==1'b0) // Start bit reach bit[0]
-        rx_shift_reg <= {9{1'b1}};
-      else
-        rx_shift_reg <= nxt_rx_shift;
-  end
-*/
 
 // ARM design wants valid char in rx_shift_reg[9:1]
 // and a zero in rx_shift_reg[0] to indicate valid start bit (so preset back to 1 after a clock cycle)