[chip dv] Initial DV documentation
This PR just adds the template DV plan and testplan documents. These
are far from complete. Their contents will be updated in subsequent PRs
in stages.
Signed-off-by: Srikrishna Iyer <sriyer@google.com>
diff --git a/hw/_index.md b/hw/_index.md
index 3bb0b37..0760122 100644
--- a/hw/_index.md
+++ b/hw/_index.md
@@ -39,7 +39,7 @@
* `top_earlgrey`
* [Design specification]({{< relref "hw/top_earlgrey/doc" >}})
- * DV plan (TBD)
+ * [DV plan]({{< relref "hw/top_earlgrey/doc/dv_plan" >}})
* [DV simulation results, with coverage (nightly)](https://reports.opentitan.org/hw/top_earlgrey/dv/latest/results.html)
* FPV results (nightly) (TBD)
* [AscentLint results (nightly)](https://reports.opentitan.org/hw/top_earlgrey/lint/ascentlint/latest/results.html)
diff --git a/hw/top_earlgrey/_index.md b/hw/top_earlgrey/_index.md
index 4f7ea59..a069b0d 100644
--- a/hw/top_earlgrey/_index.md
+++ b/hw/top_earlgrey/_index.md
@@ -4,7 +4,7 @@
## Specification
-The specification of Earlgrey is located [here]({{< relref "doc/index.md" >}}).
+The specification of Earlgrey is located [here]({{< relref "doc" >}}).
## Tool: TopGen
diff --git a/hw/top_earlgrey/data/chip_testplan.hjson b/hw/top_earlgrey/data/chip_testplan.hjson
index dafc31a..d50ccff 100644
--- a/hw/top_earlgrey/data/chip_testplan.hjson
+++ b/hw/top_earlgrey/data/chip_testplan.hjson
@@ -3,18 +3,1318 @@
// SPDX-License-Identifier: Apache-2.0
{
name: "chip"
+
+ // Replicate CSR and mem tests over TL and JTAG interfaces.
+ intf: ["_tl", "_jtag"]
+
+ // TODO: remove the common testplans if not applicable
import_testplans: ["hw/dv/tools/testplans/csr_testplan.hjson",
+ "hw/dv/tools/testplans/enable_reg_testplan.hjson",
"hw/dv/tools/testplans/shadow_reg_errors_testplan.hjson",
"hw/dv/tools/testplans/mem_testplan.hjson",
+ "hw/dv/tools/testplans/intr_test_testplan.hjson",
"hw/dv/tools/testplans/tl_device_access_types_testplan.hjson",
"hw/ip/tlul/data/tlul_testplan.hjson"]
+
entries: [
+ //////////////////////////////////////////////////////////////////////////////////
+ // IO Peripherals //
+ // UART, GPIO, I2C, SPIDEV, SPIHOST, USB, PINMUX & PADCTRL, RV_DM, PATTGEN, PWM //
+ //////////////////////////////////////////////////////////////////////////////////
+
+ // UART (pre-verified IP) integration tests:
{
- name: sanity
- desc: ''' Basic hello world type test.
+ 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.
'''
milestone: V1
- tests: ["chip_sanity"]
+ tests: ["chip_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.
+ '''
+ milestone: V1
+ tests: ["chip_uart_tx_rx"]
+ }
+
+ // GPIO (pre-verified IP) integration tests:
+ {
+ name: chip_gpio_out
+ desc: '''Verify GPIO outputs.
+
+ SW test configures the GPIO to be in the output mode. The test walks a 1 through the
+ pins. The testbench checks the value for correctness.
+ '''
+ milestone: V1
+ tests: []
+ }
+ {
+ name: chip_gpio_in
+ desc: '''Verify GPIO inputs.
+
+ The SW test configures the GPIO 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: []
+ }
+
+ // 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.
+
+ 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 and max SPI clk frequencies. Also, run with single, dual and
+ quad SPI modes. Also, ensure that the spi_device does not recieve transactions when the
+ csb is high.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_spi_device_eeprom
+ desc: '''Verify the SPI device in EEPROM mode.
+
+ SW puts the SPI device in EEPROM mode and allows a firmware image (a.k.a. a known
+ payload) to be downloaded into the in-built EEPROM. SW verifies the integrity of the
+ payload upon reception by reading the EEPROM. Details TBD since the feature is NA yet.
+ '''
+ 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.
+
+ Details TBD. Run with min and max SPI clk frequencies. Also, run with single, dual,
+ and quad SPI modes.
+
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_spi_pass_through
+ desc: '''Verifies the pass through mode from an end-to-end perspective.
+
+ SW configures the SPI device and host in pass through mode. The testbench sends a random
+ payload over the SPI device interface and verifies its integrity on the SPI host
+ interface. Run with min and max SPI clk frequencies. Also, run with single, dual,
+ and quad SPI modes. Details TBD.
+ '''
+ 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.
+
+ The SW test writes a known data over the chip's I2C host interface, which is verified by
+ the testbench (which acts as the I2C device). Likewise, SW test then reads and verifies
+ a known data. SW validates the reception of RX watermark, FMT overflow, RX overflow,
+ NAK, FMT watermark and trans complete interrupts (the SW test / testbench work together
+ to create those scenarios).
+ Verify all instances of I2C in the chip independently.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_i2c_device_tx_rx
+ desc: '''Verify the transmission of data over the chip's I2C device interface.
+
+ The testbench writes a known data over the chip's I2C device interface, which is
+ verified by the SW test for correctness. Testbench then reads and verifies
+ a known data. SW validates the reception of TBD interrupts (the SW test / testbench
+ create those scenarios).
+ Verify all instances of I2C in the chip independently.
+ '''
+ 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: []
+ }
+
+ // PADCTRL tests:
+ {
+ name: chip_padctrl_attributes
+ desc: '''Verify pad attribute settings for all MIO and DIO pads.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // RV_DM (JTAG) 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: []
+ }
+
+ // PATTGEN (pre-verified IP) integration tests:
+ {
+ name: chip_pattgen_ios
+ desc: '''Verify pattern generation to chip output pads.
+
+ SW programs pattgen to generate distinct patterns on both groups. SW programs pinmux to
+ select pattgen outputs to be routed. SW validates the reception of patt_done interrupts.
+ Testbench verifies the correctness of the pattern seen on the IO pins.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // PWM (pre-verified IP) integration tests:
+ {
+ name: chip_sleep_pwm_ios_val
+ desc: '''Verify PWM signaling to chip output pads during deep sleep
+
+ PWM is in the AON domain. During deep sleep, we should be able to signal the 3 external
+ LEDs that are connected to the PWM signals. Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ ///////////////////////////////////////////////////////////////
+ // System Peripherals //
+ // TIMER, WDOG, PLIC, CLK/RST/PWR MGR, ALERT_HANDLER, LC_MGR //
+ ///////////////////////////////////////////////////////////////
+
+ // RV_TIMER (pre-verified IP) integration tests:
+ {
+ name: chip_timer
+ desc: '''Verify the timeout interrupt from all timer instances.
+
+ The SW test configures the RV_TIMER to generate interrupt after a set timeout. The SW
+ test validates the received interrupt. The testbench verifies that the interrupt was
+ fired only after the timeout elapsed.
+ Verify all instances of the RV_Timer.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sleep_aon_timer_wake
+ desc: '''Verify the timer in the AON domain can wake up the chip from sleep.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // WATCHDOG (pre-verified IP) integration tests:
+ {
+ name: chip_wdog_bark
+ desc: '''Verify the watchdog bark reception in awake state.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_wdog_bite
+ desc: '''Verify the watchdog bite causing reset in awake state.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sleep_wdog_bark_wake
+ desc: '''Verify the watchdog bark wake up from sleep state.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sleep_wdog_bite_wake
+ desc: '''Verify the watchdog bite reset from sleep state.
+ '''
+ 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_off_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. Verify that turning off this clock does not affect the other
+ derived clocks.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sw_clk_off_peri
+ desc: '''Verify the ability to turn off the peripheral clock via SW.
+
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_clk_div
+ desc: '''Verify clk division logic is working correctly.
+
+ '''
+ 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. Details TBD.
+ '''
+ 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.
+ '''
+ 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.
+ '''
+ 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.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ 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.
+ '''
+ 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.
+ '''
+ 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.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_pwrmgr_b2b_sleep_reset_req
+ desc: '''Verify that the pwrmge sequences sleep_req and reset req coming in almost at the same
+ time, one after the other.
+
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_pwrmgr_debug_sleep
+ desc: '''Verify that when the chip being in "debuggable" state prevent the low power entry.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_pwrmgr_sleep_wake_req_disabled
+ desc: '''Verify that the chip cannot be woken up from sleep from a wake up source that is
+ disabled.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_pwrmgr_reset_req_disabled
+ desc: '''Verify that the chip cannot be reset from a reset source that is disabled.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_pwrmgr_sleep_reset_req_disabled
+ desc: '''Verify that the chip cannot be woken up from sleep from a reset source that is
+ disabled.
+ '''
+ 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: []
+ }
+ {
+ name: chip_pwrmgr_sleep_wake_up_fall_through
+ desc: '''Verify that the chip sleep falls through when an interrupt arrives just in time
+ before the pwrmgr iniitates the low power entry.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_pwrmgr_sleep_abort
+ desc: '''Verify that the chip sleep transition aborts due to an active flash / lifecycle / OTP
+ transaction.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+
+ // RSTMGR tests:
+
+ // ALERT_HANDLER (pre-verified IP) integration tests:
+ {
+ name: chip_alert_handler_alerts
+ desc: '''Verify all alerts coming into the alert_handler.
+
+ X-ref'ed with all IP tests.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_alert_handler_irqs
+ desc: '''Verify all classes of alert handler interrupts to the CPU.
+
+
+ Program each alert to cause an interrupt in each class. SW validates the reception of
+ the interrupt. X-ref'ed with all IP tests.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_alert_handler_esc_irqs
+ desc: '''Verify all alert handler escalation irqs.
+
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_alert_handler_entropy
+ desc: '''Verify the alert handler entropy input to ensure pseudo-random ping timer.
+
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_alert_handler_crashdump
+ desc: '''Verify the alert handler crashdump signal.
+
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_alert_handler_ping_fail
+ desc: '''Verify the alert ping failure results in an escalation.
+
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // LC_MANAGER (pre-verified IP) integration 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 (or interrupt if available). Check the digest registers for correctness against
+ the expected digest value.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_aes_shadow_reg_alert
+ desc: '''Verify shadow reg alert from AES.
+
+ Inject a storage error via backdoor to generate this alert signal while the SW is
+ actively executing some piece of code. Verify alert propagation to an NMI.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_aes_idle
+ desc: '''Verify AES idle signaling to clkmgr.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // HMAC (pre-verified IP) integration tests:
+ {
+ name: chip_hmac_enc
+ desc: '''Verify HMAC / SHA256 operation.
+
+ SW test verifies SHA256 operation with a known key, plain text and digest (pick one of
+ the NIST vectors). SW validates the reception of hmac done and fifo empty interrupts.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_hmac_alert
+ desc: '''Verify alert from HMAC.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_hmac_idle
+ desc: '''Verify HMAC idle signaling to clkmgr.
+
+ Details TBD.
+ '''
+ 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_sram_uncorrectable_alert
+ desc: '''Verify the SRAM uncorrectable alert from KMAC.
+
+ Inject 2 bit errors within the SRAM inside KMAC via backdoor and ensure that this alert
+ propagates to an NMI.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_kmac_sram_data_parity_alert
+ desc: '''Verify the data parity alert from KMAC.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_kmac_keymgr_key_data
+ desc: '''Verify the keymgr interface to KMAC.
+
+ X-ref'ed with keymgr test.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_kmac_idle
+ desc: '''Verify KMAC idle signaling to clkmgr.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // CSRNG tests:
+ {
+ name: chip_csrng_cmd
+ desc: '''Verify the cmd interface to CSRNG.
+
+ Details TBD. SW test validates the reception of cmd req done interrupt.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_csrng_entropy_src
+ desc: '''Verify the interface to entropy_src.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_csrng_fuse
+ desc: '''Verify the fuse input to CSRNG.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // ENTROPY_SRC (pre-verified IP) integration tests:
+ {
+ name: chip_entropy_src_ast_rng_req
+ desc: '''Verify the RNG req to ast.
+
+ Details TBD. SW test validates the reception of the entropy valid interrupt.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_entropy_src_fuse
+ desc: '''Verify the fuse input entropy_src.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // KEYMGR (pre-verified IP) integration tests:
+
+ // OTBN (pre-verified IP) integration tests:
+ {
+ name: chip_otbn_op
+ desc: '''Verify an OTBN operation.
+
+ SW test directs the BIGNUM engine to perform an operation. The BIGNUM SW image is
+ backdoor loaded into OTBN IMEM. SW validates the reception of the otbn done interrupt.
+ SW also verifies the correctness of the OTBN operation using a reference model. Details
+ TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otbn_imem_uncorrectable_alert
+ desc: '''Verify the imem uncorrectable alert from OTBN.
+
+ Inject 2 bit errors within the IMEM SRAM inside OTBN via backdoor and ensure that this
+ alert propagates to an NMI.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otbn_dmem_uncorrectable_alert
+ desc: '''Verify the dmem uncorrectable alert from OTBN.
+
+ Inject 2 bit errors within the DMEM SRAM inside OTBN via backdoor and ensure that this
+ alert propagates to an NMI.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otbn_reg_uncorrectable_alert
+ desc: '''Verify the reg uncorrectable alert from OTBN.
+
+ Details TBD. Ensure that this alert propagates to an NMI.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otbn_mem_encr
+ desc: '''Verify the encryption of the mem within OTBN using the key provided by the OTP.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otbn_idle
+ desc: '''Verify OTBN idle signaling to clkmgr.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ ////////////////////////////////////////////////
+ // Memory & Controllers //
+ // ROM, RAM, FLASH, FLASH_CTRL, OTP, OTP_CTRL //
+ ////////////////////////////////////////////////
+
+ // ROM (pre-verified IP) integration tests:
+ // TODO: Not sure if this will really be a pre-verified IP. If not, then more tests are needed
+ // at the chip level.
+ {
+ name: chip_rom_access
+ desc: '''Verify access to the rom.
+
+ Verify that the CPU can fetch instructions from the ROM. Nothing extra needs to be done
+ here - all SW tests do this anyway.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rom_security_features
+ desc: '''Verify ROM security / ECC features if available.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // SRAM (pre-verified IP) integration tests:
+ {
+ name: chip_sram_access
+ desc: '''Verify access to the SRAM.
+
+ Verify that the CPU can fetch data from the SRAM. Nothing extra needs to be done
+ here - all SW tests do this anyway.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sram_scramble
+ desc: '''Verify scrambling of the SRAM data.
+
+ SW enables scrambling within the SRAM. Ensure that the data written to the SRAM is
+ scrambled and likewise, when read from the SRAM is de-scrambled correctly via backdoor.
+ The key and nonce for the scrambling is supplied by the OTP.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sram_ret_access
+ desc: '''Verify access to the retention SRAM.
+
+ Verify that the CPU can fetch data from the retention SRAM.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sram_ret_scramble
+ desc: '''Verify scrambling of the retention SRAM data.
+
+ SW enables scrambling within the retention SRAM. Ensure that the data written to the
+ SRAM is scrambled and likewise, when read from the SRAM is de-scrambled correctly via
+ backdoor. The key and nonce for the scrambling is supplied by the OTP.
+ '''
+ 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: []
+ }
+
+ // OTP (pre-verified IP) integration tests:
+ // TODO: more testing needed on OTP.
+ {
+ name: chip_otp_init
+ desc: '''Verify the OPT initialization on chip power up.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otp_keys
+ desc: '''Verify the proliferation of keys to security peripherals.
+
+ Ensure that the correct set of keys are provided to sram, sram_ret, flash, keymgr and
+ the OTBN. X-ref'ed with those individual IP tests.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_otp_lc_program
+ desc: '''Verify the OTP program req from LC.
+
+ Ensure that the correct set of keys are provided to sram, sram_ret, flash, keymgr and
+ the OTBN. X-ref'ed with those individual IP tests.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // FLASH (pre-verified IP) integration tests:
+ {
+ name: chip_flash_host_access
+ desc: '''Verify access to the flash mem.
+
+ Verify that the CPU can read the flash mem contents.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_flash_ctrl_ops
+ desc: '''Verify flash ctrl ops.
+
+ Verify that the CPU can read / program and erase the flash mem. Pick an operation on
+ both 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_ctrl_scramble
+ desc: '''Verify flash scrambling via the controller.
+
+ Verify that the CPU can program and read back data via the flash ctrl with scrambling
+ enabled.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_flash_scramble
+ desc: '''Verify flash scrambling via the host interface.
+
+ Verify that the CPU read data from the flash with scrambling enabled.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_flash_ast_pwr_dwn
+ desc: '''Verify that power down signaling from AST to flash.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_flash_test_mode
+ desc: '''Verify that flash test mode and flash volt signaling from chip IOs.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ //////////////////////
+ // CrOS Peripherals //
+ // RBOX, DCD //
+ //////////////////////
+
+ // RBOX (pre-verified IP) integration tests:
+ {
+ name: chip_rbox_key_pass_through
+ desc: '''Verify pass through of key in to key out.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rbox_pwrb_pass_through
+ desc: '''Verify pass through of power button signal in to out.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rbox_ac_present_in
+ desc: '''Verify the RBOX can detect AC present input.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rbox_batt_en_out
+ desc: '''Verify the RBOX can signal battery enabled output.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rbox_ec_entering_rw_in
+ desc: '''Verify the RBOX can detect EC entering RW mode input.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rbox_ec_in_rw_out
+ desc: '''Verify the RBOX can signal EC in RW mode output.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_rbox_ec_reset_l_out
+ desc: '''Verify the RBOX can signal EC reset output.
+
+ Verify EC reset pulse duration. Verify open drain when not active. Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sleep_rbox_ios_val
+ desc: '''Verify the RBOX can signal EC reset output.
+
+ Verify EC reset pulse duration. Verify open drain when not active. Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+
+ // DCD (pre-verified IP) integration tests:
+ {
+ name: chip_sleep_dcd_ast_adc_pd
+ desc: '''Verify that in deep sleep, DCD can signal the ADC within the AST to power down.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_sleep_dcd_debug_cable_wake
+ desc: '''Verify that the debug cable detection logic can wake up the chip from sleep.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_dcd_ast_adc
+ desc: '''Verify that the DCD can use the ADC within AST to know the voltage level.
+
+ Details TBD. SW test validates the reception of debug cable update interrupt.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_dcd_por_l
+ desc: '''Verify the POR reset input to DCD.
+
+ This sort of also tracks the testing of DCD surviving low power entry/exit.
+ Details TBD.
+ '''
+ 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_boot
+ desc: '''Verify the full flash image download with bootstrap signal set.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_secure_boot
+ desc: '''Verify the secure boot flow.
+
+ Details TBD.
+ '''
+ milestone: V2
+ tests: []
+ }
+ {
+ name: chip_prod_os
+ desc: '''Run the OpenTitan TockOS that will be deployed in production.
+
+ Run the TockOS image in DV. The advantage of doing so is running Tock with the full
+ suite of design assertions and other checks in place in the DV environment.
+ '''
+ milestone: V2
+ tests: ["chip_opentitan_tock"]
+ }
+ {
+ 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: []
}
]
}
diff --git a/hw/top_earlgrey/doc/index.md b/hw/top_earlgrey/doc/_index.md
similarity index 100%
rename from hw/top_earlgrey/doc/index.md
rename to hw/top_earlgrey/doc/_index.md
diff --git a/hw/top_earlgrey/doc/dv_plan/index.md b/hw/top_earlgrey/doc/dv_plan/index.md
new file mode 100644
index 0000000..55407a9
--- /dev/null
+++ b/hw/top_earlgrey/doc/dv_plan/index.md
@@ -0,0 +1,144 @@
+---
+title: "Earlgrey Chip DV Plan"
+---
+
+## Goals
+* **DV**
+ * Verify `top_earlgrey` features by running dynamic simulations with a SV/UVM based testbench.
+ * Verify the integration of all pre-verified IPs instantiated in the chip.
+ * Verify the integration and the internal design of non-pre-verified IPs instantiated in the chip.
+ * Verify system level scenarios for correctness of our design assumptions and behavior.
+ * Verify the full chip configuration and memory address space by running the automated tests.
+ * Stress test the XBAR structures in the chip.
+* **FPV**
+ * Verify the connectivity of signals (that are excluded from functional DV above) from point A to point B.
+ * Secure verification
+ * Check for leakage of secure data into unsecure locations / paths and vice-versa using the Cadence SPV tool.
+
+## Current status
+* [Design & verification stage]({{< relref "hw" >}})
+ * [HW development stages]({{< relref "doc/project/development_stages.md" >}})
+* [Simulation results](https://reports.opentitan.org/hw/top_earlgrey/dv/latest/results.html)
+
+## Design features
+For detailed information on `top_earlgrey` design features, please see the [Earl Grey Top Level Specification]({{< relref "hw/top_earlgrey/doc" >}}).
+
+## Testbench architecture
+The `top_earlgrey` chip level testbench has been constructed based on the [CIP testbench architecture]({{< relref "hw/dv/sv/cip_lib/doc" >}}).
+
+### Block diagram
+TBD
+
+### Top level testbench
+Top level testbench is located at `hw/ip/top_earlgrey/dv/tb/tb.sv`.
+It instantiates the `top_earlgrey` DUT module `hw/top_earlgrey/rtl/top_earlgrey_asic.sv`.
+In addition, it instantiates the following interfaces, connects them to the DUT and sets their handle into `uvm_config_db`:
+* [Clock and reset interface]({{< relref "hw/dv/sv/common_ifs" >}})
+ * Main clock as well as USB clock
+* [TileLink host interface]({{< relref "hw/dv/sv/tl_agent/README.md" >}})
+ * This is connected to the CPU's data port.
+* [JTAG interface]()
+* SPI interface
+* UART interface
+* SW logger inteface (for boot_rom as well as the test SW)
+* SW test status monitor
+* Backdoor memory interfaces (for ROM, SRAM and the flask banks)
+* Individual control pins:
+ * Bootstrap
+ * JTAG/SPI switch
+ * SRST_N
+
+### Common DV utility components
+The following utilities provide generic helper tasks and functions to perform activities that are common across the project:
+* [dv_utils_pkg]({{< relref "hw/dv/sv/dv_utils/README.md" >}})
+* [csr_utils_pkg]({{< relref "hw/dv/sv/csr_utils/README.md" >}})
+
+### Global types & methods
+All common types and methods defined at the package level can be found in the `chip_env_pkg`.
+Some of them in use are:
+```systemverilog
+[list a few parameters, types & methods; no need to mention all]
+```
+
+### TL_agent
+The full chip testbench instantiates (already handled in CIP base env) the [tl_agent]({{< relref "hw/dv/sv/tl_agent/README.md" >}}) which provides the ability to drive and independently monitor random traffic via TL host interface into CHIP device.
+
+### UART Agent
+[Describe here or add link to its README]
+
+### SPI Agent
+[Describe here or add link to its README]
+
+### JTAG Agent
+[Describe here or add link to its README]
+
+### I2C Agent
+[Describe here or add link to its README]
+
+### USB20 Agent
+[Describe here or add link to its README]
+
+### UVM RAL Model
+The CHIP RAL model is created with the [`ralgen`]({{< relref "hw/dv/tools/ralgen/README.md" >}}) FuseSoC generator script automatically when the simulation is at the build stage.
+
+It can be created manually (separately) by running `make` in the the `hw/` area.
+
+### Reference models
+
+### Testbench configurations
+
+#### Stub CPU mode
+
+#### Bare-metal SW test mode
+
+#### XBAR integration mode
+
+### Stimulus strategy
+#### Test sequences
+All test sequences reside in `hw/ip/chip/dv/env/seq_lib`.
+The `chip_base_vseq` virtual sequence is extended from `cip_base_vseq` and serves as a starting point.
+All test sequences are extended from `chip_base_vseq`.
+It provides commonly used handles, variables, functions and tasks that the test sequences can simple use / call.
+Some of the most commonly used tasks / functions are as follows:
+* task 1:
+* task 2:
+
+#### Functional coverage
+To ensure high quality constrained random stimulus, it is necessary to develop a functional coverage model.
+The following covergroups have been developed to prove that the test intent has been adequately met:
+* cg1:
+* cg2:
+
+### Self-checking strategy
+#### Scoreboard
+The `chip_scoreboard` is primarily used for end to end checking.
+It creates the following analysis ports to retrieve the data monitored by corresponding interface agents:
+* analysis port1:
+* analysis port2:
+<!-- explain inputs monitored, flow of data and outputs checked -->
+
+#### Assertions
+* TLUL assertions: The `tb/chip_bind.sv` binds the `tlul_assert` [assertions]({{< relref "hw/ip/tlul/doc/TlulProtocolChecker.md" >}}) to the IP to ensure TileLink interface protocol compliance.
+* Unknown checks on DUT outputs: The RTL has assertions to ensure all outputs are initialized to known values after coming out of reset.
+* assert prop 1:
+* assert prop 2:
+
+## Building and running tests
+DV simulations for `top_earlgrey` are run with the [`dvsim`]() tool.
+Please take a look at the link for detailed information on the usage, capabilities, features and known issues.
+The basic UART transmit and receive test can be run with the following command:
+```console
+$ ./util/dvsim/dvsim.py hw/top_earlgrey/dv/chip_sim_cfg.hjson -i chip_uart_tx_rx
+```
+For a list of available tests to run, please see the 'Tests' column in the [testplan]({{< relref "#testplan" >}}) below.
+
+## Regressions
+
+### Sanity
+
+### SW access
+
+### Nightly
+
+## Testplan
+{{< testplan "hw/top_earlgrey/data/chip_testplan.hjson" >}}
diff --git a/util/build_docs.py b/util/build_docs.py
index ad3659a..1568045 100755
--- a/util/build_docs.py
+++ b/util/build_docs.py
@@ -96,6 +96,7 @@
"hw/ip/uart/data/uart_testplan.hjson",
"hw/ip/usbdev/data/usbdev_testplan.hjson",
"hw/ip/tlul/data/tlul_testplan.hjson",
+ "hw/top_earlgrey/data/chip_testplan.hjson",
"hw/top_earlgrey/data/standalone_sw_testplan.hjson",
"util/dvsim/testplanner/examples/foo_testplan.hjson",
],