| .. _testplan: |
| |
| .. todo:: |
| |
| Add detail about security hardening verification. |
| |
| .. note:: |
| |
| This testplan is a work in progress still being implemented so this document may not match the implemented verification in the repository. |
| |
| Test Plan |
| ========= |
| |
| Goals |
| ----- |
| |
| * Verify compliance with all the RISC-V specifications Ibex supports. |
| * Verify Ibex's security hardening features. |
| * Ensure correct functionality is maintained across all possible behaviours of external interfaces (interrupts, memory responses, debug requests etc). |
| * Hit all functional coverage points, described in :ref:`coverage-plan`. |
| |
| Testbench Architecture |
| ---------------------- |
| |
| .. figure:: images/tb2.svg |
| :alt: Testbench Architecture |
| |
| Architecture of the UVM testbench for Ibex core |
| |
| Ibex utilises a co-simulation checking approach described in detail in :ref:`cosim`. |
| With the co-simulation system all instructions Ibex executes and all external events such as an interrupts or memory errors are fed to a golden model. |
| The results of every instruction execution and every memory access are crossed checked against the golden model with any mismatches resulting in a test failure. |
| The aim is to check all possible externally observable behaviours of ``ibex_top`` against the golden model. |
| The golden model used is the `Spike RISC-V ISS <https://github.com/riscv-software-src/riscv-isa-sim>`_. |
| |
| The testbench uses UVM. |
| It consists of 3 agents: |
| |
| Co-simulation Agent: |
| This has multiple monitors. |
| One monitors the RVFI interface which provides details of retired instructions. |
| The other monitors relate to fetched instructions and instruction memory errors; more details are provided in :ref:`coverage-plan`. |
| Additionally it connects to the monitor of the Memory Interface Agent for the instruction and data side via analysis ports. |
| The monitored transactions are used by a scoreboard to provide information to the co-simulation system allowing it to step the golden model and check its execution and memory activity against Ibex's behaviour. |
| |
| Memory Interface Agent |
| This provides a driver and a monitor for the :ref:`Ibex Memory Interface Protocol<lsu-protocol>`. |
| The driver provides fully randomised and configurable timings for responses and randomisation of error responses. |
| Two agents are instantiated; one for the data memory interface the other for the instruction memory interface. |
| Read data for memory responses is provided from a backing memory; write requests update the contents of the backing memory. |
| This is separate from the memory used by the golden model in the co-simulation agent. |
| The contents of these two memories will be identical unless there is a mismatch resulting in a failure. |
| The backing memory is held in a memory model as a separate UVM component. |
| The two agents use the same backing memory so they have a coherent view of memory. |
| |
| IRQ Agent |
| This provides a driver and a monitor for the IRQ interface. |
| It provides randomised interrupt stimulus to Ibex when a test requests it. |
| Constraints can be used to control types of interrupts generated (e.g. NMI or not) and whether multiple interrupts should be raised together. |
| |
| Debug and reset signals are a single wire each so do not have a dedicated agent. |
| Instead any sequence that wishes to use them will directly manipulate them via a virtual interface |
| |
| The testbench instantiates the agents described above along with the memory model used by both the data and instruction side memory agents. |
| A test consists of executing a pre-built binary (which is loaded into the memory model at the start of the test via backdoor accesses) along with configuring agents to provide appropriate stimulus for the test. |
| Some tests may use the agents to generate stimulus at particular times (e.g. interrupts). |
| A test may perform additional checking on top of the co-simulation golden model comparison where appropriate (e.g. ensuring a raised interrupt has caused an exception). |
| |
| Stimulus Strategy |
| ----------------- |
| |
| Stimulus falls into two categories: |
| |
| * Instructions to execute: These are generated by the `RISC-V DV random instruction <https://github.com/google/riscv-dv>`_ generator and provided to the testbench via a raw binary file. |
| * Activity on external interfaces. |
| |
| Instructions are generated ahead of time so the test has no control over them at run time. |
| All external interfaces have their stimulus generated at run time so can be controlled by the test. |
| It is the responsibility of the regression run environment to ensure generated instructions are matched with appropriate tests (e.g. ensuring an exception handler is present where interrupts are expected). |
| |
| Stimulus generation will use a coverage based approach. |
| Stimulus is developed based upon the :ref:`coverage-plan`. |
| Where coverage is not being hit stimulus will be added to hit it. |
| |
| Tests |
| ----- |
| |
| As with stimulus, test sequence development uses a coverage based approach. |
| Tests will be added such that all coverage in the :ref:`coverage-plan` can be hit. |
| Not all the details of specific tests will be documented here. |
| The test list (`dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml <https://github.com/lowRISC/ibex/blob/master/dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml>`_), provides an exhaustive list of all tests along with a brief description of what the test does. |
| |
| A test will execute a binary whilst running zero or more sequences that provide stimulus to external interfaces of ``ibex_top``. |
| As the memory interfaces are all driven by Ibex, with any testbench generated activity in response to a request from Ibex, they do not require explicit sequences run by the test. |
| Instead the test can configure the randomisation of memory delays as it wishes. |
| Memory errors can be configured to always occur in statically defined areas of the memory map or a sequence can be used to inject them via the memory interface agent. |
| |
| The following sequences are available for tests to use. |
| Each sequence is derived from a base sequence which provides controls to repeat the sequence at fixed or random internals, forever or after a random number of repeats. |
| Full details can be found in `dv/uvm/core_ibex/tests/core_ibex_seq_lib.sv <https://github.com/lowRISC/ibex/blob/master/dv/uvm/core_ibex/tests/core_ibex_seq_lib.sv>`_. |
| |
| * ``irq_raise_seq`` - Raises one or more interrupts. |
| The testbench binary can write to a special memory location to acknowledge the interrupt and cause it to drop. |
| Alternatively the testbench can drop it after a given amount of time. |
| * ``debug_seq`` - Raises the external debug request. |
| The testbench binary can write to a special memory location to acknowledge the request and cause it to drop. |
| Alternatively the testbench can drop it after a given amount of time. |
| * ``mem_error_seq`` - Injects a memory error in either the instruction side or data side, so the next access results in an error response. |
| * ``reset_seq`` - Resets the core. |