| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| { |
| name: "spi_host" |
| import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/alert_test_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/intr_test_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/mem_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/stress_all_with_reset_testplan.hjson", |
| "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", |
| "spi_host_sec_cm_testplan.hjson"], |
| testpoints: [ |
| { |
| name: smoke |
| desc: ''' |
| SPI_HOST smoke test in which random (rd/wr) transactions are sent to the DUT and |
| received asynchronously with scoreboard checks. |
| |
| Stimulus: |
| - Enable spi_host ip |
| - Write data in standard mode - and read it back |
| |
| Checking: |
| - Ensure transactions are transmitted/received correctly |
| ''' |
| stage: V1 |
| tests: ["spi_host_smoke"] |
| } |
| { |
| name: performance |
| desc: ''' |
| Send/receive transactions at max bandwidth |
| |
| Stimulus: |
| - Program the content of timing fields of CONFIGOPTS to the min values |
| - Programming TX1_CNT and TXN_CNT to issue read/write back-to-back transactions |
| - Read/write rx_fifo/tx_fifo as soon as possible (avoid stalling transactions) |
| |
| Checking: |
| - Ensure transactions are transmitted/received correctly |
| ''' |
| stage: V2 |
| tests: ["spi_host_performance"] |
| } |
| { |
| name: error_event_intr |
| desc: ''' |
| This test includes multi tasks which verify error/event interrupt assertion |
| (except TX OVERFLOW error interrupt is verified in separate test) |
| |
| Stimulus: |
| - Program ERROR_ENABLE/EVENT_ENABLE register to enable |
| corresponding error/event interrupt assertion |
| - Program transaction with proper constraints to assert error/event interrupts |
| |
| Checking: |
| - Ensure transactions are transmitted/received correctly |
| - Ensure the matching between the bit-field values of ERROR_STATUS |
| and ERROR_ENABLE respectively once the error interrupt pin is asserted |
| - Ensure the matching between the bit-field values of ERROR_ENABLE |
| once the event interrupt pin is asserted |
| ''' |
| stage: V2 |
| tests: ["spi_host_overflow_underflow", "spi_host_error_cmd", "spi_host_event"] |
| } |
| { |
| name: clock_rate |
| desc: ''' |
| Stimulus: |
| - select different settings for: |
| * CONFIGOPTS_0.CSNIDLE_0 |
| * CONFIGOPTS_0.CSNLEAD_0 |
| * CONFIGOPTS_0.CSNTRAIL_0 |
| |
| Checking: |
| - verify that merging of commands work correctly |
| - verify that the DUT can handle different sck -> cs_n timings |
| ''' |
| stage: V2 |
| tests: ["spi_host_speed"] |
| } |
| { |
| name: speed |
| desc: ''' |
| Stimulus: |
| - randomly select the DUT to run single/dual/quad mode |
| |
| Checking: |
| - verify that all speeds are supported |
| ''' |
| stage: V2 |
| tests: ["spi_host_speed"] |
| } |
| { |
| name: chip_select_timing |
| desc: ''' |
| Stimulus: |
| - Randomly select a setting for the 16bit clock divider |
| |
| Checking: |
| - Check that the DUT operates correctly under different SPI clock speeds |
| ''' |
| stage: V2 |
| tests: ["spi_host_speed"] |
| } |
| { |
| name: sw_reset |
| desc: ''' |
| verify software reset behavior |
| |
| Stimulus: |
| - Reset the spi_host randomly |
| after a random number of data shows up on fifos |
| |
| Checking: |
| - Ensure that reads to RXDATA register yield 0s after the rx_fifo is reset |
| - Ensure that transactions are dropped in both the scoreboard and spi_agent monitor |
| after the tx_fifo or spi_fsm is reset |
| ''' |
| stage: V2 |
| tests: ["spi_host_sw_reset"] |
| } |
| { |
| name: passthrough_mode |
| desc: ''' |
| - Verify the function of spi_host in passthrough_mode |
| |
| Stimulus: |
| - Enable Passthrough Mode |
| Checking: |
| - Ensure Host to Device and Device to Host paths are switched to Passthrough ports |
| ''' |
| stage: V2 |
| tests: ["spi_host_passthrough_mode"] |
| } |
| { |
| name: cpol_cpha |
| desc: ''' |
| Stimulus: |
| - Randomly chip select for different polarity / phase |
| |
| Checking: |
| - Check that the DUT operates correctly under different cs_n settings |
| ''' |
| stage: V2 |
| tests: ["spi_host_speed"] |
| } |
| { |
| name: full_cycle |
| desc: ''' |
| Stimulus: |
| - randomly select FULLCYC to be set |
| |
| Checking: |
| - Check that the data can be read one full cycle after the data was asserted |
| ''' |
| stage: V2 |
| tests: ["spi_host_speed"] |
| } |
| { |
| name: duplex |
| desc: ''' |
| Stimulus: |
| - in standard mode set the DUT to run full duplex |
| |
| Checking: |
| - verify that the DUT support both half and full duplex in standard mode. |
| ''' |
| stage: V2 |
| tests: ["spi_host_smoke"] |
| } |
| { |
| name: tx_rx_only |
| desc: ''' |
| Stimulus: |
| - in standard mode enable tx only and have the env send garbage back |
| - in standard mode enable rx only and have the env ignore the incoming data |
| |
| Checking: |
| - verify that the DUT ignores rx line when in tx only mode |
| - verify that the DUT does not drain the tx fifo in rx only mode |
| ''' |
| stage: V2 |
| tests: ["spi_host_smoke"] |
| } |
| { |
| name: stress_all |
| desc: ''' |
| Support vseq (context) switching with random reset in between. |
| |
| Stimulus: |
| - Combine the above sequences in one test to run sequentially |
| except csr sequence and (requires zero_delays) |
| - Randomly add reset between each sequence |
| |
| Checking: |
| - Ensure transactions are transmitted/received correctly |
| - Ensure reset is handled correctly |
| ''' |
| stage: V2 |
| tests: ["spi_host_stress_all"] |
| } |
| { |
| name: spien |
| desc: ''' |
| Check that with mid-transaction writes to CONTROL.SPIEN, the block behaves according |
| to the documentation. |
| - Writing a zero to this register temporarily suspends any previously |
| submitted transactions. |
| - If the block is re-enabled by writing a one to CONTROL.SPIEN, any previously |
| executing commands will continue from wherever they left off. |
| |
| Stimulus: |
| - Issue a transaction |
| - De-assert CONTROL.SPIEN after the command byte is receieved |
| - Re-assert after a randomized delay |
| Checking: |
| - Ensure transactions are transmitted/received correctly, even with a large |
| temporary suspension in the middle. |
| ''' |
| stage: V2 |
| tests: ["spi_host_spien"] |
| } |
| { |
| name: stall |
| desc: ''' |
| Stimulus: |
| - Ongoing transaction has stalled due to lack of available space in the RX FIFO |
| and continues when RX fifo is cleared |
| - Ongoing transaction has stalled due to lack of data in the TX FIFO |
| and continues when data is provided in TX FIFO |
| |
| Checking: |
| - Ensure Rxstall occurs and recovers |
| - Ensure Txstall occurs and recovers |
| ''' |
| stage: V2 |
| tests: ["spi_host_status_stall"] |
| } |
| { |
| name: Idlecsbactive |
| desc: ''' |
| Stimulus: |
| - Pause next segment availability and idly wait for next command |
| |
| Checking: |
| - Ensure transactions goes through even with a segment pause and idle wait |
| in the state IdleCsbActive |
| ''' |
| stage: V2 |
| tests: ["spi_host_idlecsbactive"] |
| } |
| { |
| name: winbond |
| desc: ''' |
| Replace SPI agent with the Winbond Flash model |
| |
| Stimulus: |
| - constraint the Sequence to create welformed transactions that the model understands |
| |
| Checking: |
| - Verify the DUT against the WindBond bfm by making the spi agent passive |
| to verify that we comply with the spi targeted for opentitan |
| ''' |
| stage: V3 |
| tests: [] |
| } |
| ] |
| covergroups: [ |
| { |
| name: tx_fifo_overflow_cg |
| desc: ''' |
| Collect coverage to verify that an attempt was made to overflow the TX FIFO |
| by attempting to write to a full FIFO |
| ''' |
| } |
| { |
| name: rx_fifo_underflow_cg |
| desc: ''' |
| Collect coverage to verify that an attempt was made to underflow the RX FIFO |
| by attempting to read from an empty FIFO |
| ''' |
| } |
| { |
| name: long_commands_cg |
| desc: ''' |
| Collect coverage to verify that both a read and write command longer than 4 bytes |
| was seen |
| ''' |
| } |
| { |
| name:config_opts_cg |
| desc: ''' |
| Collect coverage on the config opts register, some important crosses: |
| |
| - CPOL and CPHA, check all 4 combinations are tested |
| - CSNLEAD, CSNTRAIL and CSNIDLE |
| ''' |
| } |
| { |
| name: cdc_cg |
| desc: ''' |
| Collect coverage on the relationship between the core_clk and the spi_sck to verify that |
| both scenarios with both a slow spi_sck, a very fast spi_sck (2x core_clk) |
| and where the two clocks are very close has been tested |
| ''' |
| } |
| { |
| name: unaligned_data_cg |
| desc: ''' |
| Collect coverage the alignment of writes to the data window |
| to verify that all possible alignments was seen |
| ''' |
| } |
| { |
| name: duplex_cg |
| desc: ''' |
| Collect coverage that we verified both duplex and half duplex |
| ''' |
| } |
| { |
| name: interrupts_cg |
| desc: ''' |
| Collect coverage that all types of interrupt was seen |
| ''' |
| } |
| { |
| name: control_cg |
| desc: ''' |
| Collect coverage on the control register to make sure all options are excercised |
| - Tx and RX water mark should have a bin for min value, max value |
| and one for everything in between |
| ''' |
| } |
| { |
| name: status_cg |
| desc: ''' |
| Collect coverage on the status register to make sure all scenarios are checked |
| ''' |
| } |
| { |
| name: csid_cg |
| desc: ''' |
| Collect coverage that different IDs are used. |
| ''' |
| } |
| { |
| name: command_cg |
| desc: ''' |
| Collect coverage that different commant settings, important cross: |
| |
| - Direction and SPEED |
| - CSAAT and SPEED |
| ''' |
| } |
| { |
| name: error_en_cg |
| desc: ''' |
| Collect coverage that all possible errors was enabled |
| ''' |
| } |
| { |
| name: error_status_cg |
| desc: ''' |
| Collect coverage that all possible errors was seen |
| ''' |
| } |
| { |
| name: event_en_cg |
| desc: ''' |
| Collect coverage that all events was enabled and seen |
| ''' |
| } |
| { |
| name: interrupt_cg |
| desc: ''' |
| - check that we see all scenarios that can cause an interrupt and that the interrupts is fired. |
| - also check we can clear the interrupt |
| ''' |
| } |
| { |
| name: different_ch_settings_cg |
| desc: ''' |
| - Check that multiple end points was running at different speeds concurrently. |
| - Collect coverage that multiple SPI endpoints was run with different config opts |
| ''' |
| } |
| { |
| name: stall_cg |
| desc: ''' |
| - Check that the DUT stalls if a command is configured to transmit data but the tx fifo is empty |
| - check that the data is transmitted when written to the TX fifo after a stall |
| ''' |
| } |
| { |
| name: num_segment_cg |
| desc: ''' |
| - Check that the DUT only transmits what is in a command even if more segments are in the TX FIFO |
| ''' |
| } |
| { |
| name: segment_speed_cg |
| desc: ''' |
| - Check that we test with transactions that uses different speeds |
| i.e first segment in standard mode, followed by segments in dual or quad mode |
| ''' |
| } |
| { |
| name: passthrough_cg |
| desc: ''' |
| Check that the pass through data is transmitted instead of the data in the tx fifo. |
| |
| - Cover that passthrough is activated when a normal transaction is in progress. |
| - Cover that data on the passthrough interface is ignored while passthroug disabled. |
| |
| ''' |
| } |
| ] |
| } |