diff --git a/library/regmaps/adi_regmap_spi_engine_pkg.sv b/library/regmaps/adi_regmap_spi_engine_pkg.sv index 830bb3a7..daac4b55 100644 --- a/library/regmaps/adi_regmap_spi_engine_pkg.sv +++ b/library/regmaps/adi_regmap_spi_engine_pkg.sv @@ -33,7 +33,7 @@ // *************************************************************************** // *************************************************************************** /* Auto generated Register Map */ -/* Wed Jul 24 09:28:37 2024 */ +/* Wed Jan 29 16:40:28 2025 */ package adi_regmap_spi_engine_pkg; import adi_regmap_pkg::*; @@ -43,8 +43,8 @@ package adi_regmap_spi_engine_pkg; const reg_t AXI_SPI_ENGINE_VERSION = '{ 'h0000, "VERSION" , '{ "VERSION_MAJOR": '{ 31, 16, RO, 'h00000001 }, - "VERSION_MINOR": '{ 15, 8, RO, 'h00000003 }, - "VERSION_PATCH": '{ 7, 0, RO, 'h00000001 }}}; + "VERSION_MINOR": '{ 15, 8, RO, 'h00000004 }, + "VERSION_PATCH": '{ 7, 0, RO, 'h00000000 }}}; `define SET_AXI_SPI_ENGINE_VERSION_VERSION_MAJOR(x) SetField(AXI_SPI_ENGINE_VERSION,"VERSION_MAJOR",x) `define GET_AXI_SPI_ENGINE_VERSION_VERSION_MAJOR(x) GetField(AXI_SPI_ENGINE_VERSION,"VERSION_MAJOR",x) `define DEFAULT_AXI_SPI_ENGINE_VERSION_VERSION_MAJOR GetResetValue(AXI_SPI_ENGINE_VERSION,"VERSION_MAJOR") @@ -167,7 +167,7 @@ package adi_regmap_spi_engine_pkg; `define UPDATE_AXI_SPI_ENGINE_IRQ_SOURCE_IRQ_SOURCE(x,y) UpdateField(AXI_SPI_ENGINE_IRQ_SOURCE,"IRQ_SOURCE",x,y) const reg_t AXI_SPI_ENGINE_SYNC_ID = '{ 'h00c0, "SYNC_ID" , '{ - "SYNC_ID": '{ 31, 0, RO, 'hXXXXXXXX }}}; + "SYNC_ID": '{ 31, 0, RO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_SYNC_ID_SYNC_ID(x) SetField(AXI_SPI_ENGINE_SYNC_ID,"SYNC_ID",x) `define GET_AXI_SPI_ENGINE_SYNC_ID_SYNC_ID(x) GetField(AXI_SPI_ENGINE_SYNC_ID,"SYNC_ID",x) `define DEFAULT_AXI_SPI_ENGINE_SYNC_ID_SYNC_ID GetResetValue(AXI_SPI_ENGINE_SYNC_ID,"SYNC_ID") @@ -202,35 +202,35 @@ package adi_regmap_spi_engine_pkg; `define UPDATE_AXI_SPI_ENGINE_SDI_FIFO_LEVEL_SDI_FIFO_LEVEL(x,y) UpdateField(AXI_SPI_ENGINE_SDI_FIFO_LEVEL,"SDI_FIFO_LEVEL",x,y) const reg_t AXI_SPI_ENGINE_CMD_FIFO = '{ 'h00e0, "CMD_FIFO" , '{ - "CMD_FIFO": '{ 31, 0, WO, 'hXXXXXXXX }}}; + "CMD_FIFO": '{ 31, 0, WO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_CMD_FIFO_CMD_FIFO(x) SetField(AXI_SPI_ENGINE_CMD_FIFO,"CMD_FIFO",x) `define GET_AXI_SPI_ENGINE_CMD_FIFO_CMD_FIFO(x) GetField(AXI_SPI_ENGINE_CMD_FIFO,"CMD_FIFO",x) `define DEFAULT_AXI_SPI_ENGINE_CMD_FIFO_CMD_FIFO GetResetValue(AXI_SPI_ENGINE_CMD_FIFO,"CMD_FIFO") `define UPDATE_AXI_SPI_ENGINE_CMD_FIFO_CMD_FIFO(x,y) UpdateField(AXI_SPI_ENGINE_CMD_FIFO,"CMD_FIFO",x,y) const reg_t AXI_SPI_ENGINE_SDO_FIFO = '{ 'h00e4, "SDO_FIFO" , '{ - "SDO_FIFO": '{ 31, 0, WO, 'hXXXXXXXX }}}; + "SDO_FIFO": '{ 31, 0, WO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_SDO_FIFO_SDO_FIFO(x) SetField(AXI_SPI_ENGINE_SDO_FIFO,"SDO_FIFO",x) `define GET_AXI_SPI_ENGINE_SDO_FIFO_SDO_FIFO(x) GetField(AXI_SPI_ENGINE_SDO_FIFO,"SDO_FIFO",x) `define DEFAULT_AXI_SPI_ENGINE_SDO_FIFO_SDO_FIFO GetResetValue(AXI_SPI_ENGINE_SDO_FIFO,"SDO_FIFO") `define UPDATE_AXI_SPI_ENGINE_SDO_FIFO_SDO_FIFO(x,y) UpdateField(AXI_SPI_ENGINE_SDO_FIFO,"SDO_FIFO",x,y) const reg_t AXI_SPI_ENGINE_SDI_FIFO = '{ 'h00e8, "SDI_FIFO" , '{ - "SDI_FIFO": '{ 31, 0, RO, 'hXXXXXXXX }}}; + "SDI_FIFO": '{ 31, 0, RO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_SDI_FIFO_SDI_FIFO(x) SetField(AXI_SPI_ENGINE_SDI_FIFO,"SDI_FIFO",x) `define GET_AXI_SPI_ENGINE_SDI_FIFO_SDI_FIFO(x) GetField(AXI_SPI_ENGINE_SDI_FIFO,"SDI_FIFO",x) `define DEFAULT_AXI_SPI_ENGINE_SDI_FIFO_SDI_FIFO GetResetValue(AXI_SPI_ENGINE_SDI_FIFO,"SDI_FIFO") `define UPDATE_AXI_SPI_ENGINE_SDI_FIFO_SDI_FIFO(x,y) UpdateField(AXI_SPI_ENGINE_SDI_FIFO,"SDI_FIFO",x,y) const reg_t AXI_SPI_ENGINE_SDI_FIFO_MSB = '{ 'h00ec, "SDI_FIFO_MSB" , '{ - "SDI_FIFO_MSB": '{ 31, 0, RO, 'hXXXXXXXX }}}; + "SDI_FIFO_MSB": '{ 31, 0, RO, 0 }}}; `define SET_AXI_SPI_ENGINE_SDI_FIFO_MSB_SDI_FIFO_MSB(x) SetField(AXI_SPI_ENGINE_SDI_FIFO_MSB,"SDI_FIFO_MSB",x) `define GET_AXI_SPI_ENGINE_SDI_FIFO_MSB_SDI_FIFO_MSB(x) GetField(AXI_SPI_ENGINE_SDI_FIFO_MSB,"SDI_FIFO_MSB",x) `define DEFAULT_AXI_SPI_ENGINE_SDI_FIFO_MSB_SDI_FIFO_MSB GetResetValue(AXI_SPI_ENGINE_SDI_FIFO_MSB,"SDI_FIFO_MSB") `define UPDATE_AXI_SPI_ENGINE_SDI_FIFO_MSB_SDI_FIFO_MSB(x,y) UpdateField(AXI_SPI_ENGINE_SDI_FIFO_MSB,"SDI_FIFO_MSB",x,y) const reg_t AXI_SPI_ENGINE_SDI_FIFO_PEEK = '{ 'h00f0, "SDI_FIFO_PEEK" , '{ - "SDI_FIFO_PEEK": '{ 31, 0, RO, 'hXXXXXXXX }}}; + "SDI_FIFO_PEEK": '{ 31, 0, RO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_SDI_FIFO_PEEK_SDI_FIFO_PEEK(x) SetField(AXI_SPI_ENGINE_SDI_FIFO_PEEK,"SDI_FIFO_PEEK",x) `define GET_AXI_SPI_ENGINE_SDI_FIFO_PEEK_SDI_FIFO_PEEK(x) GetField(AXI_SPI_ENGINE_SDI_FIFO_PEEK,"SDI_FIFO_PEEK",x) `define DEFAULT_AXI_SPI_ENGINE_SDI_FIFO_PEEK_SDI_FIFO_PEEK GetResetValue(AXI_SPI_ENGINE_SDI_FIFO_PEEK,"SDI_FIFO_PEEK") @@ -258,14 +258,14 @@ package adi_regmap_spi_engine_pkg; `define UPDATE_AXI_SPI_ENGINE_OFFLOAD0_MEM_RESET_OFFLOAD0_MEM_RESET(x,y) UpdateField(AXI_SPI_ENGINE_OFFLOAD0_MEM_RESET,"OFFLOAD0_MEM_RESET",x,y) const reg_t AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO = '{ 'h0110, "OFFLOAD0_CDM_FIFO" , '{ - "OFFLOAD0_CDM_FIFO": '{ 31, 0, WO, 'hXXXXXXXX }}}; + "OFFLOAD0_CDM_FIFO": '{ 31, 0, WO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO_OFFLOAD0_CDM_FIFO(x) SetField(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO,"OFFLOAD0_CDM_FIFO",x) `define GET_AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO_OFFLOAD0_CDM_FIFO(x) GetField(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO,"OFFLOAD0_CDM_FIFO",x) `define DEFAULT_AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO_OFFLOAD0_CDM_FIFO GetResetValue(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO,"OFFLOAD0_CDM_FIFO") `define UPDATE_AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO_OFFLOAD0_CDM_FIFO(x,y) UpdateField(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO,"OFFLOAD0_CDM_FIFO",x,y) const reg_t AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO = '{ 'h0114, "OFFLOAD0_SDO_FIFO" , '{ - "OFFLOAD0_SDO_FIFO": '{ 31, 0, WO, 'hXXXXXXXX }}}; + "OFFLOAD0_SDO_FIFO": '{ 31, 0, WO, 'h00 }}}; `define SET_AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO_OFFLOAD0_SDO_FIFO(x) SetField(AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO,"OFFLOAD0_SDO_FIFO",x) `define GET_AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO_OFFLOAD0_SDO_FIFO(x) GetField(AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO,"OFFLOAD0_SDO_FIFO",x) `define DEFAULT_AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO_OFFLOAD0_SDO_FIFO GetResetValue(AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO,"OFFLOAD0_SDO_FIFO") diff --git a/testbenches/ip/spi_engine/cfgs/cfg00.tcl b/testbenches/ip/spi_engine/cfgs/cfg00.tcl new file mode 100644 index 00000000..03ad3cc9 --- /dev/null +++ b/testbenches/ip/spi_engine/cfgs/cfg00.tcl @@ -0,0 +1,58 @@ +global ad_project_params + +# SPI Engine DUT parameters +set ad_project_params(DATA_WIDTH) 32 +set ad_project_params(ASYNC_SPI_CLK) 1 +set ad_project_params(NUM_OF_CS) 1 +set ad_project_params(NUM_OF_SDI) 1 +set ad_project_params(NUM_OF_SDO) 1 +set ad_project_params(SDI_DELAY) 1 +set ad_project_params(ECHO_SCLK) 0 +set ad_project_params(CMD_MEM_ADDR_WIDTH) 4 +set ad_project_params(DATA_MEM_ADDR_WIDTH) 4 +set ad_project_params(SDI_FIFO_ADDR_WIDTH) 5 +set ad_project_params(SDO_FIFO_ADDR_WIDTH) 5 +set ad_project_params(SYNC_FIFO_ADDR_WIDTH) 4 +set ad_project_params(CMD_FIFO_ADDR_WIDTH) 4 +set ad_project_params(SDO_STREAMING) 0 + +# Test parameters +set ad_project_params(DATA_DLENGTH) 16 +set ad_project_params(THREE_WIRE) 0 +set ad_project_params(CPOL) 0 +set ad_project_params(CPHA) 0 +set ad_project_params(SDO_IDLE_STATE) 0 +set ad_project_params(SLAVE_TIN) 0 +set ad_project_params(SLAVE_TOUT) 0 +set ad_project_params(MASTER_TIN) 0 +set ad_project_params(MASTER_TOUT) 0 +set ad_project_params(CS_TO_MISO) 0 +set ad_project_params(CLOCK_DIVIDER) 2 +set ad_project_params(NUM_OF_WORDS) 5 +set ad_project_params(NUM_OF_TRANSFERS) 5 +set ad_project_params(CS_ACTIVE_HIGH) 0 +set ad_project_params(ECHO_SCLK_DELAY) 0.1 + +set spi_s_vip_cfg [ list \ + MODE 0 \ + CPOL $ad_project_params(CPOL) \ + CPHA $ad_project_params(CPHA) \ + INV_CS $ad_project_params(CS_ACTIVE_HIGH) \ + SLAVE_TIN $ad_project_params(SLAVE_TIN) \ + SLAVE_TOUT $ad_project_params(SLAVE_TOUT) \ + MASTER_TIN $ad_project_params(MASTER_TIN) \ + MASTER_TOUT $ad_project_params(MASTER_TOUT) \ + CS_TO_MISO $ad_project_params(CS_TO_MISO) \ + DATA_DLENGTH $ad_project_params(DATA_DLENGTH) \ +] +set ad_project_params(spi_s_vip_cfg) $spi_s_vip_cfg + +set axis_sdo_src_vip_cfg [ list \ + INTERFACE_MODE {MASTER} \ + HAS_TREADY 1 \ + HAS_TLAST 0 \ + TDATA_NUM_BYTES [expr $ad_project_params(DATA_WIDTH)/8] \ + TDEST_WIDTH 0 \ + TID_WIDTH 0 \ +] +set ad_project_params(axis_sdo_src_vip_cfg) $axis_sdo_src_vip_cfg diff --git a/testbenches/ip/spi_engine/cfgs/cfg1.tcl b/testbenches/ip/spi_engine/cfgs/cfg01.tcl similarity index 98% rename from testbenches/ip/spi_engine/cfgs/cfg1.tcl rename to testbenches/ip/spi_engine/cfgs/cfg01.tcl index 19d8eb87..14dc9642 100644 --- a/testbenches/ip/spi_engine/cfgs/cfg1.tcl +++ b/testbenches/ip/spi_engine/cfgs/cfg01.tcl @@ -32,7 +32,6 @@ set ad_project_params(NUM_OF_WORDS) 3 set ad_project_params(NUM_OF_TRANSFERS) 5 set ad_project_params(CS_ACTIVE_HIGH) 0 set ad_project_params(ECHO_SCLK_DELAY) 0.1 -set ad_project_params(SDO_MEM_WORDS) 1 set spi_s_vip_cfg [ list \ MODE 0 \ diff --git a/testbenches/ip/spi_engine/cfgs/cfg10.tcl b/testbenches/ip/spi_engine/cfgs/cfg10.tcl new file mode 100644 index 00000000..3f15e6fc --- /dev/null +++ b/testbenches/ip/spi_engine/cfgs/cfg10.tcl @@ -0,0 +1,58 @@ +global ad_project_params + +# SPI Engine DUT parameters +set ad_project_params(DATA_WIDTH) 32 +set ad_project_params(ASYNC_SPI_CLK) 1 +set ad_project_params(NUM_OF_CS) 1 +set ad_project_params(NUM_OF_SDI) 1 +set ad_project_params(NUM_OF_SDO) 1 +set ad_project_params(SDI_DELAY) 1 +set ad_project_params(ECHO_SCLK) 0 +set ad_project_params(CMD_MEM_ADDR_WIDTH) 4 +set ad_project_params(DATA_MEM_ADDR_WIDTH) 4 +set ad_project_params(SDI_FIFO_ADDR_WIDTH) 5 +set ad_project_params(SDO_FIFO_ADDR_WIDTH) 5 +set ad_project_params(SYNC_FIFO_ADDR_WIDTH) 4 +set ad_project_params(CMD_FIFO_ADDR_WIDTH) 4 +set ad_project_params(SDO_STREAMING) 0 + +# Test parameters +set ad_project_params(DATA_DLENGTH) 18 +set ad_project_params(THREE_WIRE) 0 +set ad_project_params(CPOL) 1 +set ad_project_params(CPHA) 0 +set ad_project_params(SDO_IDLE_STATE) 0 +set ad_project_params(SLAVE_TIN) 0 +set ad_project_params(SLAVE_TOUT) 0 +set ad_project_params(MASTER_TIN) 0 +set ad_project_params(MASTER_TOUT) 0 +set ad_project_params(CS_TO_MISO) 0 +set ad_project_params(CLOCK_DIVIDER) 2 +set ad_project_params(NUM_OF_WORDS) 3 +set ad_project_params(NUM_OF_TRANSFERS) 5 +set ad_project_params(CS_ACTIVE_HIGH) 0 +set ad_project_params(ECHO_SCLK_DELAY) 0.1 + +set spi_s_vip_cfg [ list \ + MODE 0 \ + CPOL $ad_project_params(CPOL) \ + CPHA $ad_project_params(CPHA) \ + INV_CS $ad_project_params(CS_ACTIVE_HIGH) \ + SLAVE_TIN $ad_project_params(SLAVE_TIN) \ + SLAVE_TOUT $ad_project_params(SLAVE_TOUT) \ + MASTER_TIN $ad_project_params(MASTER_TIN) \ + MASTER_TOUT $ad_project_params(MASTER_TOUT) \ + CS_TO_MISO $ad_project_params(CS_TO_MISO) \ + DATA_DLENGTH $ad_project_params(DATA_DLENGTH) \ +] +set ad_project_params(spi_s_vip_cfg) $spi_s_vip_cfg + +set axis_sdo_src_vip_cfg [ list \ + INTERFACE_MODE {MASTER} \ + HAS_TREADY 1 \ + HAS_TLAST 0 \ + TDATA_NUM_BYTES [expr $ad_project_params(DATA_WIDTH)/8] \ + TDEST_WIDTH 0 \ + TID_WIDTH 0 \ +] +set ad_project_params(axis_sdo_src_vip_cfg) $axis_sdo_src_vip_cfg diff --git a/testbenches/ip/spi_engine/cfgs/cfg11.tcl b/testbenches/ip/spi_engine/cfgs/cfg11.tcl new file mode 100644 index 00000000..8cde6784 --- /dev/null +++ b/testbenches/ip/spi_engine/cfgs/cfg11.tcl @@ -0,0 +1,58 @@ +global ad_project_params + +# SPI Engine DUT parameters +set ad_project_params(DATA_WIDTH) 32 +set ad_project_params(ASYNC_SPI_CLK) 1 +set ad_project_params(NUM_OF_CS) 1 +set ad_project_params(NUM_OF_SDI) 1 +set ad_project_params(NUM_OF_SDO) 1 +set ad_project_params(SDI_DELAY) 1 +set ad_project_params(ECHO_SCLK) 0 +set ad_project_params(CMD_MEM_ADDR_WIDTH) 4 +set ad_project_params(DATA_MEM_ADDR_WIDTH) 4 +set ad_project_params(SDI_FIFO_ADDR_WIDTH) 5 +set ad_project_params(SDO_FIFO_ADDR_WIDTH) 5 +set ad_project_params(SYNC_FIFO_ADDR_WIDTH) 4 +set ad_project_params(CMD_FIFO_ADDR_WIDTH) 4 +set ad_project_params(SDO_STREAMING) 0 + +# Test parameters +set ad_project_params(DATA_DLENGTH) 18 +set ad_project_params(THREE_WIRE) 0 +set ad_project_params(CPOL) 1 +set ad_project_params(CPHA) 1 +set ad_project_params(SDO_IDLE_STATE) 0 +set ad_project_params(SLAVE_TIN) 0 +set ad_project_params(SLAVE_TOUT) 0 +set ad_project_params(MASTER_TIN) 0 +set ad_project_params(MASTER_TOUT) 0 +set ad_project_params(CS_TO_MISO) 0 +set ad_project_params(CLOCK_DIVIDER) 2 +set ad_project_params(NUM_OF_WORDS) 3 +set ad_project_params(NUM_OF_TRANSFERS) 5 +set ad_project_params(CS_ACTIVE_HIGH) 0 +set ad_project_params(ECHO_SCLK_DELAY) 0.1 + +set spi_s_vip_cfg [ list \ + MODE 0 \ + CPOL $ad_project_params(CPOL) \ + CPHA $ad_project_params(CPHA) \ + INV_CS $ad_project_params(CS_ACTIVE_HIGH) \ + SLAVE_TIN $ad_project_params(SLAVE_TIN) \ + SLAVE_TOUT $ad_project_params(SLAVE_TOUT) \ + MASTER_TIN $ad_project_params(MASTER_TIN) \ + MASTER_TOUT $ad_project_params(MASTER_TOUT) \ + CS_TO_MISO $ad_project_params(CS_TO_MISO) \ + DATA_DLENGTH $ad_project_params(DATA_DLENGTH) \ +] +set ad_project_params(spi_s_vip_cfg) $spi_s_vip_cfg + +set axis_sdo_src_vip_cfg [ list \ + INTERFACE_MODE {MASTER} \ + HAS_TREADY 1 \ + HAS_TLAST 0 \ + TDATA_NUM_BYTES [expr $ad_project_params(DATA_WIDTH)/8] \ + TDEST_WIDTH 0 \ + TID_WIDTH 0 \ +] +set ad_project_params(axis_sdo_src_vip_cfg) $axis_sdo_src_vip_cfg diff --git a/testbenches/ip/spi_engine/cfgs/cfg_inv_cs.tcl b/testbenches/ip/spi_engine/cfgs/cfg_inv_cs.tcl index 1238c667..8e18ab15 100644 --- a/testbenches/ip/spi_engine/cfgs/cfg_inv_cs.tcl +++ b/testbenches/ip/spi_engine/cfgs/cfg_inv_cs.tcl @@ -32,7 +32,6 @@ set ad_project_params(NUM_OF_WORDS) 3 set ad_project_params(NUM_OF_TRANSFERS) 5 set ad_project_params(CS_ACTIVE_HIGH) 1 set ad_project_params(ECHO_SCLK_DELAY) 0.1 -set ad_project_params(SDO_MEM_WORDS) 2 set spi_s_vip_cfg [ list \ MODE 0 \ diff --git a/testbenches/ip/spi_engine/cfgs/cfg_sdo_streaming.tcl b/testbenches/ip/spi_engine/cfgs/cfg_sdo_streaming.tcl index a9cdd37e..523eadfc 100644 --- a/testbenches/ip/spi_engine/cfgs/cfg_sdo_streaming.tcl +++ b/testbenches/ip/spi_engine/cfgs/cfg_sdo_streaming.tcl @@ -32,7 +32,6 @@ set ad_project_params(NUM_OF_WORDS) 5 set ad_project_params(NUM_OF_TRANSFERS) 3 set ad_project_params(CS_ACTIVE_HIGH) 0 set ad_project_params(ECHO_SCLK_DELAY) 0.1 -set ad_project_params(SDO_MEM_WORDS) 2 set spi_s_vip_cfg [ list \ MODE 0 \ diff --git a/testbenches/ip/spi_engine/system_project.tcl b/testbenches/ip/spi_engine/system_project.tcl index 35c82527..93e3b099 100644 --- a/testbenches/ip/spi_engine/system_project.tcl +++ b/testbenches/ip/spi_engine/system_project.tcl @@ -27,6 +27,7 @@ adi_sim_project_files [list \ "spi_environment.sv" \ "tests/test_program.sv" \ "tests/test_sleep_delay.sv" \ + "tests/test_slowdata.sv" \ ] #set a default test program diff --git a/testbenches/ip/spi_engine/tests/test_program.sv b/testbenches/ip/spi_engine/tests/test_program.sv index b5cc0732..2f1d3427 100644 --- a/testbenches/ip/spi_engine/tests/test_program.sv +++ b/testbenches/ip/spi_engine/tests/test_program.sv @@ -1,6 +1,6 @@ // *************************************************************************** // *************************************************************************** -// Copyright (C) 2023-2024 Analog Devices, Inc. All rights reserved. +// Copyright (C) 2023-2025 Analog Devices, Inc. All rights reserved. // // In this HDL repository, there are many different and unique modules, consisting // of various HDL (Verilog or VHDL) components. The individual modules are @@ -274,8 +274,6 @@ bit [`DATA_DLENGTH-1:0] sdi_read_data_store [(`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) bit [`DATA_DLENGTH-1:0] sdo_write_data_store [(`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1 :0]; bit [`DATA_DLENGTH-1:0] rx_data; bit [`DATA_DLENGTH-1:0] tx_data; -localparam sdo_mem_num = (`SDO_STREAMING) ? (`MIN((`NUM_OF_WORDS),(`SDO_MEM_WORDS))) : (`NUM_OF_WORDS); -bit [`DATA_DLENGTH-1:0] one_shot_sdo_data [sdo_mem_num-1 :0] = '{default:'0}; task offload_spi_test(); //Configure DMA @@ -301,21 +299,21 @@ task offload_spi_test(); axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_SYNC | 2); // Enqueue transfers transfers to DUT - for (int i = 0; i +// +// OR +// +// 2. An ADI specific BSD license, which can be found in the top level directory +// of this repository (LICENSE_ADIBSD), and also on-line at: +// https://github.com/analogdevicesinc/hdl/blob/main/LICENSE_ADIBSD +// This will allow to generate bit files and not release the source code, +// as long as it attaches to an ADI device. +// +// *************************************************************************** +// *************************************************************************** +// +// + +`include "utils.svh" + +import axi_vip_pkg::*; +import axi4stream_vip_pkg::*; +import adi_regmap_pkg::*; +import adi_regmap_clkgen_pkg::*; +import adi_regmap_dmac_pkg::*; +import adi_regmap_pwm_gen_pkg::*; +import adi_regmap_spi_engine_pkg::*; +import logger_pkg::*; +import spi_environment_pkg::*; +import spi_engine_instr_pkg::*; +import adi_spi_vip_pkg::*; + +//--------------------------------------------------------------------------- +// SPI Engine configuration parameters +//--------------------------------------------------------------------------- + +program test_slowdata ( + inout spi_engine_irq, + inout spi_engine_spi_sclk, + inout [(`NUM_OF_CS - 1):0] spi_engine_spi_cs, + inout spi_engine_spi_clk, + `ifdef DEF_ECHO_SCLK + inout spi_engine_echo_sclk, + `endif + inout [(`NUM_OF_SDI - 1):0] spi_engine_spi_sdi); + +timeunit 1ns; +timeprecision 100ps; + +spi_environment env; + +// -------------------------- +// Wrapper function for AXI read verify +// -------------------------- +task axi_read_v( + input [31:0] raddr, + input [31:0] vdata); + env.mng.RegReadVerify32(raddr,vdata); +endtask + +task axi_read( + input [31:0] raddr, + output [31:0] data); + env.mng.RegRead32(raddr,data); +endtask + +// -------------------------- +// Wrapper function for AXI write +// -------------------------- +task axi_write( + input [31:0] waddr, + input [31:0] wdata); + env.mng.RegWrite32(waddr,wdata); +endtask + +// -------------------------- +// Wrapper function for SPI receive (from DUT) +// -------------------------- +task spi_receive( + output [`DATA_DLENGTH:0] data); + env.spi_seq.receive_data(data); +endtask + +// -------------------------- +// Wrapper function for SPI send (to DUT) +// -------------------------- +task spi_send( + input [`DATA_DLENGTH:0] data); + env.spi_seq.send_data(data); +endtask + +// -------------------------- +// Wrapper function for waiting for all SPI +// -------------------------- +task spi_wait_send(); + env.spi_seq.flush_send(); +endtask + + + +// -------------------------- +// Main procedure +// -------------------------- +initial begin + + //creating environment + env = new("SPI Engine Environment", + `TH.`SYS_CLK.inst.IF, + `TH.`DMA_CLK.inst.IF, + `TH.`DDR_CLK.inst.IF, + `TH.`SYS_RST.inst.IF, + `ifdef DEF_SDO_STREAMING + `TH.`SDO_SRC.inst.IF, + `endif + `TH.`MNG_AXI.inst.IF, + `TH.`DDR_AXI.inst.IF, + `TH.`SPI_S.inst.IF + ); + + setLoggerVerbosity(ADI_VERBOSITY_NONE); + env.start(); + env.configure(); + + env.sys_reset(); + + env.run(); + + env.spi_seq.set_default_miso_data('h2AA55); + + // start sdo source (will wait for data enqueued) + `ifdef DEF_SDO_STREAMING + env.sdo_src_seq.start(); + `endif + + sanity_test(); + + #100ns + + fifo_init_test(); + + fifo_single_read_test(); + + fifo_double_write_test(); + + fifo_double_read_test(); + + fifo_double_write_test(); + + offload_spi_test(); + + #100ns + `INFO(("Test Done"), ADI_VERBOSITY_NONE); + + $finish; + +end + +//--------------------------------------------------------------------------- +// Sanity test reg interface +//--------------------------------------------------------------------------- + +task sanity_test(); + bit [31:0] pcore_version = (`DEFAULT_AXI_SPI_ENGINE_VERSION_VERSION_PATCH) + | (`DEFAULT_AXI_SPI_ENGINE_VERSION_VERSION_MINOR)<<8 + | (`DEFAULT_AXI_SPI_ENGINE_VERSION_VERSION_MAJOR)<<16; + //axi_read_v (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_VERSION), pcore_version); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SCRATCH), 32'hDEADBEEF); + axi_read_v (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SCRATCH), 32'hDEADBEEF); + `INFO(("Sanity Test Done"), ADI_VERBOSITY_LOW); +endtask + +//--------------------------------------------------------------------------- +// SPI Engine generate transfer +//--------------------------------------------------------------------------- + +task generate_init_transfer_cmd( + input [7:0] sync_id); + // configure cs + if (`CS_ACTIVE_HIGH) begin + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS_INV_MASK(8'hFF)); + end + // write cfg + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_CFG); + // assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFE)); + // write prescaler + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_PRESCALE); + // write dlen + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_DLENGTH); + // transfer data + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_WR); + // de-assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFF)); + // SYNC command to generate interrupt + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_SYNC | sync_id)); + `INFO(("Transfer generation finished."), ADI_VERBOSITY_LOW); +endtask + +task generate_single_rtransfer_cmd( + input [7:0] sync_id); + // configure cs + if (`CS_ACTIVE_HIGH) begin + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS_INV_MASK(8'hFF)); + end + // write cfg + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_CFG); + // assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFE)); + // write prescaler + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_PRESCALE); + // write dlen + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_DLENGTH); + // transfer data + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_RD & 16'hFF00)); + // de-assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFF)); + // SYNC command to generate interrupt + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_SYNC | sync_id)); + `INFO(("Transfer generation finished."), ADI_VERBOSITY_LOW); +endtask + + +task generate_double_rtransfer_cmd( + input [7:0] sync_id); + // configure cs + if (`CS_ACTIVE_HIGH) begin + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS_INV_MASK(8'hFF)); + end + // write cfg + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_CFG); + // assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFE)); + // write prescaler + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_PRESCALE); + // write dlen + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_DLENGTH); + // transfer data + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_RD & 16'hFF00)); + // transfer data + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_RD & 16'hFF00)); + // de-assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFF)); + // SYNC command to generate interrupt + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_SYNC | sync_id)); + `INFO(("Transfer generation finished."), ADI_VERBOSITY_LOW); +endtask + +task generate_double_wtransfer_cmd( + input [7:0] sync_id); + // configure cs + if (`CS_ACTIVE_HIGH) begin + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS_INV_MASK(8'hFF)); + end + // write cfg + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_CFG); + // assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFE)); + // write prescaler + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_PRESCALE); + // write dlen + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `INST_DLENGTH); + // transfer data + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_WR & 16'hFF00)); + // transfer data + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_WR & 16'hFF00)); + // de-assert CSN + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), `SET_CS(8'hFF)); + // SYNC command to generate interrupt + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_CMD_FIFO), (`INST_SYNC | sync_id)); + `INFO(("Transfer generation finished."), ADI_VERBOSITY_LOW); +endtask + +//--------------------------------------------------------------------------- +// IRQ callback +//--------------------------------------------------------------------------- + +reg [4:0] irq_pending = 0; +reg [7:0] sync_id = 0; + +initial begin + forever begin + @(posedge spi_engine_irq); + // read pending IRQs + + axi_read (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_IRQ_PENDING), irq_pending); + // IRQ launched by Offload SYNC command + if (irq_pending & 5'b10000) begin + axi_read (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SYNC_ID), sync_id); + `INFO(("Offload SYNC %d IRQ. An offload transfer just finished.", sync_id), ADI_VERBOSITY_LOW); + end + // IRQ launched by SYNC command + if (irq_pending & 5'b01000) begin + axi_read (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SYNC_ID), sync_id); + `INFO(("SYNC %d IRQ. FIFO transfer just finished.", sync_id), ADI_VERBOSITY_LOW); + end + // IRQ launched by SDI FIFO + if (irq_pending & 5'b00100) begin + `INFO(("SDI FIFO IRQ."), ADI_VERBOSITY_LOW); + end + // IRQ launched by SDO FIFO + if (irq_pending & 5'b00010) begin + `INFO(("SDO FIFO IRQ."), ADI_VERBOSITY_LOW); + end + // IRQ launched by SDO FIFO + if (irq_pending & 5'b00001) begin + `INFO(("CMD FIFO IRQ."), ADI_VERBOSITY_LOW); + end + // Clear all pending IRQs + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_IRQ_PENDING), irq_pending); + end +end + +//--------------------------------------------------------------------------- +// SPI Engine SDO data +//--------------------------------------------------------------------------- + +task sdo_stream_gen( + input [`DATA_DLENGTH:0] tx_data); + xil_axi4stream_data_byte data[(`DATA_WIDTH/8)-1:0]; + `ifdef DEF_SDO_STREAMING + for (int i = 0; i<(`DATA_WIDTH/8);i++) begin + data[i] = (tx_data & (8'hFF << 8*i)) >> 8*i; + env.sdo_src_seq.push_byte_for_stream(data[i]); + end + env.sdo_src_seq.add_xfer_descriptor((`DATA_WIDTH/8),0,0); + `endif +endtask + +//--------------------------------------------------------------------------- +// Echo SCLK generation - we need this only if ECHO_SCLK is enabled +//--------------------------------------------------------------------------- +`ifdef DEF_ECHO_SCLK + assign #(`ECHO_SCLK_DELAY * 1ns) spi_engine_echo_sclk = spi_engine_spi_sclk; +`endif + +//--------------------------------------------------------------------------- +// FIFO SPI Test +//--------------------------------------------------------------------------- + +bit [`DATA_DLENGTH-1:0] sdi_fifo_data [`NUM_OF_WORDS-1:0]= '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdo_fifo_data [`NUM_OF_WORDS-1:0]= '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdi_fifo_data_store [`NUM_OF_WORDS-1:0]; +bit [`DATA_DLENGTH-1:0] sdo_fifo_data_store [`NUM_OF_WORDS-1:0]; +bit [`DATA_DLENGTH-1:0] rx_data; +bit [`DATA_DLENGTH-1:0] tx_data; + +task fifo_init_test(); + // Start spi clk generator + axi_write (`SPI_ENGINE_AXI_CLKGEN_BA + GetAddrs(AXI_CLKGEN_REG_RSTN), + `SET_AXI_CLKGEN_REG_RSTN_MMCM_RSTN(1) | + `SET_AXI_CLKGEN_REG_RSTN_RSTN(1) + ); + + // Enable SPI Engine + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_ENABLE), `SET_AXI_SPI_ENGINE_ENABLE_ENABLE(0)); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_ENABLE), `SET_AXI_SPI_ENGINE_ENABLE_ENABLE(0)); + + // Set up the interrupts + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_IRQ_MASK), + `SET_AXI_SPI_ENGINE_IRQ_MASK_SYNC_EVENT(1) | + `SET_AXI_SPI_ENGINE_IRQ_MASK_OFFLOAD_SYNC_ID_PENDING(1) + ); + + #100ns + + // send cmd before data + generate_init_transfer_cmd(1); + + // write sdo fifo + for (int i = 0; i<(`NUM_OF_WORDS) ; i=i+1) begin + tx_data = ((i%6) == 5) ? 8'hFE : 8'hFF; + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SDO_FIFO), (tx_data));// << (`DATA_WIDTH - `DATA_DLENGTH))); + sdo_fifo_data_store[i] = tx_data; + end + + `INFO(("Wait for SPI VIP receiving data"), ADI_VERBOSITY_LOW); + for (int i = 0; i<(`NUM_OF_WORDS) ; i=i+1) begin + spi_receive(sdo_fifo_data[i]); + end + + if (sdo_fifo_data !== sdo_fifo_data_store) begin + `INFO(("sdo_fifo_data: %x; sdo_fifo_data_store %x", sdo_fifo_data, sdo_fifo_data_store), ADI_VERBOSITY_LOW); + `ERROR(("Fifo Write Test FAILED")); + end + `INFO(("Fifo Write Test PASSED"), ADI_VERBOSITY_LOW); +endtask + +bit [`DATA_DLENGTH-1:0] sdo_2_fifo_data [2-1:0]= '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdo_2_fifo_data_store [2-1:0]; +task fifo_double_write_test(); + + #100ns + + // send cmd before data + generate_double_wtransfer_cmd(1); + + // write sdo fifo + for (int i = 0; i<(2) ; i=i+1) begin + tx_data = $urandom; + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SDO_FIFO), (tx_data));// << (`DATA_WIDTH - `DATA_DLENGTH))); + sdo_2_fifo_data_store[i] = tx_data; + end + + `INFO(("Wait for SPI VIP receiving data"), ADI_VERBOSITY_LOW); + for (int i = 0; i<(2) ; i=i+1) begin + spi_receive(sdo_2_fifo_data[i]); + end + + if (sdo_2_fifo_data !== sdo_2_fifo_data_store) begin + `INFO(("sdo_2_fifo_data: %x; sdo_2_fifo_data_store %x", sdo_2_fifo_data, sdo_2_fifo_data_store), ADI_VERBOSITY_LOW); + `ERROR(("Double Write Test FAILED")); + end + `INFO(("Double Write Test PASSED"), ADI_VERBOSITY_LOW); +endtask + +bit [`DATA_DLENGTH-1:0] sdi_2_fifo_data [2-1:0]= '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdi_2_fifo_data_store [2-1:0]; +bit [`DATA_DLENGTH-1:0] foo; +task fifo_double_read_test(); + + #100ns + + + + for (int i = 0; i<(2) ; i=i+1) begin + rx_data = $urandom; + spi_send(rx_data); + sdi_2_fifo_data_store[i] = rx_data; + end + + generate_double_rtransfer_cmd(1); + + `INFO(("Wait for SPI VIP data send"), ADI_VERBOSITY_LOW); + spi_wait_send(); + `INFO(("SPI sent"), ADI_VERBOSITY_LOW); + + for (int i = 0; i<(2) ; i=i+1) begin + spi_receive(foo); // dummy tx, just for clearing the VIP queue + axi_read (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SDI_FIFO), sdi_2_fifo_data[i]); + end + + if (sdi_2_fifo_data !== sdi_2_fifo_data_store) begin + `INFO(("sdi_2_fifo_data: %x; sdi_2_fifo_data_store %x", sdi_2_fifo_data, sdi_2_fifo_data_store), ADI_VERBOSITY_LOW); + `ERROR(("Double Read Test FAILED")); + end + `INFO(("Double Read Test PASSED"), ADI_VERBOSITY_LOW); +endtask + +bit [`DATA_DLENGTH-1:0] sdi_1_fifo_data = '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdi_1_fifo_data_store ; +task fifo_single_read_test(); + + #100ns + + rx_data = $urandom; + spi_send(rx_data); + sdi_1_fifo_data_store = rx_data; + + generate_single_rtransfer_cmd(1); + + `INFO(("Wait for SPI VIP data send"), ADI_VERBOSITY_LOW); + spi_wait_send(); + `INFO(("SPI sent"), ADI_VERBOSITY_LOW); + + spi_receive(foo); // dummy tx, just for clearing the VIP queue + axi_read (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_SDI_FIFO), sdi_1_fifo_data); + + if (sdi_1_fifo_data !== sdi_1_fifo_data_store) begin + `INFO(("sdi_1_fifo_data: %x; sdi_1_fifo_data_store %x", sdi_1_fifo_data, sdi_1_fifo_data_store), ADI_VERBOSITY_LOW); + `ERROR(("Single Read Test FAILED")); + end + `INFO(("Single Read Test PASSED"), ADI_VERBOSITY_LOW); +endtask + +//--------------------------------------------------------------------------- +// Offload SPI Test +//--------------------------------------------------------------------------- + +bit [`DATA_DLENGTH-1:0] sdi_read_data [(`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1 :0] = '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdo_write_data [(`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1 :0] = '{default:'0}; +bit [`DATA_DLENGTH-1:0] sdi_read_data_store [(`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1 :0]; +bit [`DATA_DLENGTH-1:0] sdo_write_data_store [(`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1 :0]; +bit [`DATA_DLENGTH-1:0] rx_data; +bit [`DATA_DLENGTH-1:0] tx_data; + +task offload_spi_test(); + + // Config pwm + axi_write (`SPI_ENGINE_PWM_GEN_BA + GetAddrs(AXI_PWM_GEN_REG_RSTN), `SET_AXI_PWM_GEN_REG_RSTN_RESET(1)); // PWM_GEN reset in regmap (ACTIVE HIGH) + axi_write (`SPI_ENGINE_PWM_GEN_BA + GetAddrs(AXI_PWM_GEN_REG_PULSE_X_PERIOD), `SET_AXI_PWM_GEN_REG_PULSE_X_PERIOD_PULSE_X_PERIOD('d105)); // set PWM period + axi_write (`SPI_ENGINE_PWM_GEN_BA + GetAddrs(AXI_PWM_GEN_REG_RSTN), `SET_AXI_PWM_GEN_REG_RSTN_LOAD_CONFIG(1)); // load AXI_PWM_GEN configuration + `INFO(("axi_pwm_gen started."), ADI_VERBOSITY_LOW); + + //Configure DMA + env.mng.RegWrite32(`SPI_ENGINE_DMA_BA + GetAddrs(DMAC_CONTROL), `SET_DMAC_CONTROL_ENABLE(1)); + env.mng.RegWrite32(`SPI_ENGINE_DMA_BA + GetAddrs(DMAC_FLAGS), + `SET_DMAC_FLAGS_TLAST(1) | + `SET_DMAC_FLAGS_PARTIAL_REPORTING_EN(1) + ); // Use TLAST + env.mng.RegWrite32(`SPI_ENGINE_DMA_BA + GetAddrs(DMAC_X_LENGTH), `SET_DMAC_X_LENGTH_X_LENGTH(((`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS)*4)-1)); + env.mng.RegWrite32(`SPI_ENGINE_DMA_BA + GetAddrs(DMAC_DEST_ADDRESS), `SET_DMAC_DEST_ADDRESS_DEST_ADDRESS(`DDR_BA)); + env.mng.RegWrite32(`SPI_ENGINE_DMA_BA + GetAddrs(DMAC_TRANSFER_SUBMIT), `SET_DMAC_TRANSFER_SUBMIT_TRANSFER_SUBMIT(1)); + + // Configure the Offload module + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_CFG); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `SET_CS(8'hFE)); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_PRESCALE); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_DLENGTH); + if (`CS_ACTIVE_HIGH) begin + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `SET_CS_INV_MASK(8'hFF)); + end + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_WRD); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `SET_CS(8'hFF)); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_DLENGTH); + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_CDM_FIFO), `INST_SYNC | 2); + + // Enqueue transfers transfers to DUT + for (int i = 0; i<((`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS)) ; i=i+1) begin + rx_data = $urandom; + spi_send(rx_data); + sdi_read_data_store[i] = rx_data; + tx_data = $urandom; + `ifdef DEF_SDO_STREAMING + sdo_stream_gen(tx_data); + sdo_write_data_store[i] = tx_data; + `else + if (i<(`NUM_OF_WORDS)) begin + sdo_write_data_store[i] = tx_data; + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_SDO_FIFO), sdo_write_data_store[i]); + end else begin + sdo_write_data_store[i] = sdo_write_data_store[i%(`NUM_OF_WORDS)]; + end + `endif + end + + // Start the offload + #100ns + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_EN), `SET_AXI_SPI_ENGINE_OFFLOAD0_EN_OFFLOAD0_EN(1)); + `INFO(("Offload started."), ADI_VERBOSITY_LOW); + + spi_wait_send(); + + axi_write (`SPI_ENGINE_SPI_REGMAP_BA + GetAddrs(AXI_SPI_ENGINE_OFFLOAD0_EN), `SET_AXI_SPI_ENGINE_OFFLOAD0_EN_OFFLOAD0_EN(0)); + + `INFO(("Offload stopped."), ADI_VERBOSITY_LOW); + + #2000ns + + if (irq_pending == 'h0) begin + `ERROR(("IRQ Test FAILED")); + end else begin + `INFO(("IRQ Test PASSED"), ADI_VERBOSITY_LOW); + end + + for (int i=0; i<=((`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1); i=i+1) begin + sdi_read_data[i] = env.ddr_axi_agent.mem_model.backdoor_memory_read_4byte(`DDR_BA + 4*i); + if (sdi_read_data[i] != sdi_read_data_store[i]) begin + `INFO(("sdi_read_data[%d]: %x; sdi_read_data_store[%d]: %x", i, sdi_read_data[i], i, sdi_read_data_store[i]), ADI_VERBOSITY_LOW); + `ERROR(("Offload Read Test FAILED")); + end + end + `INFO(("Offload Read Test PASSED"), ADI_VERBOSITY_LOW); + + for (int i=0; i<=((`NUM_OF_TRANSFERS)*(`NUM_OF_WORDS) -1); i=i+1) begin + spi_receive(sdo_write_data[i]); + if (sdo_write_data[i] != sdo_write_data_store[i]) begin + `INFO(("sdo_write_data[%d]: %x; sdo_write_data_store[%d]: %x", i, sdo_write_data[i], i, sdo_write_data_store[i]), ADI_VERBOSITY_LOW); + `ERROR(("Offload Write Test FAILED")); + end + end + `INFO(("Offload Write Test PASSED"), ADI_VERBOSITY_LOW); +endtask + +endprogram \ No newline at end of file diff --git a/testbenches/ip/spi_engine/waves/cfg00.wcfg b/testbenches/ip/spi_engine/waves/cfg00.wcfg new file mode 100644 index 00000000..2fd0c6e1 --- /dev/null +++ b/testbenches/ip/spi_engine/waves/cfg00.wcfg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testbenches/ip/spi_engine/waves/cfg1.wcfg b/testbenches/ip/spi_engine/waves/cfg01.wcfg similarity index 100% rename from testbenches/ip/spi_engine/waves/cfg1.wcfg rename to testbenches/ip/spi_engine/waves/cfg01.wcfg diff --git a/testbenches/ip/spi_engine/waves/cfg10.wcfg b/testbenches/ip/spi_engine/waves/cfg10.wcfg new file mode 100644 index 00000000..274ebdb8 --- /dev/null +++ b/testbenches/ip/spi_engine/waves/cfg10.wcfg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spi_engine_spi_cs + spi_engine_spi_cs + + + spi_engine_spi_sclk + spi_engine_spi_sclk + + + spi_engine_spi_clk + spi_engine_spi_clk + + + spi_engine_spi_sdi + spi_engine_spi_sdi + + + spi_engine_spi_sdo + spi_engine_spi_sdo + + + spi_engine_irq + spi_engine_irq + + + offload_captured_word_arr[19:0][31:0] + offload_captured_word_arr[19:0][31:0] + + + offload_sdi_data_store_arr[19:0][31:0] + offload_sdi_data_store_arr[19:0][31:0] + + + sdi_fifo_data[19:0][31:0] + sdi_fifo_data[19:0][31:0] + + + sdi_fifo_data_store[19:0][31:0] + sdi_fifo_data_store[19:0][31:0] + + diff --git a/testbenches/ip/spi_engine/waves/cfg11.wcfg b/testbenches/ip/spi_engine/waves/cfg11.wcfg new file mode 100644 index 00000000..274ebdb8 --- /dev/null +++ b/testbenches/ip/spi_engine/waves/cfg11.wcfg @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + spi_engine_spi_cs + spi_engine_spi_cs + + + spi_engine_spi_sclk + spi_engine_spi_sclk + + + spi_engine_spi_clk + spi_engine_spi_clk + + + spi_engine_spi_sdi + spi_engine_spi_sdi + + + spi_engine_spi_sdo + spi_engine_spi_sdo + + + spi_engine_irq + spi_engine_irq + + + offload_captured_word_arr[19:0][31:0] + offload_captured_word_arr[19:0][31:0] + + + offload_sdi_data_store_arr[19:0][31:0] + offload_sdi_data_store_arr[19:0][31:0] + + + sdi_fifo_data[19:0][31:0] + sdi_fifo_data[19:0][31:0] + + + sdi_fifo_data_store[19:0][31:0] + sdi_fifo_data_store[19:0][31:0] + +