| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 | { | 
 |   name: "otbn" | 
 |   import_testplans: ["hw/dv/tools/dvsim/testplans/csr_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/mem_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/alert_test_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/intr_test_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/stress_all_with_reset_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/passthru_mem_intg_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/sec_cm_fsm_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/sec_cm_count_testplan.hjson", | 
 |                      "otbn_sec_cm_testplan.hjson"] | 
 |   testpoints: [ | 
 |     { | 
 |       name: smoke | 
 |       desc: ''' | 
 |             Smoke test, running a single fixed binary | 
 |  | 
 |             This runs the binary from otbn/dv/smoke/smoke_test.s, which is | 
 |             designed to check most of the implemented instructions. The | 
 |             unchanging binary should mean this basic test is particularly | 
 |             appropriate for CI. | 
 |  | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["otbn_smoke"] | 
 |     } | 
 |     { | 
 |       name: single_binary | 
 |       desc: ''' | 
 |             Run a single randomly-chosen binary | 
 |  | 
 |             This test drives the main bulk of OTBN testing. It picks a random | 
 |             binary from a pre-generated set and runs it, comparing against the | 
 |             model. We'll run this with a large number of seeds and use | 
 |             functional coverage to track when verification of the internals of | 
 |             the core is done. | 
 |  | 
 |             Sometimes enable the "done" interrupt to check that it and the | 
 |             error interrupt work correctly. | 
 |  | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["otbn_single"] | 
 |     } | 
 |  | 
 |     { | 
 |       name: reset_recovery | 
 |       desc: ''' | 
 |             Run two binaries, resetting the first at an arbitrary time | 
 |  | 
 |             Running another binary after a sudden and unexpected reset via the | 
 |             rst_ni signal will check that all state is properly re-initialized | 
 |             after a reset. We'd expect X-propagation checks to catch most | 
 |             problems like this, but an explicit reset sequence also adds the | 
 |             relevant FSM/toggle coverage. | 
 |  | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_reset"] | 
 |     } | 
 |  | 
 |     { | 
 |       name: multi_error | 
 |       desc: ''' | 
 |             Run instructions that cause multiple SW errors in a cycle | 
 |  | 
 |             These are directed tests, designed to exhaustively trigger all the | 
 |             cases where a single instruction execution can fail for more than | 
 |             one reason. Since each of these instructions causes the operation | 
 |             to fail, we have to run an OTBN operation for each. To do this, we | 
 |             compile and run all the binaries in a collection of ISS unit tests. | 
 |             We have coverage points to ensure we see every event we expect. | 
 |        ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_multi_err"] | 
 |     } | 
 |  | 
 |     { | 
 |       name: mem_integrity | 
 |       desc: ''' | 
 |             Inject ECC errors into DMEM and IMEM and expect an alert | 
 |             ''' | 
 |       stage: V2S | 
 |       tests: ["otbn_imem_err", "otbn_dmem_err"] | 
 |     } | 
 |     { | 
 |       name: internal_integrity | 
 |       desc: ''' | 
 |         Corrupt internal state and expect an alert | 
 |       ''' | 
 |       stage: V2S | 
 |       tests: ["otbn_alu_bignum_mod_err", | 
 |               "otbn_controller_ispr_rdata_err", | 
 |               "otbn_mac_bignum_acc_err", | 
 |               "otbn_urnd_err"] | 
 |     } | 
 |     { | 
 |       name: back_to_back | 
 |       desc: ''' | 
 |             Run sequences back-to-back | 
 |  | 
 |             This runs several sequences back-to-back, without resets between | 
 |             them. This should catch initialisation problems where not all state | 
 |             is cleared between programs when there's no reset. | 
 |  | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_multi"] | 
 |     } | 
 |     { | 
 |       name: stress_all | 
 |       desc: ''' | 
 |             Run assorted sequences back-to-back. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_stress_all"] | 
 |     } | 
 |     { | 
 |       name: lc_escalation | 
 |       desc: ''' | 
 |             Trigger the life cycle escalation input. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_escalate"] | 
 |     } | 
 |     { | 
 |       name: zero_state_err_urnd | 
 |       desc: ''' | 
 |               Trigger the "state is zero" error in URND, | 
 |               Check that fatal error is asserted. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_zero_state_err_urnd"] | 
 |     } | 
 |     { | 
 |       name: illegal_bus_access | 
 |       desc: ''' | 
 |             Trigger reads and writes to both DMEM and IMEM and expect a fatal alert for | 
 |             ILLEGAL_BUS_ACCESS. Check that *mem_rdata_bus pins are at 0 when reads are done | 
 |             ''' | 
 |       stage: V2S | 
 |       tests: ["otbn_illegal_mem_acc"] | 
 |     } | 
 |     { | 
 |       name: sw_errs_fatal_chk | 
 |       desc: ''' | 
 |               Set ctrl.software_errs_fatal. | 
 |               When set software errors produce fatal errors, rather than recoverable errors. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["otbn_sw_errs_fatal_chk"] | 
 |     } | 
 |     { | 
 |       name: otbn_mem_gnt_acc_err | 
 |       desc: ''' | 
 |               Trigger a fault to cause the IMEM/DMEM grant signal to be false when req is asserted. | 
 |               This in turn should cause dmem_missed_gnt/imem_missed_gnt to get asserted resulting | 
 |               in a fatal alert (a bad_internal_state fatal error). | 
 |             ''' | 
 |       stage: V2S | 
 |       tests: ["otbn_mem_gnt_acc_err"] | 
 |     } | 
 |   ] | 
 | } |