| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 | { | 
 |   name: "chip" | 
 |  | 
 |   // TODO: remove the common testplans if not applicable | 
 |   import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson", | 
 |                      // TODO #5484, comment these 2 lines out because spi host memory is dummy | 
 |                      // "hw/dv/tools/dvsim/testplans/mem_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", | 
 |                      "hw/ip/tlul/data/tlul_testplan.hjson", | 
 |                      "sw/device/silicon_creator/rom/data/rom_testplan.hjson", | 
 |                      "hw/top_earlgrey/data/chip_conn_testplan.hjson"] | 
 |  | 
 |   testpoints: [ | 
 |     /////////////////////////////////////////////////////////////////////////// | 
 |     // IO Peripherals                                                        // | 
 |     // UART, GPIO, I2C, SPIDEV, SPIHOST, USB, PINMUX & PADCTRL, PATTGEN, PWM // | 
 |     /////////////////////////////////////////////////////////////////////////// | 
 |  | 
 |     // UART (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_uart_tx_rx | 
 |       desc: '''Verify transmission of data over the TX and RX port. | 
 |  | 
 |             SW test sends a known payload over the TX port. The testbench, at the same time | 
 |             sends a known payload over RX. On reception, both payloads are checked for integrity. | 
 |             SW validates the reception of TX watermark, RX watermark, and the TX empty interrupts. | 
 |             Choosing the max supported baud rate for the UART is sufficient. | 
 |  | 
 |             Verify each UART instance at the chip level independently. Verify there is no aliasing | 
 |             on all UART ports across the instances. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_uart_tx_rx"] | 
 |       tags: ["gls"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_uart_rx_overflow | 
 |       desc: '''Verify the RX overflow interrupt. | 
 |  | 
 |             The testbench sends a random payload of size greater than the RX fifo size (32). The SW | 
 |             ignores the received the data to allow the RX overflow interrupt to assert. | 
 |  | 
 |             Verify each UART instance at the chip level independently. Verify there is no aliasing | 
 |             on all UART ports across the instances. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_uart_tx_rx", "chip_sw_uart_tx_rx_idx1", "chip_sw_uart_tx_rx_idx2", | 
 |               "chip_sw_uart_tx_rx_idx3"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_uart_rand_baudrate | 
 |       desc: '''Verify UART transmission of data at various speeds. | 
 |  | 
 |             Randomly pick one of the UART instances and configure it to run with any of these baud | 
 |             rates - 9600bps, 115200bps, 230400bps, 128Kbps, 256Kbps, 1Mkbps, 1.5Mkbps. | 
 |  | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_uart_rand_baudrate"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_uart_tx_rx_alt_clk_freq | 
 |       desc: '''Verify the transmission of UART via using external clock as uart core clock. | 
 |  | 
 |             Extend from chip_sw_uart_rand_baudrate with following added settings. | 
 |             - Configure LC to RMA state, so that it allows clkmgr to use external clock. | 
 |             - Configure clkmgr to select external clock. | 
 |             - Randomize `HI_SPEED_SEL`, so that uart core clock frequency can be either | 
 |               ext_clk_freq / 4 or ext_clk_freq / 2. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_uart_tx_rx_alt_clk_freq", "chip_sw_uart_tx_rx_alt_clk_freq_low_speed"] | 
 |     } | 
 |  | 
 |     // GPIO (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_gpio_out | 
 |       desc: '''Verify GPIO outputs. | 
 |  | 
 |             SW test configures the GPIOs to be in the output mode. The test walks a 1 through the | 
 |             pins. The testbench checks the value for correctness and verifies that there is no | 
 |             aliasing between the pins. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_gpio"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_gpio_in | 
 |       desc: '''Verify GPIO inputs. | 
 |  | 
 |             The SW test configures the GPIOs to be in input mode. The testbench walks a 1 through | 
 |             the pins. SW test ensures that the GPIO values read from the CSR is correct. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_gpio"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_gpio_irq | 
 |       desc: '''Verify GPIO interrupts. | 
 |  | 
 |             The SW test configures the GPIOs to be in input mode and enables all of them to generate | 
 |             an interrupt. The testbench walks a 1 through the pins. SW test ensures that the | 
 |             interrupt corresponding to the right pin is seen. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_gpio"] | 
 |     } | 
 |  | 
 |     // SPI_DEVICE (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_spi_device_tx_rx | 
 |       desc: '''Verify the transmission of data on the chip's SPI device port in firmware mode with | 
 |                single mode. | 
 |  | 
 |             - The testbench sends a known payload over the chip's SPI device input port. | 
 |             - The SW test, at the same time sends a known payload out over the chip's SPI device | 
 |               output port. | 
 |             - On reception, both payloads are checked for integrity. | 
 |             - SW validates the reception of RX fifo full, RX fifo over level, TX fifo under level, | 
 |               RX overflow and TX underflow interrupts. | 
 |             - Run with min (6MHz), typical (30-48Mhz) and max(48MHz) SPI clk frequencies. | 
 |               should use | 
 |             - Also, ensure that the spi_device does not receive transactions when the csb is high. | 
 |             - TODO, consider to test this mode with a real use case. The actual use case of this | 
 |               mdoe is not clear right now. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_spi_device_tx_rx"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_spi_device_flash_mode | 
 |       desc: '''Verify the SPI device in flash mode. | 
 |  | 
 |             - SW puts the SPI device in flash mode | 
 |             - Load a firmware image (bootstrap) through flash commands to the spi_device memory. | 
 |             - SW verifies the integrity of the image upon reception by reading the spi_device | 
 |               memory. | 
 |             - Ensure the image is executed correctly | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_spi_device_pass_through | 
 |       desc: '''Verify the pass through mode from an end-to-end perspective. | 
 |  | 
 |             - Configure the SPI device and host in pass through mode. | 
 |             - Configure and enable both spi_host0 and spi_host1 | 
 |             - Send a random flash commands over the SPI device interface (chip IOs) from the | 
 |               testbench. | 
 |             - Verify the flash commands which pass through spi_host0, are received on chip IOs. | 
 |             - Verify spi_host1 doesn't send out any data from spi_device | 
 |             - Run with min (6MHz), typical (30-48Mhz) and max(48MHz) SPI clk frequencies. | 
 |             - Run with single, dual and quad SPI modes. | 
 |             - Testbench should test the following commands: | 
 |               - Read Normal, Fast Read, Fast Dual, Fast Quad, Chip Erase, Program | 
 |  | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_spi_device_pass_through_filter | 
 |       desc: '''Verify the command filtering mechanism in passthrough mode. | 
 |  | 
 |             - Extend the chip_spi_device_pass_through test. | 
 |             - Program the cmd_filter_* CSRs to filter out certain commands. a one byte command (such | 
 |               as Chip Erase) and a multi-bytes command (such as Program or Sector/Block Erase) must | 
 |               be added to filter | 
 |             - Verify that only the payloads that are not filtered show up on the SPI host interface | 
 |               at chip IOs. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     { | 
 |       name: chip_sw_spi_device_pass_through_flash_model | 
 |       desc: '''Verify the command filtering mechanism in passthrough mode. | 
 |  | 
 |             - Extend the chip_spi_device_pass_through and chip_spi_device_pass_through_filter | 
 |               tests. | 
 |             - Connect with a real flash model on spi_host | 
 |             - Verify that the flash commands are received and interpreted correctly in the flash | 
 |               model | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     { | 
 |       name: chip_sw_spi_device_pass_through_collision | 
 |       desc: '''Verify the collisions on driving spi_host is handled properly | 
 |  | 
 |             - Enable upload related interrupts and configure the spi_device in passthrough mode. | 
 |             - Configure a command slot to enable upload for a flash program/erase command. | 
 |             - Excecute two parallel threads: | 
 |               1. SPI host agent. | 
 |                 - Send this command via an upstream SPI host agent, then the agent keeps sending | 
 |                 read_status to poll the busy bit. | 
 |                 - When the busy bit is low, issue a read command to read data from the downstream | 
 |                   SPI port, and check data correctness. | 
 |               2. A SW process. | 
 |                 - SW receives an upload interrupt and reads the command in the upload fifo to check. | 
 |                 - SW configures the SPI host that shows the same downstream port, to send the | 
 |                   uploaded command to the downstream SPI port. | 
 |                 - SW clears busy bit to allow the upstream SPI host to proceed to the next command. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // SPI_HOST (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_spi_host_tx_rx | 
 |       desc: '''Verify the transmission of data on the chip's SPI host port. | 
 |  | 
 |             - Program the SPI host to send a known payload out of the chip on the SPI host ports. | 
 |             - At the same time, the testbench transfers a known payload from device to host on the | 
 |               SPI host interface. | 
 |             - The SPI device monitor in the testbench grabs the host payload and verifies its | 
 |               integrity. | 
 |             - The SW verifies the device payload for integrity and services the SPI event interrupt. | 
 |             - Run with min and max SPI clk frequencies and with single, dual and quad SPI modes. | 
 |  | 
 |             Verify all SPI host instances in the chip. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // I2C (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_i2c_host_tx_rx | 
 |       desc: '''Verify the transmission of data over the chip's I2C host interface. | 
 |  | 
 |             - Program the I2C to be in host mode. | 
 |             - The SW test writes a known payload over the chip's I2C host interface, which is | 
 |               received and verified by the testbench for correctness. | 
 |             - SW validates the reception of FMT watermark and trans complete interrupts. | 
 |             - Verify the virtual / true open drain capability. | 
 |  | 
 |             Verify all instances of I2C in the chip. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_i2c_device_tx_rx | 
 |       desc: '''Verify the transmission of data over the chip's I2C device interface. | 
 |  | 
 |             - Program the I2C to be in device mode. | 
 |             - The testbench writes a known payload over the chip's I2C device interface, which is | 
 |               received and verified by the SW test for correctness. | 
 |             - SW validates the reception of RX watermark and trans complete interrupts. | 
 |             - Verify the virtual / true open drain capability. | 
 |  | 
 |             Verify all instances of I2C in the chip. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // USB (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_usb_fs_tx_rx | 
 |       desc: '''Verify the transmission of single-ended data over the USB at full speed. As a part of | 
 |             this test, the enablement of USB pullup is also expected to be verified. | 
 |  | 
 |             - Set `tx_differential_mode` to single-ended and `rx_differential_mode` to | 
 |               differential. The other modes are not supported in OpenTitan. | 
 |             - configure Link state to `Active`. | 
 |             - Send and receive packets to fill the entire buffer. Ensure all the packets are | 
 |               correct. | 
 |             - Check interrupts (connected, pkt_received, pkt_sent, av_empty, rx_full) are triggered | 
 |               correcly. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_usb_vbus | 
 |       desc: '''Verify that the USB device can detect the presence of VBUS from the USB host. | 
 |  | 
 |             - This test extends from `chip_usb_fs_df_tx_rx`, add below at the end of the sequence. | 
 |             - VBUS is controlled by SW, through programming CSRs (`override_pwr_sense_en` and | 
 |               `override_pwr_sense_val`) to connect / disconnect the USB. | 
 |             - Disconnect the USB to trigger `disconnected` interrupt. | 
 |             - Then reconnect it and check the `connected` interrupt. | 
 |             - Re-enable data transfer and ensure data correctness. | 
 |             - Observe valid reference pulse usb_ref_val/pulse_o. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_usb_suspend | 
 |       desc: '''Verify that the USB device can detect the presence of VBUS from the USB host. | 
 |  | 
 |             - This test extends from `chip_usb_fs_df_tx_rx`, add below at the end of the sequence. | 
 |             - Configure USB device to enter `Suspend` state and ensure `link_suspend` interrupt is | 
 |               triggered. | 
 |             - Test these 2 power modes. | 
 |               - Normal sleep: | 
 |                 - Configure pwrmgr to enter normal sleep mode, then clocks are disable while powers | 
 |                   are kept on. | 
 |                 - Resume the device through pinmux and check the `link_resume` interrupt. | 
 |                 - Ensure that previously enumerated information is kept. | 
 |               - Deep sleep: | 
 |                 - Before entering deep sleep, store previously enumerated information in retention | 
 |                   RAM. (optional) | 
 |                 - Configure pwrmgr to enter deep sleep mode, and powers are turned off. | 
 |                 - Resume the device through pinmux and check the `link_resume` interrupt. | 
 |                 - Ensure that previously enumerated information and configuration (non-default | 
 |                   values) are wiped, as USB has been reset before wakeup. | 
 |                 - Restore previously enumerated information (if it's stored) or re-enumerate the | 
 |                   USB. | 
 |             - Re-enable data transfer and ensure data correctness. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_usb_sof | 
 |       desc: '''Verify that USB can detect SOF and respond with `usb_ref_pulse_o` and | 
 |             `usb_ref_val_o`. | 
 |  | 
 |             - Configure to enable `usb_ref_disable`. | 
 |             - Send a frame with the same frame number as the USB device to trigger `frame` | 
 |               interrupt. | 
 |             - Ensure `usb_ref_pulse_o` and `usb_ref_val_o` behave correctly. | 
 |             - Stop sending any frame and check the `host_lost` interrupt. Ensure `use_ref_*` behave | 
 |               correctly. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_usb_wake_debug | 
 |       desc: '''Verify that `usb_state_debug_i` can be read from the CSR | 
 |  | 
 |             - Drive random value on `usb_state_debug_i`. | 
 |             - Ensure the CSR `wake_debug` returns correctly value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_usb_enumeration | 
 |       desc: '''Verify USB enumeration. Details are not clear. | 
 |  | 
 |             - TODO | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // PINMUX (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_pin_mux | 
 |       desc: '''Verify the MIO muxing at input and output sides. | 
 |  | 
 |             SW programs MIO INSEL and OUTSEL CSRs to connect and verify each muxed source. At the | 
 |             moment, GPIOs are the only mux inputs. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sleep_pin_mio_dio_val | 
 |       desc: '''Verify the MIO output values in deep sleep state. | 
 |  | 
 |             SW programs the MIO OUTSEL CSRs to to ensure that in deep sleep it randomly picks | 
 |             between tie-0, tie-1 or hi-Z for all muxed outputs coming from non-AON IPs. If an AON | 
 |             peripheral output is muxed, then that peripheral's output is selected to ensure in deep | 
 |             sleep the peripheral can continue its signaling even in deep sleep. The testbench | 
 |             verifies the correctness of the reflected values once the chip goes into deep sleep. | 
 |             This is replicated for DIO pins as well. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sleep_pin_wake | 
 |       desc: '''Verify pin wake up from deep sleep state. | 
 |  | 
 |             Verify one of the 8 possible MIO or DIO pad inputs (randomly configured) can cause the | 
 |             chip to wake up from sleep state. Verifying wake on posedge is sufficient for the chip | 
 |             level integration testing. Upon wake up, SW reads the wake cause CSR to verify | 
 |             correctness. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sleep_pin_retention | 
 |       desc: '''Verify the retention logic in pinmux that is activated during deep sleep. | 
 |  | 
 |             - Pick a pin (such as GPIO0) and enable it in output mode. Set a known value to it (0 or | 
 |               1) and verify the correctless of the value on the chip IO.. | 
 |             - Program the pin's retention value during deep sleep to be opposite of the active power | 
 |               value programmed in the previous step. | 
 |             - Reuse an existing deep sleep / low power wake up test, such as | 
 |               `chip_sw_sleep_pin_wake` test to enter low power. | 
 |             - Once the chip enters the deep sleep state, verify that this pin holds the correct | 
 |               retention value throughout the low power state. | 
 |             - Wake up the chip from sleep using the chosen method. | 
 |             - Verify the pin value at the chip IOs is no longer holding the retention value once the | 
 |               chip is back in active power. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_tap_strap_sampling | 
 |       desc: '''Verify tap accesses in different LC states. | 
 |  | 
 |             Verify pinmux can select the life_cycle, RISC-V, and DFT taps after reset. | 
 |             Verify that in TEST_UNLOCKED* and RMA states, pinmux can switch between the three TAPs | 
 |             without issuing reset. | 
 |             Verify in PROD state, only the LC tap can be selected. | 
 |             Verify in DEV state, only the LC tap and RISC-V taps can be selected. | 
 |             Verify DFT test mode straps are sampled and output to AST via | 
 |             top_earlgrey.dft_strap_test_o in TEST_UNLOCKED* and RMA states. | 
 |             Verify top_earlgrey.dft_strap_test_o is always 0 in the states other than TEST_UNLOCKED* | 
 |             and RMA, regardless of the value on DFT SW straps. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_tap_straps_dev", "chip_tap_straps_prod", "chip_tap_straps_rma"] | 
 |     } | 
 |  | 
 |     // PADCTRL tests: | 
 |     { | 
 |       name: chip_sw_padctrl_attributes | 
 |       desc: '''Verify pad attribute settings for all MIO and DIO pads. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // PATTGEN (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_pattgen_ios | 
 |       desc: '''Verify pattern generation to chip output pads. | 
 |  | 
 |             - Program the pattgen to generate a known pattern in each lane. | 
 |             - Program the pinmux to route the chosen output to the chip IOs. | 
 |             - Verify that the correct pattern is seen on the IOs by hooking up the pattgen monitor. | 
 |             - Validate the reception of the done interrupt. | 
 |             - Verify both pattgen channels independently. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // PWM (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_sleep_pwm_pulses | 
 |       desc: '''Verify PWM signaling to chip output pads during deep sleep. | 
 |  | 
 |             - Program each PWM output to pulse in a known pattern. | 
 |             - Program the pinmux to route the chosen PWM output to the chip IOs. | 
 |             - Program the pwrmgr to go to deep sleep state, with AON timer wakeup. | 
 |             - Initiate the sleep state by issuing a WFI. | 
 |             - Verify that in the sleep state, the PWM signals are active and pulsing correctly, by | 
 |               hooking up the PWM monitor. | 
 |             - Repeat the steps for all 6 PWM signals. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sleep_pwm_pulses"] | 
 |     } | 
 |  | 
 |     ////////////////////////////////////////////////////////////////////////////////////// | 
 |     // System Peripherals                                                               // | 
 |     // XBAR, RV_DM, RV_TIMER, AON_TIMER, PLIC, CLK/RST/PWR MGR, ALERT_HANDLER, LC_CTRL, // | 
 |     // ADC_CTRL, SYSRST_CTRL                                                            // | 
 |     ////////////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 |     // XBAR (pre-verified IP) tests: | 
 |     { | 
 |       name: chip_sw_data_integrity | 
 |       desc: ''' | 
 |             Verify the alert signaling mechanism due to data integrity violation. | 
 |  | 
 |             An automated SW test which performs the following for each IP: | 
 |             - Pick a CSR to write. | 
 |             - Corrupt a random control / data / integrity bit at the CPU source using SV force. | 
 |             - Verify that the device detects the integrity violation causing an alert. | 
 |             - Verify the alert upto the NMI stage. | 
 |             - Now pick a CSR to read. | 
 |             - Corrupt a random control / data / integrity bit at the device using SV force. | 
 |             - Verify that the CPU detects the integrity violation causing an alert. | 
 |             - Verify the alert upto the NMI stage. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // RV_DM (JTAG) tests: | 
 |     { | 
 |       name: chip_jtag_csr_rw | 
 |       desc: ''' | 
 |             Verify accessibility of all the CSRs in the chip over JTAG. | 
 |  | 
 |             - Shuffle the list of CSRs first to remove the effect of ordering. | 
 |             - Write all CSRs via JTAG interface with a random value. | 
 |             - Shuffle the list of CSRs yet again. | 
 |             - Read all CSRs back and check their values for correctness while adhering to the CSR's | 
 |               access policies. | 
 |             - Accesses to CSRs external to `rv_dm` go through RV_DM SBA interface into the `xbar`. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_jtag_csr_rw"] | 
 |     } | 
 |     { | 
 |       name: chip_jtag_mem_access | 
 |       desc: ''' | 
 |             Verify accessibility of all the memories in the chip over JTAG. | 
 |  | 
 |             This test will target the following memories in the chip: | 
 |               sram_main, sram_ret, otbn i|dmem, ROM | 
 |  | 
 |             - Shuffle the list of memories first to remove the effect of ordering. | 
 |             - Write a location in a randomly chosen set of addresses within each memory via JTAG | 
 |               interface with random values. | 
 |             - For read-only memories, preload the memory with random data via backdoor. | 
 |             - Shuffle the list of memories again. | 
 |             - Read the previously written addresses in the memories back again and check the read | 
 |               value for correctness. Pick some random addresses to verify in case of read-only | 
 |               memories. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_jtag_mem_access"] | 
 |     } | 
 |     { | 
 |       name: chip_rv_dm_cpu_debug_mem_not_accessable | 
 |       desc: '''Verify that the debug mem can't be accessed from the CPU while not in the debug mode. | 
 |  | 
 |             TODO, add stimulus and checks | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_rv_dm_perform_debug | 
 |       desc: ''' | 
 |             - X-ref'ed with rom_e2e_jtag_inject from rom testplan | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_rv_dm_ndm_reset_req | 
 |       desc: '''Verify non-debug reset request initiated from RV_DM when the chip is awake. | 
 |  | 
 |             - Program some CSRs / mem that are under life cycle reset tree and system reset tree. | 
 |             - Configure RV_DM to send NDM reset request to reset sytem reset tree. | 
 |             - Read the programmed CSRs / mem to ensure that everything under system reset tree is | 
 |               reset to the original values, while values under life cycle reset will be preserved. | 
 |             - Read CSRs / mem in the debug domain to ensure that the values survive the reset. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_rv_dm_ndm_reset_req"] | 
 |     } | 
 |     // TODO, this could be a block-level test. Put it here since we don't have block-level testplan. | 
 |     { | 
 |       name: chip_rv_dm_ndm_reset_req_when_ibex_halted | 
 |       desc: '''Verify non-debug reset request initiated from RV_DM when ibex is in halted state. | 
 |  | 
 |             - Configure ibex in halted state (dmstatus.anyhalted/dmstatus.allhalted is asserted). | 
 |             - Configure RV_DM to send NDM reset request. | 
 |             - Check that halted state is clear (dmstatus.anyhalted/dmstatus.allhalted should be | 
 |               de-asserted). | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_rv_dm_access_after_wakeup | 
 |       desc: '''Verify RV_DM works after wakes up from sleep. | 
 |  | 
 |             - Put the chip into sleep mode and then wake up. | 
 |             - Access some RV_DM CSRs to ensure that RV_DM doesn't need a full reset to work. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rv_dm_jtag_tap_sel | 
 |       desc: '''Verify ability to select all available TAPs. | 
 |  | 
 |             - Put life cycle on Test or RMA state, so that TAPs can be selected between life cycle | 
 |               RV_DM and DFT. | 
 |             - Verify the TAP is selected correctly. | 
 |             - TODO, X-ref'ed with the LC tests. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rv_dm_lc_disabled | 
 |       desc: '''Verify that the debug capabilities are disabled in certain life cycle stages. | 
 |  | 
 |             - Put life cycle on states other than Test, RMA and DEV. | 
 |             - Verify that the rv_dm bus device is inaccessible from the CPU as well as external | 
 |               JTAG. | 
 |             - Verify that the JTAG TAP is unavailable. | 
 |             - X-ref'ed with `chip_tap_strap_sampling` | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // RV_TIMER (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_timer | 
 |       desc: '''Verify the timeout interrupt assertion. | 
 |  | 
 |             - Configure the RV_TIMER to generate interrupt after a set timeout. | 
 |             - Issue a WFI to wait for the interrupt to trigger. | 
 |             - Service the interrupt when it triggers; verify that it came from rv_timer. | 
 |             - Verify that the interrupt triggered only after the timeout elapsed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rv_timer_irq"] | 
 |     } | 
 |  | 
 |     // AON_TIMER (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_aon_timer_wakeup_irq | 
 |       desc: '''Verify the AON timer wake up interrupt in normal operating state. | 
 |  | 
 |             - Program the PLIC to let the AON timer wake up interrupt the CPU. | 
 |             - Program the AON timer to generate the wake up timeout interrupt after some time. | 
 |             - Issue a WFI to wait for the interrupt to trigger. | 
 |             - Service the interrupt when it triggers; verify that it came from AON timer. | 
 |             - Verify that the interrupt triggered only after the timeout elapsed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_irq"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aon_timer_sleep_wakeup | 
 |       desc: '''Verify that AON timer can wake up the chip from a deep sleep state. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm that the SW is in the POR reset | 
 |               phase. | 
 |             - Program the pwrmgr to go to deep sleep state (clocks off, power off). | 
 |             - Program the AON timer to wake up the chip in a reasonable amount of time. | 
 |             - Have the CPU issue WFI to signal the pwrmgr to go into sleep state. | 
 |             - Verify via assertion checks, the wake up request occurs after the timeout has elapsed. | 
 |             - After reset followed by AON timer wake up, read the reset cause register to confirm | 
 |               the AON timer wake up phase. | 
 |             - After the test sequence is complete, read the wake up threshold register - it should | 
 |               not be reset. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_smoketest"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aon_timer_wdog_bark_irq | 
 |       desc: '''Verify the watchdog bark reception in normal state. | 
 |  | 
 |             - Program the PLIC to let the wdog bark signal interrupt the CPU. | 
 |             - Program the AON timer wdog to 'bark' after some time and enable the bark interrupt. | 
 |             - Service the bark interrupt upon reception. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_irq"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aon_timer_wdog_lc_escalate | 
 |       desc: '''Verify that the LC escalation signal disables the AON timer wdog. | 
 |  | 
 |             - Program the AON timer wdog to 'bark' after some time and enable the bark interrupt. | 
 |             - Start the escalation process and fail the test in the interrupt handler in case the | 
 |               bark interrupt is fired. | 
 |             - Program the alert handler to escalate on alerts upto phase 2 (i.e. reset) but the | 
 |               phase 1 (i.e. wipe secrets) should occur and last during the time the wdog is | 
 |               programed to bark and bite. | 
 |             - Trigger an alert to cause an escalation condition before the bark signal asserts. | 
 |             - After the reset ensure that the reset cause was due to the escalation to prove that | 
 |               the wdog was disabled. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_wdog_lc_escalate"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aon_timer_wdog_bite_reset | 
 |       desc: '''Verify the watchdog bite causing reset in the normal state. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm that the SW is in the POR reset | 
 |               phase. | 
 |             - Program the AON timer wdog to 'bark' after some time. | 
 |             - Let the bark escalate to bite, which should result in a reset request. | 
 |             - After reset, read the reset cause register in rstmgr to confirm that the SW is now in | 
 |               the wdog reset phase. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_wdog_bite_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aon_timer_sleep_wdog_bite_reset | 
 |       desc: '''Verify the watchdog bite causing reset in sleep state. | 
 |  | 
 |             - Repeat the steps in chip_aon_timer_wdog_bite_reset test, but with following changes: | 
 |             - Program the pwrmgr to go to deep sleep state (clocks off, power off). | 
 |             - Issue a WFI after programming the wdog, so that the reset request due to bite occurs | 
 |               during deep sleep state. | 
 |             - After reset, read the reset cause register in rstmgr to confirm that the SW is now in | 
 |               the wdog reset phase. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_wdog_bite_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aon_timer_sleep_wdog_sleep_pause | 
 |       desc: '''Verify that the wdog can be paused in sleep state. | 
 |  | 
 |             - Repeat the steps in chip_aon_timer_sleep_wakeup test, but with following changes: | 
 |             - Program the wdog to 'bite' a little sooner than the AON timer wake up. | 
 |             - Also, program the wdog to pause during sleep. | 
 |             - Issue a WFI after programming the wdog, so that the reset request occurs during deep | 
 |               sleep state. | 
 |             - After reset followed by AON timer wake up, read the reset cause register to confirm | 
 |               that the AON timer woke up the chip, not the wdog reset. | 
 |             - Un-pause the wdog and service the bark interrupt. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_sleep_wdog_sleep_pause"] | 
 |     } | 
 |  | 
 |     // PLIC (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_plic_all_irqs | 
 |       desc: '''Verify all interrupts from all peripherals aggregated at the PLIC. | 
 |  | 
 |             The automated SW test enables all interrupts at the PLIC to interrupt the core. It uses | 
 |             the `intr_test` CSR in each peripheral to mock assert an interrupt, looping through all | 
 |             available interrupts in that peripheral. The ISR verifies that the right interrupt | 
 |             occurred. This is used as a catch-all interrupt test for all peripheral integration | 
 |             testing within which functionally asserting an interrupt is hard to achieve or not of | 
 |             high value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_plic_all_irqs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_plic_sw_irq | 
 |       desc: '''Verify the SW interrupt to the CPU. | 
 |  | 
 |             Enable all peripheral interrupts at PLIC. Enable all types of interrupt at the CPU core. | 
 |             Write to the MSIP CSR to generate a SW interrupt to the CPU. Verify that the only | 
 |             interrupt that is seen is the SW interrupt. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_plic_sw_irq"] | 
 |     } | 
 |  | 
 |     // CLKMGR tests: | 
 |     { | 
 |       name: chip_sw_clkmgr_idle_trans | 
 |       desc: '''Verify the ability to turn off the transactional clock via SW. | 
 |  | 
 |             Ensure that the clock to transactional units will be turned off after any activity | 
 |             completes in the transactional IP.  Verify it is off via spinwait in hints_status CSR. | 
 |             Verify that turning off this clock does not affect the other derived clocks. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_idle", | 
 |               "chip_sw_hmac_enc_idle", | 
 |               "chip_sw_kmac_idle", | 
 |               "chip_sw_otbn_randomness"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_off_trans | 
 |       desc: '''Verify the turned off transactional units. | 
 |  | 
 |             Verify CSR accesses do not complete in units that are off.  Using the watchdog timers, | 
 |             turn off a transactional unit's clock, issue a CSR access to that unit, verify a watchdog | 
 |             event results, and verify the rstmgr crash dump info records the CSR address. | 
 |  | 
 |             A stretch goal is to check the PC corresponds to the code performing | 
 |             the CSR access (stretch since it could be difficult to maintain this | 
 |             check). | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_off_aes_trans", | 
 |               "chip_sw_clkmgr_off_hmac_trans", | 
 |               "chip_sw_clkmgr_off_kmac_trans", | 
 |               "chip_sw_clkmgr_off_otbn_trans"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_off_peri | 
 |       desc: '''Verify the ability to turn off the peripheral clock via SW. | 
 |  | 
 |             Verify CSR accesses do not complete in peripherals that are off.  Using the watchdog | 
 |             timers, turn off a peripheral's clock, issue a CSR access to that peripheral, verify a | 
 |             watchdog event results, and verify the rstmgr crash dump info records the CSR address. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_off_peri"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_div | 
 |       desc: '''Verify clk division logic is working correctly. | 
 |  | 
 |             The IP level checks the divided clocks via SVA, and these are also bound at chip level. | 
 |             Connectivity tests check peripherals are connected to the clock they expect. | 
 |             Use the clkmgr count measurement feature to verify clock division. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_external_clk_src_for_sw_fast", | 
 |               "chip_sw_clkmgr_external_clk_src_for_sw_slow", | 
 |               "chip_sw_clkmgr_external_clk_src_for_lc"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_external_clk_src_for_lc | 
 |       desc: '''Verify the clkmgr requests ext clk src during certain LC states. | 
 |  | 
 |             On POR lc asserts lc_clk_byp_req on some LC states, and de-asserts | 
 |             it when lc_program completes. This also triggers divided clocks to step down. It may be | 
 |             best to verify this via SVA, unless we implement clock cycle counters. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_external_clk_src_for_lc"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_external_clk_src_for_sw | 
 |       desc: '''Verify SW causes the clkmgr requests ext clk src during certain LC states. | 
 |  | 
 |             In RMA and TEST_UNLOCKED lc states the external clock is enabled in response to | 
 |             `extclk_ctrl.sel` CSR writes. In addition `extclk_ctrl.hi_speed_sel` CSR causes the | 
 |             divided clocks to step down. Verify this via SVA bound to clkmgr, and clock cycle | 
 |             counters. | 
 |             X-ref with chip_sw_uart_tx_rx_alt_clk_freq, which needs to deal with this as well. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_external_clk_src_for_sw_fast", | 
 |               "chip_sw_clkmgr_external_clk_src_for_sw_slow"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_jitter | 
 |       desc: '''Verify the clock jitter functionality. | 
 |  | 
 |             Enable clock jitter setting the clkmgr `jitter_enable` CSR high. This causes the | 
 |             jitter_o clkmgr output to toggle. Verify this output is connected to AST's | 
 |             clk_src_sys_jen_i input using formal. | 
 |  | 
 |             X-ref with various specific jitter enable tests. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_jitter", | 
 |               "chip_sw_flash_ctrl_ops_jitter_en", | 
 |               "chip_sw_flash_ctrl_access_jitter_en", | 
 |               "chip_sw_otbn_ecdsa_op_irq_jitter_en", | 
 |               "chip_sw_aes_enc_jitter_en", | 
 |               "chip_sw_hmac_enc_jitter_en", | 
 |               "chip_sw_keymgr_key_derivation_jitter_en", | 
 |               "chip_sw_kmac_mode_kmac_jitter_en", | 
 |               "chip_sw_sram_ctrl_main_scrambled_access_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_deep_sleep_frequency | 
 |       desc: '''Verify the frequency measurement through deep sleep. | 
 |  | 
 |             Enable clock cycle counts. Put the chip in deep sleep. Upon wakeup reset the | 
 |             clock measurements should be off, but the recoverable fault status should not | 
 |             be cleared. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_ast_clk_outputs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_sleep_frequency | 
 |       desc: '''Verify the frequency measurement through shallow sleep. | 
 |  | 
 |             Enable clock cycle counts. Put the chip in shallow sleep with pwrmgr's CONTROL CSR | 
 |             keeping some clocks disabled. Upon wakeup the clock measurements should be on, and the | 
 |             recoverable fault status should show no errors for the disabled clocks. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_sleep_frequency"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_reset_frequency | 
 |       desc: '''Verify the frequency measurement through reset. | 
 |  | 
 |             Enable clock cycle counts, configured to cause errors. Trigger a chip reset via SW. | 
 |             After reset the clock measurements should be off and the recoverable fault status | 
 |             should be cleared. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_reset_frequency"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_clkmgr_escalation_reset | 
 |       desc: '''Verify the clock manager resets to a clean state after an escalation reset. | 
 |  | 
 |             Trigger an internal fatal fault for the regfile onehot checker and let it escalate to | 
 |             reset. Upon alert escalation reset, the internal status should be clear and clkmgr | 
 |             should not attempt to send out more alerts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_clkmgr_escalation_reset", | 
 |               "chip_sw_all_escalation_resets"] | 
 |     } | 
 |  | 
 |     // PWRMGR tests: | 
 |     { | 
 |       name: chip_sw_pwrmgr_external_full_reset | 
 |       desc: '''Verify the cold boot sequence by wiggling of chip's `POR_N`. | 
 |  | 
 |             This ensures that both FSMs are properly reset on the POR signal. The check  is that | 
 |             the processor ends up running. Also verify, the rstmgr recorded POR in `reset_info` CSR | 
 |             by checking retention SRAM for reset_reason. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_full_aon_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_random_sleep_all_wake_ups | 
 |       desc: '''Verify that the chip can go into random low power states and be woken up by ALL wake up | 
 |             sources. | 
 |  | 
 |             This verifies ALL wake up sources. This also verifies that the pwrmgr sequencing is | 
 |             working correctly as expected. X-ref'ed with all individual IP tests. For each wakeup | 
 |             source clear and enable `wake_info` CSR, enable the wakeup from that source with the | 
 |             `wakeup_en` CSR, bring the chip to low power, optionally disabling the source's clock, | 
 |             have the source issue a wakeup event and verify `wake_info` indicates the expected | 
 |             wakeup. | 
 |  | 
 |             Each test should perform a minimum of 2 low power transitions to ensure there are no state | 
 |             dependent corner cases with wakeup interactions. | 
 |  | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [""] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_normal_sleep_all_wake_ups | 
 |       desc: '''Verify that the chip can go into normal sleep state and be woken up by ALL wake up | 
 |             sources. | 
 |  | 
 |             This verifies ALL wake up sources. This also verifies that the pwrmgr sequencing is | 
 |             working correctly as expected. X-ref'ed with all individual IP tests. For each wakeup | 
 |             source clear and enable `wake_info` CSR, enable the wakeup from that source with the | 
 |             `wakeup_en` CSR, bring the chip to low power, optionally disabling the source's clock, | 
 |             have the source issue a wakeup event and verify `wake_info` indicates the expected | 
 |             wakeup. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_normal_sleep_all_wake_ups"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_sleep_all_reset_reqs | 
 |       desc: '''Verify that the chip can go into normal sleep state and be reset by ALL reset req | 
 |             sources. | 
 |  | 
 |             This verifies ALL reset sources. This also verifies that the pwrmgr sequencing is | 
 |             working correctly as expected. X-ref'ed with all individual IP tests. For each reset | 
 |             source, enable the source and bring the chip to low power, issue a reset, and verify the | 
 |             rstmgr's `reset_info` indicated the expected reset by checking retention SRAM for | 
 |             reset_reason. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aon_timer_wdog_bite_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_deep_sleep_all_wake_ups | 
 |       desc: '''Verify that the chip can go into deep sleep state and be woken up by ALL wake up | 
 |             sources. | 
 |  | 
 |             This verifies ALL wake up sources. This also verifies that the pwrmgr sequencing is | 
 |             working correctly as expected. X-ref'ed with all individual IP tests. Similar to | 
 |             chip_pwrmgr_sleep_all_wake_ups, except `control.main_pd_n` is set to 0. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_deep_sleep_all_wake_ups"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_deep_sleep_all_reset_reqs | 
 |       desc: '''Verify that the chip can go into deep sleep state and be reset up by ALL reset req | 
 |             sources. | 
 |  | 
 |             This verifies ALL reset sources. | 
 |             - 7 resets are generated randomly with deep sleeps | 
 |             - POR (HW PAD) reset, SW POR, sysrst, wdog timer reset, esc rst, SW req | 
 |             - esc reset is followd by normal mode because it does not work with sleep mode | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_deep_sleep_all_reset_reqs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_normal_sleep_all_reset_reqs | 
 |       desc: '''Verify that the chip can go into normal sleep state and be reset up by ALL reset req | 
 |             sources. | 
 |  | 
 |             This verifies ALL reset sources. | 
 |             - 7 resets are generated randomly with normal sleeps | 
 |             - POR (HW PAD) reset, SW POR, sysrst, wdog timer reset, esc rst, SW req | 
 |             - esc reset is followed by normal mode and cleared by reset because it does not work with sleep mode | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_normal_sleep_all_reset_reqs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_wdog_reset | 
 |       desc: '''Verify that the chip can be reset by watchdog timer reset source. | 
 |  | 
 |             This verifies watchdog timer reset source. This also verifies that the pwrmgr sequencing is | 
 |             working correctly as expected. X-ref'ed with all individual IP tests. Similar to | 
 |             chip_pwrmgr_sleep_all_reset_reqs, except the chip is not put in low power mode. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_wdog_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_aon_power_glitch_reset | 
 |       desc: '''Verify the cold boot sequence through an AON power glitch. | 
 |  | 
 |  | 
 |             Pulsing the AST vcaon_supp_i input causes an AON power glitch which becomes a POR. | 
 |             This ensures that both FSMs are properly reset on the POR signal. The check is that | 
 |             the processor ends up running. Also verify, the rstmgr recorded POR in `reset_info` CSR | 
 |             by checking retention SRAM for reset_reason. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_full_aon_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_main_power_glitch_reset | 
 |       desc: '''Verify the effect of a glitch in main power rail. | 
 |  | 
 |             The vcmain_supp_i AST input is forced to drop once the test is running. This triggers | 
 |             a MainPwr reset request, which is checked by reading retention SRAM's reset_reason to | 
 |             see that the reset_info CSR's POR bit is not set when the test restarts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_main_power_glitch_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_random_sleep_power_glitch_reset | 
 |       desc: '''Verify the effect of a glitch in main power rail in random sleep states. | 
 |  | 
 |             The vcmain_supp_i AST input is forced to drop right after putting the chip in a random | 
 |             sleep state. This triggers a MainPwr reset request, which is checked by reading retention | 
 |             SRAM's reset_reason to show that the reset_info CSR's POR bit is not set when the test | 
 |             restarts. | 
 |  | 
 |             Note: the glitch has to be sent in a very narrow window: | 
 |             - If sent too early the chip won't have started to process deep sleep. | 
 |             - If too late the hardware won't monitor main power okay so the glitch will have no | 
 |               effect, and the test will timeout. | 
 |  | 
 |             Each test should perform a minimum of 2 low power transitions to ensure there are no | 
 |             state dependent corner cases with power glitch handling. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [""] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_deep_sleep_power_glitch_reset | 
 |       desc: '''Verify the effect of a glitch in main power rail in deep sleep. | 
 |  | 
 |             The vcmain_supp_i AST input is forced to drop right after putting the chip in deep | 
 |             sleep. This triggers a MainPwr reset request, which is checked by reading retention | 
 |             SRAM's reset_reason to show that the reset_info CSR's POR bit is not set when the test | 
 |             restarts. | 
 |  | 
 |             Note: the glitch has to be sent in a very narrow window: | 
 |             - If sent too early the chip won't have started to process deep sleep. | 
 |             - If too late the hardware won't monitor main power okay so the glitch will have no | 
 |               effect, and the test will timeout. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_deep_sleep_power_glitch_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_sleep_power_glitch_reset | 
 |       desc: '''Verify the effect of a glitch in main power rail in shallow sleep. | 
 |  | 
 |             The vcmain_supp_i AST input is forced to drop after putting the chip in shallow sleep. | 
 |             This triggers a MainPwr reset request, which is checked by reading the retention SRAM's | 
 |             reset_reason shows that the reset_info CSR's POR bit is not set when the | 
 |             test restarts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_sleep_power_glitch_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_random_sleep_all_reset_reqs | 
 |       desc: '''Verify that this chip can be reset by All available reset sources. | 
 |  | 
 |             - 12 resets are generated randomly with normal/deep sleeps | 
 |             - POR (HW PAD) reset, SW POR, sysrst, wdog timer reset, esc rst, SW req | 
 |             - esc reset is followd by normal mode because it does not work with sleep mode | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_random_sleep_all_reset_reqs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_sysrst_ctrl_reset | 
 |       desc: '''Verify the effect of a sysrst_ctrl output in main power rail. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm that the SW is in the POR reset | 
 |               phase. | 
 |             - After sysrst reset is generated by forcing, read the reset cause register in rstmgr to confirm that the SW is now in | 
 |               the sysrst reset phase. | 
 |             - Generate sysrst by driving input PAD. | 
 |             - After reset, read the reset cause register in rstmgr to confirm that the SW is now in | 
 |               the sysrst reset phase. | 
 |             - Program the AON timer wdog to 'bark' after some time. | 
 |             - Let the bark escalate to bite, which should result in a reset request. | 
 |             - After reset, read the reset cause register in rstmgr to confirm that the SW is now in | 
 |               the wdog reset phase. | 
 |             - Program the AON timer wdog to 'bark' after some time. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_sysrst_ctrl_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_b2b_sleep_reset_req | 
 |       desc: '''Verify that the pwrmgr sequences sleep_req and reset req coming in almost at the same | 
 |             time, one after the other. Use POR_N PAD to trigger reset. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_b2b_sleep_reset_req"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_sleep_disabled | 
 |       desc: '''Verify that the chip does not go to sleep on WFI when low power hint is 0. | 
 |  | 
 |             This calls WFI with low_power_hint disabled and pwrmgr interrupts enabled, | 
 |             and fails if the pwrmgr ISR is called. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_sleep_disabled"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_escalation_reset | 
 |       desc: '''Verify the power manager resets to a clean state after an escalation reset. | 
 |  | 
 |             Trigger an internal fatal fault for the regfile onehot checker and let it escalate to | 
 |             reset. Upon alert escalation reset, the internal status should be clear and pwrmgr | 
 |             should not attempt to send out more alerts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_all_escalation_resets"] | 
 |     } | 
 |  | 
 |     // RSTMGR tests: | 
 |     { | 
 |       name: chip_sw_rstmgr_non_sys_reset_info | 
 |       desc: '''Verify the `reset_info` CSR register for lc or higher resets. | 
 |  | 
 |             Generate the 5 types of reset at `lc` level or higher, and check the retention SRAM's | 
 |             reset_reason to show that `reset_info` CSR is as expected. This and other rstmgr | 
 |             testpoints that require different resets cross-reference the individual IP tests that | 
 |             generate those resets, and this testpoint merely adds reset checks in them. Those IP | 
 |             blocks are `pwrmgr`, `alert_handler`, `aon_timer`, and `sysrst_ctrl`. | 
 |  | 
 |             This should also check the reset's destination IP to make sure some reset side-effect | 
 |             is present. Setting some `intr_enable` CSR bit when the test starts and checking it | 
 |             after reset seems suitable. The `spi_host` IPs receive multiple resets so they will | 
 |             need special consideration. | 
 |             TODO(maturana) Add specific tests once they are developed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_smoketest"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rstmgr_sys_reset_info | 
 |       desc: '''Verify the `reset_info` CSR register for sys reset. | 
 |  | 
 |             Generate reset triggered by `rv_dm`, which results in a sys level reset, and check the | 
 |             retention SRAM's reset_reason to show that the `reset_info` CSR is as expected. This | 
 |             testpoint cross-reference the `rv_dm` tests that generate this reset, and this | 
 |             testpoint merely adds reset checks in them. | 
 |  | 
 |             This should also check the reset's destination IP to make sure some reset side-effect | 
 |             is present. Setting some `intr_enable` CSR bit when the test starts and checking it | 
 |             after reset seems suitable. The `spi_host` IPs receive multiple resets so they will | 
 |             need special consideration. | 
 |             TODO(maturana) Add specific tests once they are developed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rstmgr_cpu_info | 
 |       desc: '''Verify the expected values from the `cpu_info` CSR on reset. | 
 |  | 
 |             For some software induced resets we can predict the expected contents of `cpu_info`; | 
 |             reads of writes to unmapped addresses for example. Generate these resets and verify | 
 |             the `cpu_info` register contents when reset is handled. | 
 |             Refer to `chip_*sys_rstmgr_reset_info`. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rstmgr_cpu_info"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rstmgr_sw_req_reset | 
 |       desc: '''Verify software requested device reset. | 
 |  | 
 |             Generate a reset request by directly writing the `reset_req` CSR. | 
 |             The reset created should be identical to those caused by hardware sources. | 
 |             After reset, the retention SRAM's reset_reason should show that the `reset_info` CSR | 
 |             reflects that a software request was the reset cause. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rstmgr_sw_req"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rstmgr_alert_info | 
 |       desc: '''Verify the expected values from the `alert_info` CSR on reset. | 
 |  | 
 |             Various alerts can be created, for example, timeouts, and integrity errors, and at | 
 |             least part of the `alert_info` CSR can be predicted. To cause some of these to | 
 |             cause a reset, mask the relevant processor interrupts. Trigger these resets and | 
 |             verify the `alert_info` register contents when reset is handled. | 
 |             Refer to `chip_*sys_rstmgr_reset_info`. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rstmgr_alert_info"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rstmgr_sw_rst | 
 |       desc: '''Verify `sw_rst_ctrl_n` CSR resets individual peripherals. | 
 |  | 
 |             - Pick a rw type CSR in each peripheral and program arbitrary value | 
 |               that does not cause any adverse side-effects. | 
 |             - Pulse the reset to the peripheral via software. | 
 |             - Read the resister after reset and verify it returns the reset value. | 
 |             - Repeat these steps for each of these software resettable peripherals: | 
 |               `spi_device`, `spi_host0`, `spi_host1`, `usb`, `i2c0`, `i2c1`, `i2c2`. | 
 |  | 
 |             Notice the two `spi_host` IPs receive two different resets, `spi_host*`. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rstmgr_sw_rst"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rstmgr_escalation_reset | 
 |       desc: '''Verify the reset manager resets to a clean state after an escalation reset. | 
 |  | 
 |             Trigger an internal fatal fault for the regfile onehot checker and let it escalate to | 
 |             reset. Upon alert escalation reset, the internal status should be clear and rstmgr | 
 |             should not attempt to send out more alerts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_all_escalation_resets"] | 
 |     } | 
 |  | 
 |     // ALERT_HANDLER (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_alert_handler_alerts | 
 |       desc: '''Verify all alerts coming into the alert_handler. | 
 |  | 
 |             An automated SW test, which does the following (applies to all alerts in all IPs): | 
 |             - Program the alert_test CSR in each block to trigger each alert one by one. | 
 |             - Ensure that all alerts are properly connected to the alert handler and cause the | 
 |               escalation paths to trigger. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_alert_test"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_escalations | 
 |       desc: '''Verify all alert escalation paths. | 
 |  | 
 |             Verify all escalation paths triggered by an alert. | 
 |             - Verify the first escalation results in NMI interrupt serviced by the CPU. | 
 |             - Verify the second results in device being put in scrap state, via the LC JTAG TAP. | 
 |             - Verify the third results in chip reset. | 
 |             - Ensure that all escalation handshakes complete without errors. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_alert_handler_escalation"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_irqs | 
 |       desc: '''Verify all classes of alert handler interrupts to the CPU. | 
 |  | 
 |             X-ref'ed with the automated PLIC test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_plic_all_irqs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_entropy | 
 |       desc: '''Verify the alert handler entropy input to ensure pseudo-random ping timer. | 
 |  | 
 |             - Force `alert_handler_ping_timer` input signal `wait_cyc_mask_i` to `8'h07` to | 
 |               shorten the simulation time. | 
 |             - Verify that the alert_handler can request EDN to provide entropy. | 
 |             - Ensure that the alert ping handshake to all alert sources and escalation receivers | 
 |               complete without errors. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_alert_handler_entropy"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_crashdump | 
 |       desc: '''Verify the alert handler crashdump signal. | 
 |  | 
 |             When the chip resets due to alert escalating to cause the chip to reset, verify the | 
 |             reset cause to verify the alert crashdump. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_ping_timeout | 
 |       desc: '''Verify the alert senders' ping timeout. | 
 |  | 
 |             Set alert_handler's ping timeout cycle to 2 and enable alert_senders. Verify that | 
 |             alert_handler detects the ping timeout and reflects it on the `loc_alert_cause` | 
 |             register. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_alert_handler_ping_timeout"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_lpg_sleep_mode_alerts | 
 |       desc: '''Verify alert_handler can preserve alerts during low_power mode. | 
 |  | 
 |             - Trigger fatal alerts for all IPs but configure alert_handler so it won't trigger | 
 |               reset. | 
 |             - Randomly enter normal or deep sleep mode. | 
 |             - Wait random cycles then wake up from the sleep mode. | 
 |             - After wake up from normal sleep mode, clear all alert cause registers and check that | 
 |               all alerts are still firing after waking up. | 
 |             - Repeat the previous steps for random number of iterations. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_lpg_sleep_mode_pings | 
 |       desc: '''Verify alert_handler's ping mechanism works correctly during sleep and wake up. | 
 |  | 
 |             There are two scenarios to check: | 
 |             - Configure alert_handler's ping timeout register to a reasonble value that won't cause | 
 |               ping timeout in normal cases. | 
 |               Then randomly enter and exit normal or deep sleep modes. | 
 |               Check that no local alerts triggered in alert_handler. | 
 |               This scenario ensures that ping mechanism won't send out spurious failure. | 
 |             - Configure alert_handler's ping timeout register to a small value that will always | 
 |               causes ping timeout. | 
 |               Then randomly enter and exit normal or deep sleep modes. | 
 |               Clear local alert cause register and check that alert ping timeout continue to fire | 
 |               after wake up. | 
 |               This scenario ensures the ping mechanism will continue to send out pings after waking | 
 |               up from sleep modes. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_lpg_clock_off | 
 |       desc: '''Verify alert_handler's works correctly when sender clock is turned off. | 
 |  | 
 |             - Configure clkmgr to randomly turn off one of the IP's clock and check alert_handler | 
 |               won't trigger a ping timeout error on that block. | 
 |             - Trigger fatal alerts in an IP then configure clkmgr to turn off the IP clock. Check | 
 |               the IP's fatal alert resumes after clock is turned back on. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_alert_handler_lpg_reset_toggle | 
 |       desc: '''Verify alert_handler's works correctly when sender reset is toggled. | 
 |  | 
 |             - Configure rstmgr to randomly toggle one IP block's SW reset and check alert_handler | 
 |               won't trigger a ping timeout error on that block. | 
 |            ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |    } | 
 |    { | 
 |       name: chip_sw_alert_handler_reverse_ping_in_deep_sleep | 
 |       desc: '''Verify escalation reverse ping timer disabled in sleep mode. | 
 |  | 
 |             Check that escalation receivers located inside always-on blocks do not auto-escalate | 
 |             due to the reverse ping feature while the system is in deep sleep. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // LC_CTRL (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_lc_ctrl_alert_handler_escalation | 
 |       desc: '''Verify that the escalation signals from the alert handler are connected to LC ctrl. | 
 |  | 
 |             - Trigger an alert to initiate the escalations. | 
 |             - Check that the escalation signals are connected to the LC ctrl: | 
 |               - First escalation has no effect on the LC ctrl.  Read LC_STATE CSR to confirm | 
 |                 this is the case. | 
 |               - Second escalation should cause the `lc_escalation_en` output to be asserted and for | 
 |                 the LC_STATE to transition to scrap state.  Confirm by reading the LC_STATE CSR | 
 |               - Verify that all decoded outputs except for escalate_en are | 
 |                 disabled. X-ref'ed with the respective IP tests that consume these signals. | 
 |  | 
 |             X-ref'ed with chip_lc_ctrl_broadcast test, which verifies the connectivity of the LC | 
 |             decoded outputs to other IPs. | 
 |             X-ref'ed with alert_handler's escalation test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_alert_handler_escalation"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_jtag_access | 
 |       desc: '''Verify enable to access LC ctrl via JTAG. | 
 |  | 
 |             Using the JTAG agent, write and read LC ctrl CSRs, verify the read value for | 
 |             correctness. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_tap_straps_dev", "chip_tap_straps_prod", "chip_tap_straps_rma"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_otp_hw_cfg | 
 |       desc: '''Verify the device_ID and ID_state CSRs | 
 |  | 
 |             - Preload the hw_cfg partition in OTP ctrl with random data. | 
 |             - Read the device ID and the ID state CSRs to verify their correctness. | 
 |             - Reset the chip and repeat the first 2 steps to verify a different set of values. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_otp_hw_cfg"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_init | 
 |       desc: '''Verify the LC ctrl initialization on power up. | 
 |  | 
 |             Verify that the chip powers up correctly on POR. | 
 |             - The pwrmgr initiates a handshake with OTP ctrl and later, with LC ctrl in subsequent | 
 |               FSM states. Ensure that the whole power up sequence does not hang. | 
 |             - Verify with connectivity assertion checks, the handshake signals are connected. | 
 |             - Ensure that no interrupts or alerts are triggered. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_transition"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_transitions | 
 |       desc: '''Verify the LC ctrl can transit from one state to another valid state with the | 
 |             correct tokens. | 
 |  | 
 |             - Preload OTP image with a LC state and required tokens to transfer to next state. | 
 |             - Initiate an LC ctrl state transition via SW if CPU is enabled, or via JTAG interface | 
 |               if CPU is disable. | 
 |             - Ensure that the LC program request is received by the OTP ctrl. | 
 |             - Verify the updated data output from OTP ctrl to LC ctrl is correct. | 
 |             - Ensure that there is no background or otp_init error. | 
 |             - Verify that the LC ctrl has transitioned to the programmed state after a reboot. | 
 |             Re-randomize the lc_transition tokens and repeat the sequence above. | 
 |  | 
 |             X-ref'ed chip_sw_otp_ctrl_program. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_transition"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_kmac_req | 
 |       desc: '''Verify the token requested from KMAC. | 
 |  | 
 |             - For conditional transition, the LC ctrl will send out a token request to KMAC. | 
 |             - Verify that the KMAC returns a hashed token, which should match one of the | 
 |               transition token CSRs. | 
 |  | 
 |             X-ref'ed with chip_kmac_lc_req. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_transition"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_kmac_reset | 
 |       desc: '''Verify the effect of putting the KMAC logic in reset during LC state transition. | 
 |  | 
 |             - For a lc state transition, force a reset to KMAC when KMAC is processing lc | 
 |               transition tokens. | 
 |             - Force another KMAC reset after KMAC is done processing lc trantition tokens. | 
 |             - Verify that kmac reset won't affect LC state transition. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_kmac_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_key_div | 
 |       desc: '''Verify the keymgr div output to keymgr. | 
 |  | 
 |             - Verify in different LC states, LC ctrl outputs the correct `key_div_o` to keymgr. | 
 |             - Verify that the keymgr uses the given `key_div_o` value to compute the keys. | 
 |  | 
 |             X-ref'ed with chip_keymgr_lc_key_div_o. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_ctrl_broadcast | 
 |       desc: '''Verify broadcast signals from lc_ctrl. | 
 |  | 
 |             - Preload the LC partition in the OTP ctrl with the following states: RMA, DEV, | 
 |               TEST_LOCKED[N] & SCRAP (tested in chip_lc_ctrl_escalation). | 
 |             - Verify that the following broadcast signals are having the right effect in the | 
 |               respective IPs that consume them: | 
 |               - lc_dft_en_o: impacts clkmgr, pinmux, OTP ctrl & AST | 
 |               - lc_nvm_debug_en_o: impacts flash ctrl | 
 |               - lc_hw_debug_en_o: impacts pinmux, SRAM ctrl (main and ret) & the debug module | 
 |               - lc_cpu_en_o: impacts the CPU | 
 |               - lc_keymgr_en: impacts keymgr | 
 |               - lc_escalate_en_o: impacts SRAM ctrl, AES & OTP ctrl | 
 |               - lc_clk_byp_req_o: impacts clkmgr (handshake with lc_clk_byp_ack_i) | 
 |               - lc_flash_rma_req_o: impacts flash ctrl (handshake with lc_flash_ram_ack_i) | 
 |               - lc_flash_rma_seed_o: impacts flash ctrl | 
 |               - lc_check_byp_en_o: impacts OTP ctrl | 
 |               - lc_creator_seed_sw_rw_en_o: impacts flash ctrl & OTP ctrl | 
 |               - lc_owner_seed_sw_rw_en_o: impacts flash ctrl | 
 |               - lc_iso_part_sw_rd_en_o: impacts flash ctrl | 
 |               - lc_iso_part_sw_wr_en_o: impacts flash ctrl | 
 |               - lc_seed_hw_rd_en_o: impacts flash ctrl & OTP ctrl | 
 |             - These outputs are enabled per the [life cycle architecture spec]({{< relref "doc/security/specs/device_life_cycle/#architecture" >}}). | 
 |             X-ref'ed with the respective IP tests that consume these signals. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // SYSRST_CTRL (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_inputs | 
 |       desc: '''Verify that the SYSRST ctrl input pin values can be read. | 
 |  | 
 |             - Drive a known value on ac_reset, ec_rst_l, flash_wp_l, pwrb, lid_open and key* pins at | 
 |               the chip inputs. | 
 |             - Read the pin_in_value CSR to check for correctness. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sysrst_ctrl_inputs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_outputs | 
 |       desc: '''Verify that the SYSRST ctrl output pin values can be set. | 
 |  | 
 |             - Drive a known value on ac_reset, ec_rst_l, flash_wp_l, pwrb, lid_open and key* pins | 
 |               at the chip inputs. | 
 |             - Verify that SYSRST ctrl correctly loops them back to the chip outputs. | 
 |             - Write the pin_allowed_ctl register to allow some of the pins to be overridden with | 
 |               either 0 or 1 or both. | 
 |             - Write the pin_out_ctl register to enable the override on some of the pins. | 
 |             - Write the pin_out_value register to set known values on those pins. | 
 |             - Verify that at the chip outputs, pins on which override should be active is | 
 |               reflecting the overridden values. All others should reflect the values driven on chip | 
 |               inputs. | 
 |             - Via assertion checks (or equivalent) verify that the transitions at the inputs | 
 |               immediately reflect at the outputs, if not intercepted / debounced by sysrst_ctrl. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sysrst_ctrl_outputs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_in_irq | 
 |       desc: '''Verify the SYSRST ctrl can detect an input combination to signal an interrupt. | 
 |  | 
 |             - Program a specific combination of transitions on pwrb, key*, ac_present and ec_reset_l | 
 |               pins to trigger an interrupt by writing to key_intr_ctl register. | 
 |             - Program the key_intr_debounce_ctl register to debounce an appropriate time. | 
 |             - Enable the interrupt at SYSRST ctrl as well as at the PLIC. | 
 |             - Glitch the inputs at the chip IOs before stabilizing on the programmed transitions. | 
 |             - SW services the interrupt when triggered, verifies the pin input value and | 
 |               key_intr_status for correctness and clears the interrupt status. | 
 |             - Verify separately, eack key combination sufccessfully generates an interrupt. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_sleep_wakeup | 
 |       desc: '''Verify the SYSRST ctrl can wake up the chip from deep sleep. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm we are in POR reset phase. | 
 |             - Program one of the com_sel_ctl_* CSRs to choose a set of inputs to be detected as | 
 |               a low power wakeup signal for the pwrmgr. | 
 |             - Program the associated detection timer. | 
 |             - Program the detection outcome CSR's (com_out_ctl) interrupt bit to 1. | 
 |             - Program the pwrmgr to put the chip in deep sleep state and wake up on chip wake up | 
 |               event. | 
 |             - Issue a WFI to bring the chip in low power state. | 
 |             - After the chip has entered low power mode, set the SYSRST ctrl inputs at the chip IOs | 
 |               to the programmed combination for the duration of the detection timer. | 
 |             - Read the reset cause register to confirm wake up from low power exit phase. | 
 |             - Read the pwrmgr wake up status register to confirm chip wake up. | 
 |             - Read the pin input value and the combo_intr_status CSRs to verify the correct | 
 |               combination on inputs woke up the chip from sleep. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sysrst_ctrl_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_reset | 
 |       desc: '''Verify the SYSRST ctrl can reset the chip from normal state. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm we are in POR reset phase. | 
 |             - Program one of the com_sel_ctl_* CSRs to choose a set of inputs to be detected as | 
 |               the chip reset signal. | 
 |             - Program the associated detection timer. | 
 |             - Program the detection outcome CSR's (com_out_ctl) chip reset bit to 1. | 
 |             - After some time, set the SYSRST ctrl inputs at the chip IOs to the programmed | 
 |               combination for the duration of the detection timer. | 
 |             - The pwrmgr will power cycle the chip once it receives the chip reset input. | 
 |             - Check that ec_rst_l and flash_wp_l (on pads IOR8 and IOR9) are asserted right after | 
 |               the pwrmgr has power cycled the system. | 
 |             - Read the reset cause register after boot up to confirm peripheral reset phase. | 
 |             - Read the pwrmgr reset status register to confirm chip reset. | 
 |             - Read the com_sel_ctl_* CSR in SYSRST ctrl we programmed earlier - it should have been | 
 |               reset. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sysrst_ctrl_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_sleep_reset | 
 |       desc: '''Verify the SYSRST ctrl can reset the chip from deep sleep. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm we are in POR reset phase. | 
 |             - Program one of the com_sel_ctl_* CSRs to choose a set of inputs to be detected as | 
 |               the chip reset signal. | 
 |             - Program the associated detection timer. | 
 |             - Program the detection outcome CSR's (com_out_ctl) chip reset bit to 1. | 
 |             - Program the pwrmgr to put the chip in deep sleep state and allow it to be reset by the | 
 |               chip reset bit. | 
 |             - Issue a WFI to bring the chip in low power state. | 
 |             - After the chip has entered low power mode, set the SYSRST ctrl inputs at the chip IOs | 
 |               to the programmed combination for the duration of the detection timer. | 
 |             - The pwrmgr will power cycle the chip from the deep sleep state once it receives the | 
 |               chip reset input. | 
 |             - Read the reset cause register after boot up to confirm peripheral reset phase. | 
 |             - Read the pwrmgr reset status register to confirm chip reset. | 
 |             - Read the com_sel_ctl_* CSR in SYSRST ctrl we programmed earlier - it should have been | 
 |               reset. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sysrst_ctrl_reset"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_ec_rst_l | 
 |       desc: '''Verify that the ec_rst_l stays asserted on power-on-reset until SW can control it. | 
 |  | 
 |             - Verify that ec_rst_l stays asserted as the chip is brought out of reset. | 
 |             - Verify that the pin continues to remain low until SW is alive. | 
 |             - Have the SW write to pin_allowed|out_ctrl CSRs to control the ec_rst_l value and | 
 |               verify the value at the chip output. | 
 |             - Optionally, also verify ec_rst_l pulse stretching by setting the ec_rst_ctl register | 
 |               with a suitable pulse width. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_flash_wp_l | 
 |       desc: '''Verify that the flash_wp_l stays asserted on power-on-reset until SW can control it. | 
 |  | 
 |             - Exactly the same as chip_sysrst_ctrl_ec_rst_l, but covers the flash_wp_l pin. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sysrst_ctrl_ulp_z3_wakeup | 
 |       desc: '''Verify the z3_wakeup signaling. | 
 |  | 
 |             - Start off with ac_present = 0, lid_open = 0 and pwrb = 0 at the chip inputs. | 
 |             - Program the ulp_ac|lid|pwrb_debounce_ctl registers to debounce these inputs for an | 
 |               appropriate time. | 
 |             - Enable the ULP wakeup feature by writing to the ulp_ctl register. | 
 |             - Read the ulp_wakeup register and verify that no wakeup event is detected, after some | 
 |               amount of delay. | 
 |             - Glitch the lid_open input at the chip IOs before stabilizing on value 1. | 
 |             - Read the ulp_wakeup register to verify that the wakeup event is detected this time. | 
 |             - Verify that the z3_wakeup output at the chip IOs is reflecting the value of 1. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // ADC_CTRL (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_adc_ctrl_debug_cable_irq | 
 |       desc: '''Verify that the ADC correctly detects the voltage level programmed for each channel. | 
 |  | 
 |             - Program both ADC channels to detect mutually exclusive range of voltages. Setting only | 
 |               one filter CSR is sufficient. | 
 |             - Program the ADC intr ctrl CSR to detect the selected filter on both channels. | 
 |               Enable the debug cable interrupt at ADC ctrl as well as PLIC. | 
 |             - Enable the ADC ctrl to run with defaults in normal mode (depending on simulation | 
 |               runtime). | 
 |             - Verify through assertion checks, the ADC with AST stays powered down periodically in | 
 |               slow scan mode. | 
 |             - After some time, force the ADC output of AST to be a value within the programmed range | 
 |               for each channel. Glitch it out of range for some time before stabilizing to ensure | 
 |               that debouce logic works. | 
 |             - Service the debug cable irq. Read the intr status register to verify that the selected | 
 |               filter caused the interrupt to fire. Read the ADC channel value register to verify the | 
 |               correctness of the detected value that was forced in the AST for each channel. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_adc_ctrl_sleep_debug_cable_wakeup | 
 |       desc: '''Verify that in deep sleep, ADC ctrl can signal the ADC within the AST to power down. | 
 |  | 
 |             - Read the reset cause register in rstmgr to confirm we are in POR reset phase. | 
 |             - Follow the same steps as chip_adc_ctrl_debug_cable_irq, but instead of programming the | 
 |               selected filter to interrupt, program it to wake up the chip from sleep. | 
 |             - Program the pwrmgr to put the chip in deep sleep state and wake up on debug cable | 
 |               detection. | 
 |             - Issue a WFI to bring the chip in low power state. | 
 |             - After some time, force the ADC output of AST to be a value within the programmed | 
 |               filter range. That should cause the pwrmgr to wake up. | 
 |             - Read the reset cause register to confirm wake up from low power exit phase. | 
 |             - Read the pwrmgr wake up status register to confirm wake up was due to debug cable | 
 |               detection. | 
 |             - Read the ADC channel value register to verify the correctness of the detected value | 
 |               that was forced in the AST. | 
 |             - Repeat for both ADC channels. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_adc_ctrl_sleep_debug_cable_wakeup"] | 
 |     } | 
 |  | 
 |     /////////////////////////////////////////////////////// | 
 |     // Security Peripherals                              // | 
 |     // AES, HMAC, KMAC, CSRNG, ENTROPY_SRC, KEYMGR, OTBN // | 
 |     /////////////////////////////////////////////////////// | 
 |  | 
 |     // AES (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_aes_enc | 
 |       desc: '''Verify the AES operation. | 
 |  | 
 |             Write a 32-byte key and a 16-byte plain text to the AES registers and trigger the AES | 
 |             computation to start. Wait for the AES operation to complete by polling the status | 
 |             register. Check the digest registers for correctness against the expected digest value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_enc", | 
 |               "chip_sw_aes_enc_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aes_entropy | 
 |       desc: '''Verify the AES entropy input used by the internal PRNGs. | 
 |  | 
 |             - Write the initial key share, IV and data in CSRs (known combinations). | 
 |             - Configure the entropy_src to generate entropy in LFSR mode. | 
 |             - Write the PRNG_RESEED bit to reseed the internal state of the PRNG. | 
 |             - Poll the status idle bit to ensure reseed operation is complete. | 
 |             - Trigger the AES operation to run and wait for it to complete. | 
 |             - Check the digest against the expected value. | 
 |             - Write the KEY_IV_DATA_IN_CLEAR and DATA_OUT_CLEAR trigger bits to 1 and wait for it to | 
 |               complete by polling the status idle bit. | 
 |             - Read back the data out CSRs - they should all read garbage values. | 
 |             - Assertion check verifies that the IV are also garbage, i.e. different from the originally | 
 |               written values. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_entropy"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aes_idle | 
 |       desc: '''Verify AES idle signaling to clkmgr. | 
 |  | 
 |             - Write the AES clk hint to 0 within clkmgr to indicate AES clk can be gated and | 
 |               verify that the AES clk hint status within clkmgr reads 0 (AES is disabled). | 
 |             - Write the AES clk hint to 1 within clkmgr to indicate AES clk can be enabled. | 
 |             - Initiate an AES operation with a known key, plain text and digest, write AES clk | 
 |               hint to 0 and verify that the AES clk hint status within clkmgr now reads 1 (AES | 
 |               is enabled), before the AES operation is complete. | 
 |             - After the AES operation is complete verify that the AES clk hint status within | 
 |               clkmgr now reads 0 again (AES is disabled). | 
 |             - Write the AES clk hint to 1, read and check the AES output for correctness. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_idle"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_aes_sideload | 
 |       desc: '''Verify the AES sideload mechanism. | 
 |  | 
 |             - Configure the keymgr to generate an aes key. | 
 |             - Configure the AES to use the sideloaded key. | 
 |             - Load the plaintext into the AES. | 
 |             - Trigger the AES encryption and wait for it to complete. | 
 |             - Verify that the ciphertext is different from the plaintext. | 
 |             - Load the ciphertext into the AES. | 
 |             - Trigger the AES decryption and wait for it to complete. | 
 |             - Verify that the output is equal to the plain text. | 
 |             - Clear the key in the keymgr and decrypt the ciphertext again. | 
 |             - Verify that output is not equal to the plain text. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_sideload"] | 
 |     } | 
 |  | 
 |     // HMAC (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_hmac_enc | 
 |       desc: '''Verify HMAC operation. | 
 |  | 
 |             SW test verifies an HMAC operation with a known key, plain text and digest (pick one of | 
 |             the NIST vectors). SW test verifies the digest against the pre-computed value. Verify | 
 |             the HMAC done and FIFO empty interrupts as a part of this test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_hmac_enc", | 
 |               "chip_sw_hmac_enc_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_hmac_idle | 
 |       desc: '''Verify the HMAC clk idle signal to clkmgr. | 
 |  | 
 |             - Write the HMAC clk hint to 0 within clkmgr to indicate HMAC clk can be gated and | 
 |               verify that the HMAC clk hint status within clkmgr reads 0 (HMAC is disabled). | 
 |             - Write the HMAC clk hint to 1 within clkmgr to indicate HMAC clk can be enabled. | 
 |               Verify that the HMAC clk hint status within clkmgr reads 1 (HMAC is enabled). | 
 |             - Initiate an HMAC operation with a known key, plain text and digest. | 
 |               Write HMAC clock hint to 0 and verify the HMAC clk hint status within clkmgr reads 1 | 
 |               (HMAC is enabled), before the HMAC operation is complete. | 
 |             - After the HMAC operation is complete, verify the digest for correctness. | 
 |               Verify that the HMAC clk hint status within clkmgr now reads 0 again (HMAC is disabled). | 
 |             - This process is repeated for two hmac operations needed to verify the resulting hmac | 
 |               digest. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_hmac_enc_idle"] | 
 |     } | 
 |  | 
 |     // KMAC pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_kmac_enc | 
 |       desc: '''Verify the SHA3 operation. | 
 |  | 
 |             SW test verifies SHA3 operation with a known key, plain text and digest (pick one of | 
 |             the NIST vectors). SW validates the reception of kmac done and fifo empty interrupts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_kmac_mode_cshake", "chip_sw_kmac_mode_kmac", | 
 |               "chip_sw_kmac_mode_kmac_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_kmac_app_keymgr | 
 |       desc: '''Verify the keymgr interface to KMAC. | 
 |  | 
 |             - Configure the keymgr to start sending known message data to the KMAC. | 
 |             - Keymgr should transmit a sideloaded key to the KMAC as well. | 
 |             - KMAC should finish hashing successfully (not visible to SW) and return digest to | 
 |               keymgr. | 
 |             - This digest is compared against the known digest value for correctness. | 
 |             - Verify that the keymgr has received valid output from the KMAC. | 
 |  | 
 |             X-ref'ed with keymgr test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_keymgr_key_derivation"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_kmac_app_lc | 
 |       desc: '''Verify the LC interface to KMAC. | 
 |  | 
 |             - Configure the LC_CTRL to start a token hash using KMAC interface. | 
 |             - KMAC should finish hashing successfully (not visible to SW) and return digest to | 
 |             LC_CTRL. | 
 |  | 
 |             X-ref'ed with LC_CTRL test/env. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_transition"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_kmac_app_rom | 
 |       desc: '''Verify the ROM interface to KMAC. | 
 |  | 
 |             - Backdoor initialize ROM memory immediately out of reset. | 
 |             - ROM will send message to the KMAC containing its memory contents, | 
 |             - KMAC will hash and return the digest to the ROM. | 
 |             - ROM will compare received digest against its first 8 logical memory lines for | 
 |             correctness. | 
 |  | 
 |             X-ref'ed with ROM_CTRL test/env. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_kmac_app_rom"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_kmac_entropy | 
 |       desc: '''Verify the EDN interface to KMAC. | 
 |  | 
 |             Requires `EnMasking` parameter to be enabled. | 
 |             SW randomly configures the KMAC in any hashing mode/strength, and enable EDN mode. | 
 |             Randomly enable/disable the `entropy_refresh`. | 
 |             Randomly configure `wait_timer` values (zero for disable, non-zero for timer expire). | 
 |               - Program `wait_timer` to a small value. | 
 |                 Check if EDN timeout error occurs after issuing the hashing op. | 
 |               - Adjust `wait_timer` greater than expected EDN latency (with correct `prescaler` too). | 
 |                 Then check if Digest is correct. | 
 |             KMAC should send EDN request after `entropy_ready` is set. | 
 |             KMAC also should send out another request to EDN when either: | 
 |               - kmac hash counter hits the configured threshold (assuming it is non-zero) | 
 |               - Hash count exceeds the threshold. | 
 |             SW verifies that KMAC produces the correct digest value. | 
 |  | 
 |             TODO: This is pending security review discussion. It is unclear if this feature will be | 
 |             implemented. | 
 |  | 
 |             X-ref'ed with EDN test/env. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_kmac_idle | 
 |       desc: '''Verify the KMAC idle signaling to clkmgr. | 
 |  | 
 |             - Write the KMAC clk hint to 0 within clkmgr to indicate KMAC clk can be gated and | 
 |               verify that the KMAC clk hint status within clkmgr reads 0 (KMAC is disabled). | 
 |             - Write the KMAC clk hint to 1 within clkmgr to indicate KMAC clk can be enabled. | 
 |               Verify that the KMAC clk hint status within clkmgr reads 1 (KMAC is enabled). | 
 |             - Initiate a KMAC operation with a known key, plain text and digest. | 
 |               Write KMAC clock hint to 0 and verify the KMAC clk hint status within clkmgr reads 1 | 
 |               (KMAC is enabled), before the KMAC operation is complete. | 
 |             - After the KMAC operation is complete, verify the digest for correctness. | 
 |               Verify that the KMAC clk hint status within clkmgr now reads 0 again (KMAC is disabled). | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_kmac_idle"] | 
 |     } | 
 |  | 
 |     // ENTROPY_SRC (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_entropy_src_ast_rng_req | 
 |       //TODO(#13460): A dv enginner should add an assertion to check the connectivity for this test. | 
 |       desc: '''Verify the RNG req to ast. | 
 |  | 
 |             - Program the entropy src in normal RNG mode. | 
 |             - Route the entropy data received from RNG to the FIFO. | 
 |             - Verify that the FIFO depth is non-zero via SW - indicating the reception of data over | 
 |               the AST RNG interface. | 
 |             - Verify the correctness of the received data with assertion based connectivity checks. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_entropy_src_ast_rng_req"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_entropy_src_csrng | 
 |       desc: '''Verify the transfer of entropy bits to CSRNG. | 
 |  | 
 |             Verify the entropy valid interrupt. | 
 |             At the CSRNG, validate the reception of entropy req interrupt. | 
 |             Details TBD. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_entropy_src_cs_aes_halt | 
 |       desc: '''Verify the aes halt handshake with CSRNG. | 
 |  | 
 |             Details TBD. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_entropy_src_fuse_en_fw_read | 
 |       desc: '''Verify the fuse input entropy_src. | 
 |  | 
 |             - Initialize the OTP with the fuse that controls whether the SW can read the entropy src enabled. | 
 |             - Read the OTP and verify that the fuse is enabled. | 
 |             - Read the entropy_data_fifo via SW and verify that it reads valid values. | 
 |             - Reset the chip, but this time, initialize the OTP with with the fuse disabled. | 
 |             - Read the OTP and verify that fuse is disabled. | 
 |             - Read the internal state via SW and verify that the entropy valid bit is zero. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_entropy_src_fuse_en_fw_read_test"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_entropy_src_known_answer_tests | 
 |       desc: '''Verify our ability to run known-answer tests in SW. | 
 |  | 
 |             - Configure the device in firmware-bypass mode. | 
 |             - Feed NIST test-defined entropy sequences into the conditioner | 
 |             - Read the entropy_data_fifo via SW; verify that it reads the expected values. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_entropy_src_kat_test"] | 
 |     } | 
 |  | 
 |     // CSRNG tests: | 
 |     { | 
 |       name: chip_sw_csrng_edn_cmd | 
 |       desc: '''Verify incoming command interface from EDN. | 
 |  | 
 |             - Have each EDN instance issue an instantiate command to CSRNG. | 
 |             - When done, verify the reception of cmd req done interrupt. | 
 |             - Check the data returned to EDN via connectivity assertion checks. | 
 |             - TODO: explore the ability to generate predictable data and verify the received value. | 
 |             Details TBD. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_csrng_fuse_en_sw_app_read | 
 |       desc: '''Verify the fuse input to CSRNG. | 
 |  | 
 |             - Initialize the OTP with the fuse that control whether the SW can read the CSRNG state enabled. | 
 |             - Issue an instantiate command to request entropy. | 
 |             - Verify that SW can read the internal state values. | 
 |             - Reset the chip and repeat the steps above, but this time, initialized the OTP with fuse disabled. | 
 |             - Verify that the SW reads back all zeros when reading the internal state values. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_csrng_fuse_en_sw_app_read_test"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_csrng_lc_hw_debug_en | 
 |       desc: '''Verify the effect of LC HW debug enable on CSRNG. | 
 |  | 
 |             lc_hw_debug_en is used to diversify the csrng seed. | 
 |             - Configure entropy_src into bypassing the conditioner and directly inject known entropy. | 
 |             - Instantiate CSRNG with the known entropy while in TEST state (hw_debug_en = 1). | 
 |             - Retrieve entropy from csrng and save it in flash and reset the system. | 
 |             - Run the process again and ensure the exact same result can be reproduced (similar to KAT). | 
 |             - Advance the device to PROD or DEV state. | 
 |             - Again configure entropy_src to bypass the conditioner and use direct injection. | 
 |             - Instantiate CSRNG with the same fixed seed and fetch entropy again while in the NEW state. | 
 |             - The newly fetched entropy and the old entropy stored in flash should not match. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_csrng_known_answer_tests | 
 |       desc: '''Verify our ability to run known-answer tests in SW. | 
 |  | 
 |             - Configure the software instance with the expected seed (as per | 
 |               the NIST-specified test for CTR_DRBG operation). Compare the | 
 |               DRBG internal K and V state against the test vector expected | 
 |               values. | 
 |             - Perform generate operations as required by the test vector. | 
 |             - Compare the results to test expectations. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_csrng_kat_test"] | 
 |     } | 
 |  | 
 |     // EDN (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_edn_entropy_reqs | 
 |       desc: '''Verify the entropy requests from all peripherals. | 
 |  | 
 |             Verify that there are no misconnects between each peripheral requesting entropy. | 
 |             TODO: system level scenario: have all entropy sources request entropy in the same test | 
 |             one after to show boot to post boot load, cycling all entropy blocks off and on again. | 
 |             Ensure there are no deadlocks and everything works as expected. | 
 |             X'ref'ed with each IP test that requsts entropy from EDN. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ['chip_sw_edn_entropy_reqs'] | 
 |     } | 
 |  | 
 |     // KEYMGR (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_keymgr_key_derivation | 
 |       desc: '''Verify the keymgr advances to all states and generate identity / SW output. | 
 |  | 
 |             - In the SW test, write fixed value to OTP for root_key and write creator and owner | 
 |               seeds in flash. And then roboot the chip. | 
 |             - In the SV sequence, backdoor read Device ID and ROM digest through CSRs. | 
 |             - For HardwareRevisionSecret, use the constant values in design. | 
 |             - Configure the keymgr and advance to `CreatorRootKey` and `OwnerIntermediateKey`. | 
 |             - Check keymgr internal keys after advance operations. | 
 |             - Generate identity / SW output for both Attestation CDI and Sealing CDI. | 
 |             - KMAC should finish hashing successfully (not visible to SW) and return digest to | 
 |               keymgr. | 
 |             - Read keymgr CSRs `SW_SHARE*` and verify the return values. | 
 |             - Advance to `Disabled` and verify keymgr enters the state successfully. | 
 |  | 
 |             - For each operation, wait for the interrupt `op_done` to be triggered and check CSR | 
 |               `op_status` is `DONE_SUCCESS`. | 
 |  | 
 |             - Note: there are 3 ways of calculating the expected digest for comparison. Any of them | 
 |               is acceptable. | 
 |               - Use SW to calculate that, and it will also exercise the Ibex. | 
 |               - SW sends all the keys through CSRs to KMAC to generate the degist data. | 
 |               - DV calls C functions to generate and backdoor load to a specific memory location | 
 |                 for SW. (Adpot this approach.) | 
 |  | 
 |             X-ref'ed with kmac test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_keymgr_key_derivation", "chip_sw_keymgr_key_derivation_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_keymgr_sideload_kmac | 
 |       desc: '''Verify the keymgr sideload interface to KMAC, similar to `chip_kmac_app_keymgr`. | 
 |  | 
 |             - Configure the keymgr and advance to `CreatorRootKey`. | 
 |             - Transmit a sideloaded key to the KMAC. | 
 |             - Configure KMAC to use the sideload key to generate digest data. | 
 |             - Verify the digest for correctness. | 
 |             - Advance to 2 other operational states and repeat the above sequences (optional). | 
 |  | 
 |             X-ref'ed with chip_kmac_app_keymgr test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_keymgr_sideload_kmac"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_keymgr_sideload_aes | 
 |       desc: '''Verify the keymgr sideload interface to AES. | 
 |  | 
 |                Same as `chip_keymgr_sideload_kmac`, except, sideload to AES. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_sideload"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_keymgr_sideload_otbn | 
 |       desc: '''Verify the keymgr sideload interface to OTBN. | 
 |  | 
 |                Load OTBN binary image, the rest is similar to `chip_keymgr_sideload_kmac`, except | 
 |                sideloading to otbn. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_keymgr_sideload_otbn"] | 
 |     } | 
 |  | 
 |     // OTBN (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_otbn_op | 
 |       desc: '''Verify an OTBN operation. | 
 |  | 
 |             - SW test directs the OTBN engine to perform an ECDSA operation. | 
 |             - SW validates the reception of the otbn done interrupt once the operation is complete. | 
 |             - SW verifies the correctness of the result with the expected value which is | 
 |               pre-computed using a reference model. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_otbn_ecdsa_op_irq", | 
 |               "chip_sw_otbn_ecdsa_op_irq_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otbn_rnd_entropy | 
 |       desc: '''Verify OTBN can fetch RND numbers from the entropy src. | 
 |  | 
 |             - SW initializes the entropy subsystem to generate randomness. | 
 |             - SW loads an OTBN app that executes instructions to read the RND bits. | 
 |             - The OTBN app ensures that the values when read consequtively do not match, and its not | 
 |               all 0s or all 1s, as a basic measure to ensure that the entropy subsystem is returning | 
 |               some data. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_otbn_randomness"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otbn_urnd_entropy | 
 |       desc: '''Verify OTBN can fetch URND numbers from the entropy src. | 
 |  | 
 |             - Similar to chip_otbn_rnd_entropy, but verifies the URND bits. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests:  ["chip_sw_otbn_randomness"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otbn_idle | 
 |       desc: '''Verify the OTBN idle signal to clkmgr. | 
 |  | 
 |             - Write the OTBN clk hint to 0 within clkmgr to indicate OTBN clk can be gated | 
 |               and verify that the OTBN clk hint status within clkmgr reads 0 (OTBN is disabled). | 
 |             - Write the OTBN clk hint to 1 within clkmgr to indicate OTBN clk can be enabled. | 
 |               Verify that the OTBN clk hint status within clkmgr reads 1 (OTBN is enabled). | 
 |             - Start an OTBN operation, write the OTBN clk hint to 0 within clkmgr and verify that | 
 |               the OTBN clk hint status within clkmgr reads 1 (OTBN is enabled) before the | 
 |               OTBN operation is complete. | 
 |             - After the OTBN operation is complete, verify that the OTBN clk hint status within | 
 |               clkmgr now reads 0 again (OTBN is disabled). | 
 |             - Write the OTBN clk hint to 1, read and check the OTBN output for correctness. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_otbn_randomness"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otbn_mem_scramble | 
 |       desc: '''Verify the OTBN can receive keys from the OTP to scramble the OTBN imem and dmem. | 
 |  | 
 |             - Initialize the entropy_src subsystem to enable OTP_CTRL fetch random data (already | 
 |               done by the test_rom startup code). | 
 |             - Extract random address offsets from RV_CORE_IBEX_RND_DATA. | 
 |             - Wait for OTBN to be idle. | 
 |             - Write random address offsets in OTBN imem and dmem. | 
 |             - Read back the written address offsets and compare against expected values. All values | 
 |               must match, no integrity errors must be triggered. | 
 |             - Have OTBN fetch new keys and nonces from the OTP_CTRL. | 
 |             - Wait for OTBN to be idle. | 
 |             - Read back the written address offsets. Most reads should trigger integrity errors. It | 
 |               is possible that after re-scrambling the integrity bits are still valid. But this is | 
 |               expected to happen rarely. If the number of observed integrity errors is below a | 
 |               chosen threshold, the test fails. | 
 |             - Verify the validity of EDN's output to OTP_CTRL via assertions | 
 |               (unique, non-zero data). | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_otbn_mem_scramble"] | 
 |     } | 
 |  | 
 |     ///////////////////////////////////////////////////// | 
 |     // Memory & Controllers                            // | 
 |     // ROM_CTRL, RAM, FLASH, FLASH_CTRL, OTP, OTP_CTRL // | 
 |     ///////////////////////////////////////////////////// | 
 |  | 
 |     // ROM_CTRL (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_rom_access | 
 |       desc: '''Verify that the CPU can access the rom contents. | 
 |  | 
 |             - Verify that the CPU can fetch instructions from the ROM. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rom_ctrl_integrity_check"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rom_ctrl_integrity_check | 
 |       desc: '''Verify that the ROM ctrl performs the integrity check of the ROM on power up. | 
 |  | 
 |             - In non-PROD LC state, the computed digest does not have to match the top 8 words in | 
 |               the ROM. Verify that we can successfully power up the chip in this case. | 
 |             - In PROD LC state, verify that the pwrmgr does not fully power up if the computed | 
 |               digest does not match the top 8 words of the ROM. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rom_ctrl_integrity_check"] | 
 |     } | 
 |  | 
 |     // SRAM (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_sram_scrambled_access | 
 |       desc: '''Verify scrambled memory accesses to both main and retention SRAMs. | 
 |  | 
 |             - Initialize the entropy_src subsystem to enable OTP_CTRL fetch random data (already | 
 |               done by the test_rom startup code). | 
 |             - Trigger both SRAMs to fetch a new key and nonce from the OTP_CTRL | 
 |             - Drive the CPU to perform random accesses to both RAMs and verify these operations | 
 |               complete successfully by using the backdoor interface | 
 |             - Fetch a new key from the OTP_CTRL and ensure that the previous contents cannot be | 
 |               read anymore. | 
 |             - Verify the validity of EDN's output to OTP_CTRL via assertions | 
 |               (unique, non-zero data). | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sram_ctrl_ret_scrambled_access", | 
 |               "chip_sw_sram_ctrl_main_scrambled_access", | 
 |               "chip_sw_sram_ctrl_main_scrambled_access_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sleep_sram_ret_contents | 
 |       desc: '''Verify that the data within the retention SRAM survives low power entry-exit. | 
 |  | 
 |             Ensure that the data within the retention SRAM survives ALL low power entry-exit | 
 |             variations. | 
 |  | 
 |             TODO: how to deal with the scramble keys on low power exit? | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sleep_sram_ret_contents"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sram_execution | 
 |       desc: '''Verify that CPU can fetch instructions from SRAM if enabled. | 
 |  | 
 |             - Create the following combinations of 8 scenarios: | 
 |               - The fetch enable bit in the HW_CFG partition of OTP controller set and not set. | 
 |               - A life cycle state that enables (TEST_UNLOCKED, DEV or RMA) and disables (PROD) | 
 |                 hardware debug. | 
 |               - The execution CSR programmed to be enabled and disabled. | 
 |  | 
 |             - For both, main and the retention SRAM in each of these 8 scenarios: | 
 |               - Load instruction data into the SRAMs. | 
 |               - If the instruction execution is enabled, verify that the CPU can fetch and execute | 
 |                 the instruction from the SRAM correctly. | 
 |               - If the instruction execution is not enabled, verify that the SRAM throws an error | 
 |                 response via an exception handler. | 
 |  | 
 |             The following table indicates in which of these scenarios should the instruction | 
 |             execution be enabled, for both, main and the retention SRAM instances. | 
 |  | 
 |               | OTP HW_CFG[IFETCH] | HW_DEBUG_EN via LC state | EXEC CSR | MAIN SRAM | RET SRAM | | 
 |               |:------------------:|:------------------------:|:--------:|:---------:|:--------:| | 
 |               |          0         |             0            |     0    |  disabled | disabled | | 
 |               |          0         |             0            |     1    |  disabled | disabled | | 
 |               |          0         |             1            |     0    |  enabled  | disabled | | 
 |               |          0         |             1            |     1    |  enabled  | disabled | | 
 |               |          1         |             0            |     0    |  disabled | disabled | | 
 |               |          1         |             0            |     1    |  enabled  | disabled | | 
 |               |          1         |             1            |     0    |  disabled | disabled | | 
 |               |          1         |             1            |     1    |  enabled  | disabled | | 
 |  | 
 |             For the retention SRAM, instruction fetch is completely disabled via design parameter. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sram_ctrl_execution_main"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sram_lc_escalation | 
 |       desc: '''Verify the LC escalation path to the SRAMs. | 
 |  | 
 |             - Configure the LC_CTRL to trigger an escalation request to the SRAMs. | 
 |             - Verify that the SRAMs stop accepting and responding to new memory requests. | 
 |             - Reset the system to exit the terminal escalation state. | 
 |             - Re-initialize the SRAMs and verify that they can now respond correctly to | 
 |               any further memory requests. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |  | 
 |     // OTP (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_otp_ctrl_init | 
 |       desc: '''Verify the OTP ctrl initialization on chip power up. | 
 |  | 
 |             Verify that the chip powers up correctly on POR. | 
 |             - The pwrmgr initiates a handshake with OTP ctrl and later, with LC ctrl in subsequent | 
 |               FSM states. Ensure that the whole power up sequence does not hang. | 
 |             - Verify with connectivity assertion checks, the handshake signals are connected. | 
 |             - Ensure that no interrupts or alerts are triggered. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_transition"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_keys | 
 |       desc: '''Verify the proliferation of keys to security peripherals. | 
 |  | 
 |             - Verify the correctness of keys provided to SRAM ctrl (main & ret), flash ctrl, keymgr, | 
 |               (note that keymgr does not have handshake), and OTBN. | 
 |  | 
 |             X-ref'ed with the following IP tests that consume these signals: | 
 |             - chip_sw_sram_scrambled_access | 
 |             - chip_sw_flash_scramble | 
 |             - chip_sw_keymgr_key_derivation | 
 |             - chip_sw_otbn_mem_scramble | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sram_ctrl_ret_scrambled_access", "chip_sw_flash_init", | 
 |               "chip_sw_keymgr_key_derivation", "chip_sw_otbn_mem_scramble"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_entropy | 
 |       desc: '''Verify the entropy interface from OTP ctrl to EDN. | 
 |  | 
 |             This is X-ref'ed with the chip_otp_ctrl_keys test, which needs to handshake with the EDN | 
 |             to receive some entropy bits before the keys for SRAM ctrl and OTBN are computed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sram_ctrl_ret_scrambled_access", "chip_sw_flash_init", | 
 |               "chip_sw_keymgr_key_derivation", "chip_sw_otbn_mem_scramble"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_program | 
 |       desc: '''Verify the program request from lc_ctrl. | 
 |  | 
 |             - Verify that upon an LC state transition request, LC ctrl signals the OTP ctrl with a | 
 |               program request. | 
 |             - Verify that the OTP ctrl generates the LC data output correctly and is sent to the LC | 
 |               ctrl before it is reset. | 
 |             - Verify that the `lc_check_byp_en_i` from LC ctrl is set. | 
 |             - Ensure that the whole operation does not raise any interrupts or alerts or errors. | 
 |             - After reset, verify that the LC state transition completed successfully by reading the | 
 |               LC state and LC count CSRs. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_transition"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_program_error | 
 |       desc: '''Verify the otp program error. | 
 |  | 
 |             - Initiate an illegal program request from LC ctrl to OTP ctrl. | 
 |             - Verify that the LC ctrl triggers an alert when the OTP ctrl responds back with a | 
 |               program error. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_program_error"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_hw_cfg | 
 |       desc: '''Verify the correctness of otp_hw_cfg bus in all peripherals that receive it. | 
 |  | 
 |             Preload the OTP ctrl's `hw_cfg` partition with random data and verify that all | 
 |             consumers of the hardware configuration bits are receiving the correct values. | 
 |  | 
 |             Xref'ed with corresponding IP tests that receive these bits. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_ctrl_otp_hw_cfg"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_lc_signals | 
 |       desc: '''Verify the broadcast signals from LC ctrl. | 
 |  | 
 |             - `lc_escalate_en_i`: read the error code CSR and verify that it reflects an FSM error | 
 |               state due to the escalation signal triggering. | 
 |             - `lc_creator_seed_sw_rw_en_i`: verify that the secret2 partition is locked. | 
 |             - `lc_seed_hw_rd_en_i`: verify that the keymgr outputs a default value when enabled. | 
 |             - `lc_dft_en_i`: verify that the test interface within OTP ctrl is accessible. | 
 |             - `lc_check_byp_en_i`: verify that the background check during LC ctrl state | 
 |               programming passes when enabled. | 
 |  | 
 |             X-ref'ed with chip_lc_ctrl_broadcast test, which verifies the connectivity of the LC | 
 |             decoded outputs to other IPs. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_ctrl_ast | 
 |       desc: '''Verify the power sequencing signals to AST, as well as the alert. | 
 |  | 
 |             Details TBD. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_otp_prim_tl_access | 
 |       desc: '''Verify that the SW can read / write the prim tlul interface. | 
 |  | 
 |             - The prim tlul interface is a open source placeholder for the closed source CSRs that | 
 |               will be implemented in a translation 'shim'. | 
 |             - Verify that when `lc_dft_en_i` is On, this region can be read / written to by the SW. | 
 |               When `lc_dft_en_i` is Off, accessing this region will result in a TLUL error. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_prim_tl_access"] | 
 |     } | 
 |  | 
 |     // FLASH (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_flash_init | 
 |       desc: '''Verify that flash initialization routine works correctly. | 
 |  | 
 |             - Initialize the flash ctrl by writing 1 to the INIT register. | 
 |             - Poll the status register for the initialization to complete. | 
 |             - Verify that during the init process, the flash ctrl requested keys from OTP. Verify | 
 |               with different sets of key values programmed in OTP. | 
 |             - Verify the flash ctrl can read seeds when lc_seed_hw_rd_en is set, otherwise all 1s. | 
 |             - Verify that the flash ctrl sent the creator and owner seeds to keymgr. Verify with | 
 |               different seed values. | 
 |  | 
 |             - This test needs to execute as a boot rom image. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_init"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_host_access | 
 |       desc: '''Verify that the flash memory contents can be read by the CPU. | 
 |  | 
 |             Nothing extra to do here - most SW based tests fetch code from flash. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_access", | 
 |               "chip_sw_flash_ctrl_access_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_ctrl_ops | 
 |       desc: '''Verify the SW can initiate flash operations via the controller. | 
 |  | 
 |             Verify that the CPU can read / program and erase the flash mem. Pick an operation on | 
 |             all data and info partitions. Erase both, bank and page. SW validates the reception of | 
 |             prog empty, prog level, rd full, rd level and op done interrupts. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_ops", "chip_sw_flash_ctrl_ops_jitter_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_rma_unlocked | 
 |       desc: '''Verify the flash memory contents can be accessed after in RMA unlock. | 
 |  | 
 |             - Provision an RMA_UNLOCK token in OTP. | 
 |             - Reset the chip. | 
 |             - Enable RMA mode, and verify that the SW can access the flash. Ensure that the previous | 
 |               contents are inaccessible. | 
 |  | 
 |             - RMA entry can be on the C side as well. This should be done over C - The JTAG | 
 |               interface to flash ctrl is actually for the closed src. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_rma_unlocked"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_scramble | 
 |       desc: '''Verify flash scrambling via the controller. | 
 |  | 
 |             - Extends the chip_flash_init test. | 
 |             - Verify flash scrambling with different key values programmed in OTP. | 
 |             - Verify read of scrambled contents via both, controller and direct host read. | 
 |  | 
 |             - Program a new scramble key in OTP and reboot - this time we need to backdoor load the | 
 |               flash with new test image that is re-scrambled with the new key. | 
 |             - Need to understand the bootstrapping requirements. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_init"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_idle_low_power | 
 |       desc: '''Verify flash_idle signaling to pwrmgr. | 
 |  | 
 |             - Initiate flash program or erase over the controller. | 
 |             - Program the pwrmgr to go into deep sleep. | 
 |             - Issue a WFI. | 
 |             - Ensure that the low power entry does not happen due to the ongoing flash operation. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_idle_low_power"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_keymgr_seeds | 
 |       desc: '''Verify the creator and owner seeds are read on flash init provided lc_hw_seed_rd_en | 
 |             is set. | 
 |  | 
 |             X-ref'ed with keymgr test. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_keymgr_key_derivation"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_lc_creator_seed_sw_rw_en | 
 |       desc: '''Verify the lc_creator_seed_sw_rw_en signal from LC ctrl. | 
 |  | 
 |             - Transition from TEST_LOCKED to DEV/PROD to ESCALATION/SCRAP state via OTP and verify | 
 |               that this LC signal transitions from 0 to 1 and back to 0. Verify that the SW | 
 |               accessibility of the corresponding partition depending on the signal value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_lc_rw_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_creator_seed_wipe_on_rma | 
 |       desc: '''Verify that the creator seed is wiped by the flash ctrl on RMA entry. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_rma_unlocked"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_lc_owner_seed_sw_rw_en | 
 |       desc: '''Verify the lc_owner_seed_sw_rw_en signal from LC ctrl. | 
 |  | 
 |             - Transition from TEST_LOCKED to DEV/PROD to ESCALATION/SCRAP state via OTP and verify | 
 |               that this LC signal transitions from 0 to 1 and back to 0. Verify that the SW | 
 |               accessibility of the corresponding partition depending on the signal value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_lc_rw_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_lc_iso_part_sw_rd_en | 
 |       desc: '''Verify the lc_iso_part_sw_rd_en signal from LC ctrl. | 
 |  | 
 |             - Transition from DEV to PROD to ESCALATION/SCRAP state via OTP and verify | 
 |               that this LC signal transitions from 0 to 1 and back to 0. Verify that the SW | 
 |               accessibility of the corresponding partition depending on the signal value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_lc_rw_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_lc_iso_part_sw_wr_en | 
 |       desc: '''Verify the lc_creator_seed_sw_wr_en signal from LC ctrl. | 
 |  | 
 |             - Transition from TEST_LOCKED to DEV/PROD to ESCALATION/SCRAP state via OTP and verify | 
 |               that this LC signal transitions from 0 to 1 and back to 0. Verify that the SW | 
 |               accessibility of the corresponding partition depending on the signal value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_lc_rw_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_lc_seed_hw_rd_en | 
 |       desc: '''Verify the lc_seed_hw_rd_en signal from LC ctrl. | 
 |  | 
 |             - Transition from TEST_LOCKED to DEV/PROD to ESCALATION/SCRAP state via OTP and verify | 
 |               that this LC signal transitions from 0 to 1 and back to 0. Verify that the flash ctrl | 
 |               does (or does not) read the creator and owner partitions to fetch the seeds for the | 
 |               keymgr. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_lc_rw_en"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_lc_escalate_en | 
 |       desc: '''Verify the lc_escalate_en signal from LC ctrl. | 
 |  | 
 |             - Trigger an LC escalation signal by generating an alert. | 
 |             - Verify that all flash accesses are disabled when the escalation kicks in. | 
 |             - The CPU cannot read the flash either once escalation kicks in. This is unfortunately | 
 |               not possible because the CPU is also disabled when the escalation is triggered. | 
 |             - Use assertion based connectivity check to prove that this signal is connected to the | 
 |               flash ctrl. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_prim_tl_access | 
 |       desc: '''Verify that the SW can read / write the prim tlul interface in flash phy. | 
 |  | 
 |             - The prim tlul interface is a open source placeholder for the closed source CSRs that | 
 |               will be implemented in a translation 'shim'. | 
 |             - Verify that this region can be read / written to by the SW in any LC state. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_prim_tl_access"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_flash_ctrl_clock_freqs | 
 |       desc: '''Verify flash program and erase operations over the ctrl over a range of clock freqs. | 
 |  | 
 |             - Enable jitter on the clock while performing erase, write and read operations | 
 |               to the flash. | 
 |             - This sets the test for closed source where the flash access timing matters. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_flash_ctrl_clock_freqs"] | 
 |     } | 
 |  | 
 |     //////////////////////// | 
 |     // Analog Peripherals // | 
 |     // AST, SENSOR_CTRL   // | 
 |     //////////////////////// | 
 |  | 
 |     // AST (pre-verified IP) integration tests: | 
 |     { | 
 |       name: chip_sw_ast_clk_outputs | 
 |       desc: '''Verify that the AST generates the 4 clocks when requested by the clkmgr. | 
 |  | 
 |             Verify the clock frequencies are reasonably accurate. Bring the chip to deep sleep, | 
 |             and verify that upon wakeup reset the clock counters are turned off, measure ctrl | 
 |             regwen is enabled, and errors are not cleared. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_ast_clk_outputs"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_ast_clk_rst_inputs | 
 |       desc: '''Verify the clk and rst inputs to AST (from `clkmgr`). | 
 |  | 
 |             Details TBD. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_ast_sys_clk_jitter | 
 |       desc: '''Verify that the AST sys clk jitter control. | 
 |  | 
 |             Details TBD. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_ast_usb_clk_calib | 
 |       desc: '''Verify the USB clk calibration signaling. | 
 |  | 
 |             - First place the AST into a mode where usb clock frequency significantly deviates from the ideal. | 
 |             - Verify the clock is "off" using the clkmgr measurement mechanism. | 
 |             - Then, turn on the usb sof calibration machinery and wait a few mS. | 
 |             - Afterwards, measure the usb clock again using the clkmgr measurement controls, at this point the clock should be significantly more accurate. | 
 |             - Note, while the above is ideal, usbdev chip level testing is not yet ready and this test fakes the usb portion through DV forces. | 
 |             - Note also the real AST calibration logic is not available, so the sof testing in the open source is effectively short-circuited. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_usb_ast_clk_calib"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_ast_alerts | 
 |       desc: '''Verify the alerts from AST aggregating into the sensor_ctrl. | 
 |  | 
 |              X-ref'ed with `chip_sensor_ctrl_ast_alerts`. | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sensor_ctrl_alert"] | 
 |     } | 
 |  | 
 |     // SENSOR_CTRL tests: | 
 |     { | 
 |       name: chip_sw_sensor_ctrl_ast_alerts | 
 |       desc: '''Verify the alerts from AST aggregating into the sensor_ctrl. | 
 |  | 
 |                Check that AST events can be triggered from sensor_ctrl and that | 
 |                the resulting AST outputs are observed in both sensor_ctrl and | 
 |                the alert_handler. | 
 |  | 
 |                For the alert handler case, make sure to test each alert configured | 
 |                as either recoverable or fatal. | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_sleep_sensor_ctrl_alert_wakeup", | 
 |               "chip_sw_sensor_ctrl_alert"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sensor_ctrl_ast_status | 
 |       desc: '''Verify the io power ok status from AST. | 
 |  | 
 |                Check that when the IO POK status changes, an interrupt is triggered | 
 |                from sensor_ctrl.  After triggering, the IO status can be read | 
 |                from a sensor_ctrl register. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_sensor_ctrl_status"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_pwrmgr_sleep_sensor_ctrl_alert_wakeup | 
 |       desc: '''Verify the sensor control is able to wake the device | 
 |                from sleep mode when an alert event is triggered from | 
 |                AST. X-ref'ed chip_sw_pwrmgr_sleep_all_wake_ups. | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_pwrmgr_sleep_sensor_ctrl_alert_wakeup"] | 
 |     } | 
 |  | 
 |     ////////////////// | 
 |     // CPU          // | 
 |     // RV_CORE_IBEX // | 
 |     ////////////////// | 
 |  | 
 |     { | 
 |       name: chip_sw_nmi_irq | 
 |       desc: '''Verify the NMI interrupt to the CPU and correctness of the cause. | 
 |  | 
 |             Randomly use these two methods (simultaneously or choose one of them) to trigger the | 
 |             NMI interrupt: | 
 |             - Trigger the alert_handler escalation pair that maps to NMI. | 
 |             - Trigger a watchdog bark. | 
 |  | 
 |             Check rv_core_ibex's NMI interrupt register and clear the interrupt. | 
 |             If the NMI interrupt is triggered by alert_handle and the `class_clr_regwen` register | 
 |             is not locked, check that alert_handler can clear this NMI escalation stage. Then make | 
 |             sure that the alert_handler won't move forward to the next escalation stage. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rv_core_ibex_nmi_irq"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rv_core_ibex_rnd | 
 |       desc: '''Verify the functionality of the random number generation CSRs. | 
 |  | 
 |                - Enable entropy complex so `RND_DATA` can get entropy. | 
 |                - Perform multiple reads from `RND_DATA` polling `RND_STATUS` in | 
 |                  between to only read valid data. Check different random bits | 
 |                  are provided each time and that the random data is never zero or all ones. | 
 |                - Ensure `RND_STATUS` indicate invalid data immediately after | 
 |                  `RND_DATA` read. | 
 |                - Perform repeated reads from `RND_DATA` without `RND_STATUS` | 
 |                  polling to check read when invalid doesn't block. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rv_core_ibex_rnd"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rv_core_ibex_address_translation | 
 |       desc: '''Verify the simple address translation functionality. | 
 |  | 
 |                - Setup address translation for both slots on the the I and D | 
 |                  side and check correct translation for I and D accesses. | 
 |                - Switch address translation to use different regions that | 
 |                  overlap for both slots and check translation again. Ensure some | 
 |                  test accesses match both regions, where the lowest indexed one | 
 |                  takes priority. | 
 |                - Turn off address translation and confirm regions are no longer | 
 |                  being remapped. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_rv_core_ibex_address_translation"] | 
 |    } | 
 |  | 
 |    { | 
 |       name: chip_sw_rv_core_ibex_fault_dump | 
 |       desc: '''Verify the functionality of the ibex fault dump. | 
 |  | 
 |                - Purposely create an ibex exception during execution through reads to an ummapped address. | 
 |                - Ensure the rstmgr fault dump correctly captures the related addresses to the exception. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |    } | 
 |  | 
 |    { | 
 |       name: chip_sw_rv_core_ibex_double_fault | 
 |       desc: '''Verify the functionality of the ibex double fault dump. | 
 |  | 
 |                - Purposely create an ibex double exception during execution, by performing an unmapped read and in the exception handler perform another unmapped read. | 
 |                - Ensure the rstmgr fault dump correctly captures both dumps correctly and indicates the previous dump is valid. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |    } | 
 |  | 
 |     //////////////////////////// | 
 |     // System level scenarios // | 
 |     //////////////////////////// | 
 |     { | 
 |       name: chip_sw_example_test_from_rom_or_flash | 
 |       desc: '''Run examples tests developed for each boot stage. | 
 |  | 
 |             Our test infrastructure defaults to running tests out flash, at the | 
 |             ROM_EXT stage, but also supports running tests in the ROM stage. We | 
 |             develop example tests to demonstrate these capabilities, and need to | 
 |             run them in DV to ensure the integrity of our infrastructure. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["chip_sw_example_flash", | 
 |               "chip_sw_example_rom", | 
 |               "chip_sw_example_manufacturer", | 
 |               ] | 
 |     } | 
 |     { | 
 |       name: chip_sw_smoketest | 
 |       desc: '''Run smoke tests developed for each IP. | 
 |  | 
 |             The smoke tests are developed by the SW team to test each IP is | 
 |             alive, and can be actuated by the DIF. We need to ensure that they | 
 |             work in DV as well. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_aes_smoketest", | 
 |               "chip_sw_aon_timer_smoketest", | 
 |               "chip_sw_clkmgr_smoketest", | 
 |               "chip_sw_csrng_smoketest", | 
 |               "chip_sw_entropy_src_smoketest", | 
 |               "chip_sw_gpio_smoketest", | 
 |               "chip_sw_hmac_smoketest", | 
 |               "chip_sw_kmac_smoketest", | 
 |               "chip_sw_otbn_smoketest", | 
 |               "chip_sw_otp_ctrl_smoketest", | 
 |               "chip_sw_pwrmgr_smoketest", | 
 |               "chip_sw_pwrmgr_usbdev_smoketest", | 
 |               "chip_sw_rv_plic_smoketest", | 
 |               "chip_sw_rv_timer_smoketest", | 
 |               "chip_sw_rstmgr_smoketest", | 
 |               "chip_sw_sram_ctrl_smoketest", | 
 |               "chip_sw_uart_smoketest", | 
 |             ] | 
 |     } | 
 |     { | 
 |       name: chip_sw_rom_functests | 
 |       desc: '''Run some ROM functional tests with test ROM. | 
 |  | 
 |             ROM functional tests test ROM drivers and libraries by exercising | 
 |             these components in the flash stage, launched via the test ROM. They | 
 |             primarily are tested on the FPGA, however, we ensure they run in DV | 
 |             as well. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["rom_keymgr_functest"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_signed | 
 |       desc: '''Run some chip-level tests with ROM. | 
 |  | 
 |             In addition to ROM E2E tests, we select at least one (or a few) | 
 |             tests defined in this file to sign, and run via ROM instead of | 
 |             test ROM. We need to ensure our test infrastructure and ROM can | 
 |             boot and run one (or a few) of the same tests our test ROM can. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_uart_smoketest_signed"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_coremark | 
 |       desc: '''Run the coremark benchmark on the full chip.''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_coremark"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_boot | 
 |       desc: '''Verify the full flash image download with bootstrap signal set. | 
 |  | 
 |             - SW puts the SPI device in firmware mode | 
 |             - Load a firmware image (bootstrap) through spi input pin to the spi_device memory. | 
 |             - SW verifies the integrity of the image upon reception by reading the spi_device | 
 |               memory. | 
 |             - Ensure the image is executed correctly | 
 |  | 
 |              Note: This flow will be replaced by using spi_device flash mode. | 
 |              For detail, refer to chip_spi_device_flash_mode | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_uart_tx_rx_bootstrap"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_secure_boot | 
 |       desc: '''Verify the secure boot flow. | 
 |  | 
 |              Details TBD. | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_lc_walkthrough | 
 |       desc: '''Walk through the life cycle stages from RAW state and reseting the chip each time. | 
 |  | 
 |              - Pre-load OTP image with RAW lc_state. | 
 |              - Initiate the LC transition to one of the test unlock state. | 
 |              - Program test_unlock_token, test_exit_token, rma_unlock_token into OTP partitions. | 
 |              - Move forward to next valid LC states via JTAG interface or SW interface if CPU is | 
 |                enabled. | 
 |              Verify that the features that should indeed be disabled are indeed disabled. | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: ["chip_sw_lc_walkthrough_dev", | 
 |               "chip_sw_lc_walkthrough_prod", | 
 |               "chip_sw_lc_walkthrough_prodend", | 
 |               "chip_sw_lc_walkthrough_rma", | 
 |               "chip_sw_lc_walkthrough_testunlocks"] | 
 |     } | 
 |     { | 
 |       name: chip_sw_device_ownership | 
 |       desc: '''Walk through device ownership stages and flows. | 
 |  | 
 |              Details TBD. | 
 |              ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |     { | 
 |       name: chip_sw_sram_nmi_wipe | 
 |       desc: '''Verify SRAM behavior during an NMI escalation. | 
 |  | 
 |             - Trigger an NMI through the alert handler path to cause a system shutdown. | 
 |             - SW should trigger a memory "initialization", fully randomizing RAM contents | 
 |               and initiating another key request. | 
 |             - Verify that the RAMs are "wiped" once this operation completes. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: [] | 
 |     } | 
 |   ] | 
 | } |