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)