| // 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", |
| "hw/dv/tools/dvsim/testplans/enable_reg_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"] |
| |
| testpoints: [ |
| /////////////////////////////////////////////////////////////////////////// |
| // IO Peripherals // |
| // UART, GPIO, I2C, SPIDEV, SPIHOST, USB, PINMUX & PADCTRL, PATTGEN, PWM // |
| /////////////////////////////////////////////////////////////////////////// |
| |
| // UART (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V1 |
| tests: ["chip_sw_uart_tx_rx"] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: 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_uart_tx_rx_alt_clk_freq |
| desc: '''Verify the transmission of UART while randomizing the core clock frequency. |
| |
| Run the chip_uart_tx_rx test with the core clock frequency randomized between known |
| bounds. |
| |
| TODO: Find out what the range is for the core clock frequency randomization. |
| ''' |
| milestone: V1 |
| tests: [] |
| } |
| |
| // GPIO (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V1 |
| tests: ["chip_sw_gpio"] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V1 |
| tests: ["chip_sw_gpio"] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V1 |
| tests: ["chip_sw_gpio"] |
| } |
| |
| // SPI_DEVICE (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_spi_device_tx_rx"] |
| } |
| { |
| name: chip_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 |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 |
| |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| { |
| name: chip_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 |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| { |
| name: chip_spi_device_connectivity_with_ast |
| desc: '''Verify the connectivity between spi_device and AST on scanmode and mbist |
| |
| This could be done through the connectivity test with FPV |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| { |
| name: chip_spi_device_pass_through_collision |
| desc: '''Verify the collisions on driving spi_host is handled properly |
| |
| TODO, add detail testplan once we have a conclusion on #5134 |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // SPI_HOST (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // I2C (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // USB (pre-verified IP) integration tests: |
| { |
| name: chip_usb_fs_se_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. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_usb_fs_df_tx_rx |
| desc: '''Verify the transmission of data over the USB at full speed. As a part of this test, |
| the enablement of USB pullup is also expected to be verified. In this test, the USB is |
| configured in differential mode. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_usb_vbus |
| desc: '''Verify that the USB device can detect the presence of VBUS from the USB host. |
| |
| TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_usb_suspend |
| desc: '''Verify that the USB device can detect the presence of VBUS from the USB host. |
| |
| TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sleep_usb_suspend |
| desc: '''Same as the above, but tested with low power entry/exit. |
| |
| TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // PINMUX (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // PADCTRL tests: |
| { |
| name: chip_padctrl_attributes |
| desc: '''Verify pad attribute settings for all MIO and DIO pads. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // PATTGEN (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // PWM (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| ////////////////////////////////////////////////////////////////////////////////////// |
| // 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_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // RV_DM (JTAG) tests: |
| { |
| name: chip_jtag_csr_rw |
| desc: ''' |
| Verify accessibility of CSRs as indicated in the RAL specification. |
| |
| - 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rv_dm_cpu_debug_mem |
| desc: '''Verify access to the debug mem from the CPU. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rv_dm_jtag_debug_mem |
| desc: '''Verify access to the debug mem from the external JTAG interface. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rv_dm_cpu_debug_req |
| desc: '''Verify debug request to Ibex while it is actively executing. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rv_dm_ndm_reset_req |
| desc: '''Verify non-debug reset req initiated from RV_DM when the chip is awake. |
| |
| Read CSRs / mem within all IPs in the chip to ensure that they are reset to the original |
| values. Read CSRs / mem in the debug domain to ensure that the values survive the reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sleep_rv_dm_ndm_reset_req |
| desc: '''Verify non-debug reset req initiated from RV_DM when the chip is in deep sleep. |
| |
| Read CSRs / mem within all IPs in the chip to ensure that they are reset to the original |
| values. Read CSRs / mem in the debug domain to ensure that the values survive the reset. |
| There are also other modules such as clk, pwr, rstmgr which survive this reset. Verify |
| those as well. |
| |
| TODO: `rv_dm` currently is not on the AON domain, so this feature does not exist ATM. |
| Need discussion with SW/Nuvoton. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rv_dm_jtag_tap_sel |
| desc: '''Verify ability to select all available TAPs. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rv_dm_lc_disabled |
| desc: '''Verify that the debug capabilities are disabled in certain life cycle stages. |
| |
| Verify that the debug mem is inaccessible from the CPU as well as external JTAG. |
| Details TBD. X-ref'ed with the LC tests. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // RV_TIMER (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_rv_timer_irq"] |
| } |
| |
| // AON_TIMER (pre-verified IP) integration tests: |
| { |
| name: chip_aon_timer_wakeup_irq |
| desc: '''Verify the AON timer wake up interrupt in normal operating state. |
| |
| - Program the PLIC to let the AON time 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_aon_timer_clks_resets |
| desc: '''Verify that the correct clocks and resets are connected to the AON timer. |
| |
| - The chip_aon_timer_deep_sleep_wakeup achieves this goal. |
| - Verify via connectivity assertion checks, the right clocks and resets from clkmgr and |
| rstmgr are connected to AON timer. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| - Program the alert handler to escalate on alerts upto phase 1 (i.e. stop after wipe |
| secrets). |
| - Trigger an alert to cause an escalation condition before the wakeup signal asserts. |
| - Wait for sufficiently long time to ensure that the bark interrupt does not trigger, |
| to prove that the wdog was disabled. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // PLIC (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [""] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [""] |
| } |
| { |
| name: chip_plic_nmi_irq |
| desc: '''Verify the NMI interrupt to the CPU and correctness of the cause. |
| |
| TBD if multiple NMI irqs are OR-ed into the CPU (example - NMI from alert handler and |
| the watchdog bark), then map each test to this testpoint. |
| ''' |
| milestone: V2 |
| tests: [""] |
| } |
| |
| // CLKMGR tests: |
| { |
| name: chip_sw_clk_idle_trans |
| desc: '''Verify the ability to turn off the transactional clock via SW. |
| |
| Ensure that activity in any of the IPs running on this clock prevents the clock from |
| actually being turned off until the activity is completed, at which point the clock is |
| turned off. Verify it is off via spinwait in hints_status CSR, and then check the state |
| of the transactional unit to correspond to a completed activity. Verify that turning |
| off this clock does not affect the other derived clocks. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sw_clk_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). |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sw_clk_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_clk_div |
| desc: '''Verify clk division logic is working correctly. |
| |
| This can be easily verified if we implement clock cycle counters. |
| The IP level checks the divided clocks on each parent clock cycle. |
| |
| Add formal connectivity tests to check peripherals are connected to |
| the clock they expect. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_clkmgr_external_clk_src |
| 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. It may be best to verify this via SVA, |
| unless we implement clock cycle counters. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_clkmgr_jitter_enable |
| desc: '''Verify the chip operates correctly when clock jitter is enabled. |
| |
| Run a full regression with the chip configured with jittery clocks. |
| This can be done in the custom boot ROM for DV tests, and provide a |
| SW knob in case some tests need to disable jitter. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // PWRMGR tests: |
| { |
| name: chip_pwrmgr_cold_boot |
| desc: '''Verify the cold boot sequence through the wiggling of `por_rst_n`. |
| |
| This mainly ensures that both FSMs are properly reset on the POR signal. The check |
| is that the processor ends up running. Also verify, the rstmgr records POR in |
| `reset_info` CSR. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_pwrmgr_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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` indicates the expected reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_dif_pwrmgr_smoketest", |
| "chip_sw_pwrmgr_usbdev_wakeup"] |
| } |
| { |
| name: chip_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. 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 `control.main_pd_n` is set to 0. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_pwrmgr_all_reset_reqs |
| desc: '''Verify that the chip can be reset by ALL available reset 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. Similar to |
| chip_pwrmgr_sleep_all_reset_reqs, except the chip is not put in low power mode. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_pwrmgr_bad_main_pok |
| desc: '''Verify the effect of main_pok de-assertion in the middle of low power entry / exit |
| FSM transition. |
| |
| The main_pok from AST is randomly forced to flip while in the middle of a FSM |
| transition. This is done on all normal / deep sleep / reset request tests. The check |
| that flipping during POR results in a stretched reset is done at IP level. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| |
| Verified at IP level. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_pwrmgr_debug_sleep |
| desc: '''Verify low power entry is prevented when the chip is in "debuggable" state. |
| |
| This is an open issue: https://github.com/lowRISC/opentitan/issues/7215 |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_pwrmgr_sleep_disabled |
| desc: '''Verify that the chip does not go to sleep on WFI when low power hint is 0. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // RSTMGR tests: |
| { |
| name: chip_rstrmgr_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 `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` and `usbdev` IPs receive multiple resets |
| so they will need special consideration. |
| TODO(maturana) Add specific tests once they are developed. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rstrmgr_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 |
| `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` and `usbdev` IPs receive multiple resets |
| so they will need special consideration. |
| TODO(maturana) Add specific tests once they are developed. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rstrmgr_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_rstrmgr_reset_info`. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rstrmgr_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_rstrmgr_reset_info`. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rstrmgr_sw_rst |
| desc: '''Verify `sw_rst_ctrl_n` CSR resets individual peripherals. |
| |
| Check the peripheral is reset via timeout accessing their CSRs while the corresponding |
| reset is active. The per peripheral reset controls in increasing order by |
| `sw_rst_ctrl_n` bit, are as follows: `spi_device`, `spi_host0`, `spi_host0_core`, |
| `spi_host1`, `spi_host1_core`, `usb`, `usbif`, `i2c0`, `i2c1`, `i2c2`. |
| |
| Notice the two `spi_host` and `usbdev` IPs receive two different resets each, |
| `spi_host*` and `spi_host*_core`, and `usb` and `usbif` respectively. This means |
| the CSRs to be used for checking may not be obvious. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // ALERT_HANDLER (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 secrets to be wiped - read via SW to confirm. |
| - Verify the third results in device being put in scrap state, via the LC JTAG TAP. |
| - Verify the fourth results in chip reset. |
| - Ensure that all escalation handshakes complete without errors. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_alert_handler_irqs |
| desc: '''Verify all classes of alert handler interrupts to the CPU. |
| |
| X-ref'ed with the automated PLIC test. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 `4'bff` 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_alert_handler_edn_reset |
| desc: '''Verify that the EDN clock / reset is connected to alert_handler. |
| |
| - Ensure that the ping timer LFSR resets when the EDN logic is held in reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // LC_CTRL (pre-verified IP) integration tests: |
| { |
| name: chip_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 |
| - Second escalation should cause the `lc_escalation_en` output to be asserted. Read |
| the LC_STATE CSR to confirm that it is in the escalate state. |
| - Verify that the escalate_en and check_bypass_en signals are asserted. X-ref'ed |
| with the respective IP tests that consume these signals. |
| - Third escalation should cause the LC ctrl to transition to the virtual scrap state. |
| At this stage, the CPU is not operational. Read the LC_STATE CSR via backdoor and |
| confirm that it is is in the scrap state. |
| - Verify that all decoded outputs except for escalate_en and check_bypass_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_lc_ctrl_jtag_trst |
| desc: '''Verify the JTAG test reset input connection to LC ctrl. |
| |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_lc_ctrl_otp_hw_cfg"] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_lc_ctrl_transitions |
| desc: '''Verify the LC ctrl can transition from one state to another valid state. |
| |
| - Initiate an LC ctrl state transition. |
| - 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. |
| |
| X-ref'ed chip_otp_ctrl_program. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_lc_ctrl_transition"] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_lc_ctrl_kmac_reset |
| desc: '''Verify the effect of putting the KMAC logic in reset. |
| |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 |
| |
| X-ref'ed with the respective IP tests that consume these signals. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_lc_ctrl_scanmode |
| desc: '''Verify the connectivity of scanmode to LC ctrl. |
| |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_lc_ctrl_scanmode_reset |
| desc: '''Verify the connectivity of scanmode reset to LC ctrl. |
| |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // SYSRST_CTRL (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sysrst_ctrl_sleep_gsc_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 GSC 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 GSC 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sysrst_ctrl_gsc_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 GSC reset signal. |
| - Program the associated detection timer. |
| - Program the detection outcome CSR's (com_out_ctl) GSC 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 GSC reset input. |
| - Read the reset cause register after boot up to confirm peripheral reset phase. |
| - Read the pwrmgr reset status register to confirm GSC reset. |
| - Read the com_sel_ctl_* CSR in SYSRST ctrl we programmed earlier - it should have been |
| reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sysrst_ctrl_sleep_gsc_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 GSC reset signal. |
| - Program the associated detection timer. |
| - Program the detection outcome CSR's (com_out_ctl) GSC reset bit to 1. |
| - Program the pwrmgr to put the chip in deep sleep state and allow it to be reset by GSC |
| 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 |
| GSC reset input. |
| - Read the reset cause register after boot up to confirm peripheral reset phase. |
| - Read the pwrmgr reset status register to confirm GSC reset. |
| - Read the com_sel_ctl_* CSR in SYSRST ctrl we programmed earlier - it should have been |
| reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // ADC_CTRL (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| /////////////////////////////////////////////////////// |
| // Security Peripherals // |
| // AES, HMAC, KMAC, CSRNG, ENTROPY_SRC, KEYMGR, OTBN // |
| /////////////////////////////////////////////////////// |
| |
| // AES (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 internal states (data_in, key share and IV are also |
| garbage, i.e. different from the originally written values. |
| - Assertion checks proves that all interfaces are connected across AST RNG, ES, CSRNG, |
| EDN and AES. |
| - Predict the generated entropy bits and check against the observed for correctness. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_aes_edn_reset |
| desc: '''Verify that the EDN clock / reset is connected to AES. |
| |
| - Ensure that the PRNG within AES resets when the EDN logic is held in reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_aes_lc_escalate_en |
| desc: '''Verify the effect of LC escalate en signal on AES. |
| |
| - Trigger an LC escalatation signal by writing to alert_test CSR (in some other IP). |
| - Trigger an AES operation to run. |
| - When the escalation kicks in, verify that the AES is in the error state. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_aes_idle |
| desc: '''Verify AES idle signaling to clkmgr. |
| |
| - Write the AES clk hint to 1 within clkmgr to indicate AES clk is ready to be gated. |
| Verify that the AES clk hint status within clkmgr reads 0 (AES is idle). |
| - Initiate an AES operation with a known key, plain text and digest. |
| Verify that the AES clk hint status within clkmgr now reads 1 (AES is not idle), |
| before the AES operation is complete. |
| - After the AES operation is complete, verify the digest for correctness. |
| Verify that the AES clk hint status within clkmgr now reads 0 again (AES is idle), |
| after the AES operation is complete. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_aes_sideload |
| desc: '''Verify the AES sideload mechanism. |
| |
| Details TBD, design updates pending. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // HMAC (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_hmac_idle |
| desc: '''Verify the HMAC clk idle signal to clkmgr. |
| |
| - Write the HMAC clk hint to 1 within clkmgr to indicate HMAC clk is ready to be gated. |
| Verify that the HMAC clk hint status within clkmgr reads 0 (HMAC is idle). |
| - Initiate an HMAC operation with a known key, plain text and digest. |
| Verify that the HMAC clk hint status within clkmgr now reads 1 (HMAC is not idle), |
| 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 idle), |
| after the HMAC operation is complete. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // KMAC pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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_timer`. |
| // TODO - error handling is not complete, do not enable `wait_timer` yet. |
| KMAC should send request to EDN once `CmdStart` is written, and should send out another |
| request to EDN when either: |
| - `entropy_timer` runs down (assuming it is non-zero) |
| - a hash operation is completed, KMAC will refresh its internal entropy state |
| 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. |
| ''' |
| milestone: V3 |
| tests: [] |
| } |
| { |
| name: chip_kmac_edn_reset |
| desc: '''Verify that the EDN clock / reset is connected to KMAC. |
| |
| - Ensure that the `entropy_timer` resets when the EDN logic is held in reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_kmac_idle |
| desc: '''Verify the KMAC idle signaling to clkmgr. |
| |
| - Write the KMAC clk hint to 1 within clkmgr to indicate KMAC clk is ready to be gated. |
| Verify that the KMAC clk hint status within clkmgr reads 0 (KMAC is idle). |
| - Initiate an KMAC operation with a known key, plain text and digest. |
| Verify that the KMAC clk hint status within clkmgr now reads 1 (KMAC is not idle), |
| 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 idle), |
| after the KMAC operation is complete. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // ENTROPY_SRC (pre-verified IP) integration tests: |
| { |
| name: chip_entropy_src_ast_rng_req |
| 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_entropy_src_ast_fips |
| desc: '''Verify the connectivity of rng_fips_o feedback signal to RNG. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_entropy_src_cs_aes_halt |
| desc: '''Verify the aes halt handshake with CSRNG. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_entropy_src_fuse_en_fw_read |
| desc: '''Verify the fuse input entropy_src. |
| |
| - Initialize the OTP with this fuse bit set to 1. |
| - Perform an entropy request operation. |
| - Read the entropy_data_fifo via SW; verify that it reads valid values. |
| - Reset the chip, but this time, initialize the OTP with this fuse bit set to 0. |
| - Perform an entropy request operation. |
| - Read the internal state via SW; verify that it reads all zeros this time. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // CSRNG tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_csrng_fuse_en_sw_app_read |
| desc: '''Verify the fuse input to CSRNG. |
| |
| - Initialize the OTP with this fuse bit set to 1. |
| - Issue an instantiate command to request entropy. |
| - Verify that SW can read the internal states. |
| - Reset the chip and repeat the steps above, but this time, with OTP fuse bit set to 0. |
| - Verify that the SW reads back all zeros when reading the internal states. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_csrng_lc_hw_debug_en |
| desc: '''Verify the effect of LC HW debug enable on CSRNG. |
| |
| TODO: This is pending SCA security review and might be removed. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // EDN (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // KEYMGR (pre-verified IP) integration tests: |
| { |
| name: chip_keymgr_key_derivation |
| desc: '''Verify the keymgr advances to all states and generate identity / SW output. |
| |
| - Backdoor load random value to OTP key, OTP device ID, creator and owner seeds in |
| flash, and the ROM digest |
| - For HardwareRevisionSecret and LC diversification, use the constant values in design. |
| - Configure the keymgr and advance to `CreatorRootKey`. |
| - 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. |
| - Verify that the keymgr has received valid output from the KMAC. |
| - Advance to `OwnerIntermediateKey` and `OwnerRootKey` to repeat the above sequences. |
| - Generating identity / SW output in `OwnerRootKey` is optional as there is not |
| additional interaction between keymgr and other blocks. |
| - Advance to `Disabled` and verify keymgr enters the state successfully. |
| - Generate identity / SW output and ensure these are neither all 1s/0s nor any valid |
| key value, which proves secrets are wiped by entropy value from EDN. |
| |
| - 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 |
| |
| X-ref'ed with kmac test. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_keymgr_lc_disable |
| desc: '''Verify that the keymgr is disabled on LC escalation. |
| |
| - Configure the keymgr and advance to `CreatorRootKey`. |
| - Transition life cycle to `ESCALATION` state, which should disable keymgr. |
| - Verify keymgr enters the `Disabled` state successfully. |
| |
| X-ref'ed with life cycle test. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_keymgr_sideload_aes |
| desc: '''Verify the keymgr sideload interface to AES. |
| |
| Same as `chip_keymgr_sideload_kmac`, except, sideload to AES. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // OTBN (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otbn_idle |
| desc: '''Verify the OTBN idle signal to clkmgr. |
| |
| - Write the OTBN clk hint to 1 within clkmgr to indicate OTBN clk is ready to be gated. |
| Verify that the OTBN clk hint status within clkmgr reads 0 (OTBN is idle). |
| - Start an OTBN operation. |
| Verify that the OTBN clk hint status within clkmgr now reads 1 (OTBN is not idle), |
| before the operation is complete. |
| - After the OTBN operation is complete, check the output for correctness. |
| Verify that the OTBN clk hint status within clkmgr now reads 0 again (OTBN is idle), |
| after the operation is complete. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otbn_edn_reset |
| desc: '''Verify that the EDN clock / reset is connected to OTBN. |
| |
| - Use connectivity assertion check to verify that the right clock and reset signals are |
| connected for receiving the entropy data from EDN. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otbn_ast_ram_cfg |
| desc: '''Verify that the ram_cfg signal from AST is connected to OTBN. |
| |
| - In open source, this is verified by a simple connectivity assertion check. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otbn_mem_scramble |
| desc: '''Verify the OTBN can receive keys from the OTP to scramble the OTBN imem and dmem. |
| |
| - Have OTBN fetch a new key and nonce from the OTP_CTRL. |
| - Write and read-check OTBN and IMEM for consistency. |
| - Fetch a new key from the OTP_CTRL and ensure that previous contents in the IMEM and |
| DMEM cannot be read anymore. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| ///////////////////////////////////////////////////// |
| // Memory & Controllers // |
| // ROM_CTRL, RAM, FLASH, FLASH_CTRL, OTP, OTP_CTRL // |
| ///////////////////////////////////////////////////// |
| |
| // ROM_CTRL (pre-verified IP) integration tests: |
| { |
| name: chip_rom_access |
| desc: '''Verify that the CPU can access the rom contents. |
| |
| - Verify that the CPU can fetch instructions from the ROM. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rom_ctrl_ast_rom_cfg |
| desc: '''Verify that the rom_cfg signal from AST is connected to ROM ctrl. |
| |
| - In open source, this is verified by a simple connectivity assertion check. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_rom_ctrl_reset_glitch |
| desc: '''Verify that a glitch on the ROM ctrl's reset input is triggered as a fatal alert. |
| |
| - In normal boot up from POR, the ROM contents are checked for validity using KMAC. |
| - After boot up, read the reset cause register in rstmgr to confirm POR reset phase. |
| - SW goes into idle state (nothing to do). |
| - The testbench randomly glitches the ROM ctrl's reset input, which causes ROM ctrl to |
| re-check the contents for validity. |
| - Verify that the KMAC detects the repeat presentation of data from ROM ctrl as a fatal |
| alert and the chip is rebooted via the alert escalation path. |
| - After boot up, read the reset cause register in rstmgr to confirm reset due to alert |
| phase. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // SRAM (pre-verified IP) integration tests: |
| { |
| name: chip_sram_scrambled_access |
| desc: '''Verify scrambled memory accesses to both main and retention SRAMs. |
| |
| - 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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? |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sram_execution |
| desc: '''Verify that CPU can fetch data from both SRAMs when in executable mode. |
| |
| - Load instruction data into the SRAMs. |
| - Configure main/ret SRAMs to allow instruction execution. |
| - Have the CPU fetch the instruction data from the SRAMs and verify that SW can finish |
| the test successfully. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: 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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 IP tests that consume these signals. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otp_ctrl_edn_reset |
| desc: '''Verify the effect of putting the EDN domain in reset on OTP ctrl. |
| |
| Verify that the computed nonce for SRAM is reset? |
| Verify all entropy data used for various things are reset. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_lc_ctrl_transition"] |
| } |
| { |
| name: chip_otp_ctrl_program_error |
| desc: '''Verify the otp program error. |
| |
| - Initiate an illegal program request from LC ctrl to OTP ctrl (example: issue program |
| request when the lc_cnt is at max value). |
| - Verify that the LC ctrl triggers an alert when the OTP ctrl responds back with a |
| program error. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_lc_ctrl_otp_hw_cfg"] |
| } |
| { |
| name: chip_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_otp_ctrl_program. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otp_ctrl_ast |
| desc: '''Verify the power sequencing signals to AST, as well as the alert. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otp_ctrl_external_voltage |
| desc: '''Verify the connectivity of the external voltage signal to OTP ctrl. |
| |
| Details TBD. |
| TODO; This signal is not connected in the design yet. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_otp_ctrl_scan |
| desc: '''Verify the connectivity of the scan signals to OTP ctrl. |
| |
| Details TBD. |
| TODO; This signal is not connected in the design yet. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // FLASH (pre-verified IP) integration tests: |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_flash_ctrl_access"] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_jtag_conn |
| desc: ''' |
| Verify that the JTAG interface for the closed source flash macro is connected from chip |
| IOs. |
| |
| In open source, this JTAG interface is null-terminated, so we can only verify this |
| through a connectivity test. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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 is gated until the flash operation completes. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_creator_seed_wipe_on_rma |
| desc: '''Verify that the creator seed is wiped by the flash ctrl on RMA entry. |
| ''' |
| milestone: V2 |
| tests: [] |
| |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_lc_escalate_en |
| desc: '''Verify the lc_escalate_en signal from LC ctrl. |
| |
| - Trigger an LC escalatation 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 connectivity check to prove that this signal is connected to the flash ctrl. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_prim_tl_access |
| desc: '''Verify that the SW can read / write the dummy memory in flash phy. |
| |
| - The dummy memory 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. |
| |
| - TODO: the existing CSR / mem tests may already handle this. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_ast_conn |
| desc: '''Verify the connectivity of AST / top level signals. |
| |
| - From AST to flash ctrl: |
| flash_power_ready_h_i, flash_power_down_h_i, flash_bist_enable_i, scanmode_i, |
| scan_en_i, scan_rst_ni. |
| |
| - From top level (chip IOs): |
| flash_test_mode_a_io, flash_test_voltage_h_io. |
| |
| - From flash ctrl to AST: |
| flash_alert_o. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_ctrl_clock_freqs |
| desc: '''Verify flash program and erase operations over the ctrl over a range of clock freqs. |
| |
| - The range of clock freqs to test is TBD. |
| - Reuse chip_flash_ctrl_ops to also enable jitter on the clock as well as run with |
| randomized clock frequencies. |
| - This sets the test for closed source where the flash access timing matters. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_flash_lc_nvm_debug_en |
| desc: '''Verify that the lc_nvm_debug_en signal from LC ctrl is connected to the flash ctrl. |
| |
| - Use connectivity test in the open source, since this signal is not used.. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| //////////////////////// |
| // Analog Peripherals // |
| // AST, SENSOR_CTRL // |
| //////////////////////// |
| |
| // AST (pre-verified IP) integration tests: |
| { |
| name: chip_ast_clk_outputs |
| desc: '''Verify that the AST generates the 4 clocks when requested by the clkmgr. |
| |
| Verify the clock frequencies are reasonably accurate. Verify that when the clkmgr |
| deasserts the enable (on account of low power entry), the clocks are turned off. Verify |
| that when turned on (low power exit), the clocks are glitch free. |
| |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_ast_clk_rst_inputs |
| desc: '''Verify the clk and rst inputs to AST (from `clkmgr`). |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_ast_sys_clk_jitter |
| desc: '''Verify that the AST sys clk jitter control. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_ast_usb_clk_calib |
| desc: '''Verify the USB clk calibration signaling. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_ast_alerts |
| desc: '''Verify the alerts from AST aggregating into the sensor_ctrl. |
| |
| X-ref'ed with `chip_sensor_ctrl_ast_alerts`. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| // SENSOR_CTRL tests: |
| { |
| name: chip_sensor_ctrl_ast_alerts |
| desc: '''Verify the alerts from AST aggregating into the sensor_ctrl. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_sensor_ctrl_ast_status |
| desc: '''Verify the io power ok status from AST. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| |
| //////////////////////////// |
| // System level scenarios // |
| //////////////////////////// |
| |
| { |
| name: chip_sw_dif_smoketest |
| desc: '''Run smoke tests developed for each DIF. |
| |
| The DIF smoke tests are developed by the SW team to test each block's DIF |
| implementation. We need to ensure that they work in DV as well. |
| ''' |
| milestone: V2 |
| tests: ["chip_dif_aes_smoketest", |
| "chip_dif_aon_timer_smoketest", |
| "chip_dif_clkmgr_smoketest", |
| // TODO(lowrisc/opentitan#7505): Debug CSRNG generate bits mismatch. |
| // "chip_dif_csrng_smoketest", |
| "chip_dif_entropy_src_smoketest", |
| "chip_dif_gpio_smoketest", |
| "chip_dif_hmac_smoketest", |
| "chip_dif_kmac_smoketest", |
| "chip_dif_kmac_cshake_smoketest", |
| "chip_dif_otbn_smoketest", |
| "chip_dif_otp_ctrl_smoketest", |
| "chip_dif_rv_plic_smoketest", |
| "chip_dif_pwrmgr_smoketest", |
| "chip_dif_rv_timer_smoketest", |
| "chip_dif_rstmgr_smoketest", |
| "chip_dif_uart_smoketest", |
| ] |
| } |
| { |
| name: chip_coremark |
| desc: '''Run the coremark benchmark on the full chip.''' |
| milestone: 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 |
| ''' |
| milestone: V2 |
| tests: ["chip_sw_uart_tx_rx_bootstrap"] |
| } |
| { |
| name: chip_secure_boot |
| desc: '''Verify the secure boot flow. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_lc_walkthrough |
| desc: '''Walk through the life cycle stages reseting the chip each time. |
| |
| Verify that the features that should indeed be disabled are indeed disabled. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_device_ownership |
| desc: '''Walk through device ownership stages and flows. |
| |
| Details TBD. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| { |
| name: chip_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. |
| ''' |
| milestone: V2 |
| tests: [] |
| } |
| ] |
| } |