| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 | { | 
 |   name: "flash_ctrl" | 
 |   // TODO: remove the common testplans if not applicable | 
 |   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/shadow_reg_errors_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/tl_device_access_types_testplan.hjson", | 
 |                      "hw/dv/tools/dvsim/testplans/stress_all_with_reset_testplan.hjson", | 
 |                      // TODO: Top-level specific Hjson imported here. This will likely be resolved | 
 |                      // once we move to IPgen flow. | 
 |                      "hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl_sec_cm_testplan.hjson"] | 
 |   testpoints: [ | 
 |     { | 
 |       name: smoke | 
 |       desc: ''' | 
 |             Randomly read, program or erase (page or a bank) a randomized chunk of flash memory. | 
 |             Only the data partition is accessed. No extra features enabled. Flash memory is | 
 |             invalidated and the targeted chunk is initialized with random data for reads and all 1s | 
 |             for writes. Interrupts are not enabled, Completion is ascertained through polling. The | 
 |             success of each operation is verified via backdoor. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["flash_ctrl_smoke"] | 
 |     } | 
 |     { | 
 |       name: smoke_hw | 
 |       desc: ''' | 
 |             Perform host direct read on the single page of Data partition. First Flash memory is | 
 |             initialized with random values and then it is being read directly by Host interface. | 
 |             Finally, backdoor read is used for checking read data. | 
 |             ''' | 
 |       stage: V1 | 
 |       tests: ["flash_ctrl_smoke_hw"] | 
 |     } | 
 |     { | 
 |       name: sw_op | 
 |       desc: ''' | 
 |             Perform flash protocol controller read, program and erase on the single page of one | 
 |             bank within Data partition. Finally perform read on same location in order to test | 
 |             if previous operation was done successfully. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_sw_op"] | 
 |     } | 
 |     { | 
 |       name: host_read_direct | 
 |       desc: ''' | 
 |             Perform back-to-back direct reads via Host in order to test bandwidth of hardware host | 
 |             interface. In addition, perform stalls to test pipeline structure. Enable scramble to | 
 |             test pipeline structure. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_host_dir_rd"] | 
 |     } | 
 |     { | 
 |       name: rma_hw_if | 
 |       desc: ''' | 
 |             Perform RMA entry requests and check afterwards that the  software has no access to | 
 |             the Flash.  After RMA entry, verify that the content of the flash is wiped out. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_hw_rma", "flash_ctrl_hw_rma_reset", "flash_ctrl_lcmgr_intg"] | 
 |     } | 
 |     { | 
 |       name: host_controller_arb | 
 |       desc: ''' | 
 |             Perform operations via the Flash Software Interface, and at the same time invoke a | 
 |             Hardware RMA operation. This verifies the arbitration within the Flash Protocol | 
 |             Controller. The arbiter should allow any outstanding Software operations to complete | 
 |             before the RMA starts. When the RMA completes the RMA FSM remains in its final state | 
 |             until Reset and software access is blocked. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_host_ctrl_arb"] | 
 |     } | 
 |     { | 
 |       name: erase_suspend | 
 |       desc: ''' | 
 |             Perform erase suspend when erase is ongoing and also when erase is not ongoing. | 
 |             Check if request is immediately cleared in case when no erase is ongoing. | 
 |             Check if request is cleared in case when suspend is handled. | 
 |             Read affected bank in order to verify erase suspension feature. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_erase_suspend"] | 
 |     } | 
 |     { | 
 |       name: program_reset | 
 |       desc: ''' | 
 |             Reset controller at every state of programming operation and check | 
 |             if controller doesn't have any residue for the next operation. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_prog_reset"] | 
 |     } | 
 |     { | 
 |       name: full_memory_access | 
 |       desc: ''' | 
 |             Entire memory is accessed by Controller and directly by Host. In addition, Data | 
 |             partitions can be directly read by Software(Flash controller) and hardware hosts, | 
 |             while Info partitions can be read only by the Flash controller. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_full_mem_access"] | 
 |     } | 
 |     { | 
 |       name: rd_buff_eviction | 
 |       desc: ''' | 
 |             Perform following sequences of operations: read/program/read and read/erase/read in | 
 |             order to test read buffer eviction properly. Read should be executed by both Software | 
 |             and Host interface. All combinations should be tested. Covergroup for this hazardous | 
 |             behavior is rd_buff_evict_cg. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_rd_buff_evict"] | 
 |     } | 
 |     { | 
 |       name: rd_buff_eviction_w_ecc | 
 |       desc: ''' | 
 |             Run read eviction test with multiple memory protection configs. | 
 |             Each config should enable read but randomize all other fields | 
 |             including scramble and ecc enable. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_rw_evict", "flash_ctrl_re_evict", "flash_ctrl_rw_evict_all_en"] | 
 |     } | 
 |     { | 
 |       name: host_arb | 
 |       desc: ''' | 
 |             Test arbitration within Flash Physical Controller by reading from both interfaces at | 
 |             the same time. Perform continuously direct read data from host interface and at the | 
 |             same time, perform all operations READ/PROGRAM/ERASE from the flash controller is in | 
 |             progress. Perform parallel operations at addresses of different banks and also on same | 
 |             bank. Expect that operations are successfully executed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_phy_arb"] | 
 |     } | 
 |     { | 
 |       name: host_interleave | 
 |       desc: ''' | 
 |             At same time, perform two read operations and the same time via host and via | 
 |             controller. At same time, perform read operation via host and program | 
 |             operation via controller. Perform mentioned parallel operations at different addresses | 
 |             and on the same address. Expect that operations are successfully | 
 |             executed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_phy_arb"] | 
 |     } | 
 |     { | 
 |       name: memory_protection | 
 |       desc: ''' | 
 |             Perform READ/ PROGRAM/ ERASE operations over protected regions and pages of data and | 
 |             info partitions. Use set and reset values of corresponding read, program and erase | 
 |             enable bits. Test boundary values of regions. Test overlap of regions in which lower | 
 |             region wins arbitration. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_mp_regions"] | 
 |     } | 
 |     { | 
 |       name: fetch_code | 
 |       desc: ''' | 
 |             Verify the Code Fetch Feature. | 
 |             Reads for instructions via the Hardware Interface are allowed if a specific value | 
 |             is written to the EXEC csr. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_fetch_code"] | 
 |     } | 
 |     { | 
 |       name: all_partitions | 
 |       desc: ''' | 
 |             Sanity + both, legal data and info partitions are accessed. In future, support for | 
 |             multiple info partitions may be added - those will be covered as well. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_rand_ops"] | 
 |     } | 
 |     { | 
 |       name: error_mp | 
 |       desc: ''' | 
 |             Perform accesses in order to provoke memory permission errors. Test the Software | 
 |             interface (Erase, Program, Read). Related covergroup is sw_error_cg. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_error_mp"] | 
 |     } | 
 |     { | 
 |       name: error_prog_win | 
 |       desc: ''' | 
 |             Perform accesses in order to provoke the 'program resolution' error. | 
 |             Test via the Software interface. Related covergroup is sw_error_cg. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_error_prog_win"] | 
 |     } | 
 |     { | 
 |       name: error_prog_type | 
 |       desc: ''' | 
 |             Perform accesses in order to provoke the 'program type' error. | 
 |             Test via the Software interface. Related covergroup is sw_error_cg. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_error_prog_type"] | 
 |     } | 
 |     { | 
 |       name: error_read_seed | 
 |       desc: ''' | 
 |             Create sw read error during hw seed read process. | 
 |             Check all errors are properly detected. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_hw_read_seed_err"] | 
 |     } | 
 |     { | 
 |       name: read_write_overflow | 
 |       desc: ''' | 
 |             Send following error transactions with normal traffic and see | 
 |             any catastrophic event happens. | 
 |               - Program flash size longer than 64 bytes. | 
 |                 This wil cause prog_win_err. | 
 |               - Read flash from controller without settting start op. | 
 |               - Issue rd_fifo read more thatn CONTROL.NUM field value. | 
 |                 Both will cause d_error in tlul response. | 
 |             Each transaction is terminated gracefully and should not cause | 
 |             data path lock up. Also error status should be check per each | 
 |             transaction. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_oversize_error"] | 
 |     } | 
 |     { | 
 |       name: flash_ctrl_disable | 
 |       desc: ''' | 
 |             Set flash ctrl disable by hw (lc_escalate_en = On) or | 
 |             sw (flash_ctrl.dis = MuBi4True). And try to access flash ctrl | 
 |             and check the access attempt to be failed. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_disable"] | 
 |     } | 
 |     { | 
 |       name: flash_ctrl_connect | 
 |       desc: ''' | 
 |             Check jtag input / output ports connectivity with lc_nvm_debug_en. | 
 |             Connections are set only when lc_nvm_debug_en = On. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_connect"] | 
 |     } | 
 |     { | 
 |       name: stress_all | 
 |       desc: ''' | 
 |             - combine above sequences in one test to run sequentially, except csr sequence | 
 |             - randomly add reset between each sequence | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_stress_all"] | 
 |     } | 
 |     { | 
 |       name: secret_partition | 
 |       desc: ''' | 
 |             Verify the secret information partitions. Accessibility is controlled by the Life Cycle Controller | 
 |             Seeds are read upon flash controller initialization and sent to the Key Manager, additionally verify | 
 |             that scramble Keys are Read from the OTP and sent into the Flash Ctlr.  Also erify that programmed | 
 |             Secret Partitions retain their values through a Reset Cycle. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_hw_sec_otp", "flash_ctrl_otp_reset"] | 
 |     } | 
 |     { | 
 |       name: isolation_partition | 
 |       desc: ''' | 
 |             Verify the isolated information partitions. Accessablity is controlled by Life | 
 |             Cycle Controller.  Verify Partition can be erase, written and programmed, with | 
 |             HW control, and wipes after an RMA. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_hw_rma"] | 
 |     } | 
 |     { | 
 |       name: interrupts | 
 |       desc: ''' | 
 |             Perform accesses in order to raise all interrupts given in register map. | 
 |             Check behaviour of Interrupt Enable and Status Registers. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_intr_rd", "flash_ctrl_intr_wr", | 
 |               "flash_ctrl_intr_rd_slow_flash", "flash_ctrl_intr_wr_slow_flash"] | 
 |     } | 
 |     { | 
 |       name: invalid_op | 
 |       desc: ''' | 
 |             Send invalid command in order to check that it does not affect memory content. | 
 |             Check that recovery alert is triggered. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_invalid_op"] | 
 |     } | 
 |     { | 
 |       name: mid_op_rst | 
 |       desc: ''' | 
 |             Flash middle operation reset test. Send reset via power ready signal | 
 |             in the middle of operation program, read, erase and erase suspend. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_mid_op_rst"] | 
 |     } | 
 |     { | 
 |       name: double_bit_err | 
 |       desc: ''' | 
 |             Run read / write test and inject double bit error randomly for read transactions -- | 
 |             both direct and controller read. | 
 |             Check op_status.err and err_code.rd_err are asserted for ctrl read and | 
 |             tlul response error for host read. | 
 |             Check fatal alert is asserted for reliability ecc errors (double bits) and | 
 |             integrity ECC errors. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_read_word_sweep_derr", "flash_ctrl_ro_derr", | 
 |               "flash_ctrl_rw_derr", "flash_ctrl_derr_detect", "flash_ctrl_integrity"] | 
 |     } | 
 |     { | 
 |       name: single_bit_err | 
 |       desc: ''' | 
 |             Run read only or read write test with randomly injected single bit error. | 
 |             All single bit error should be corrected and all read data should be | 
 |             matched with expected written value. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_read_word_sweep_serr", | 
 |               "flash_ctrl_ro_serr", "flash_ctrl_rw_serr"] | 
 |     } | 
 |     { | 
 |       name: singlebit_err_counter | 
 |       desc: ''' | 
 |             Run read / write test and inject single bit error randomly for read transactions. - | 
 |             both direct and controller read - Adjust error injection ratio s.t. counter is not | 
 |             saturated. | 
 |             Compare counter values for both bank with expected counter values. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_serr_counter"] | 
 |     } | 
 |     { | 
 |       name: singlebit_err_address | 
 |       desc: ''' | 
 |             Run read / write test and inject a single bit error randomly either direct | 
 |             or controller read. Once error is injected a certain transaction, wait for the | 
 |             transaction to be completed and compare ecc_single_err_addr register with the | 
 |             expected value. Do this for multiple rounds for both banks. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_serr_address"] | 
 |     } | 
 |     { | 
 |       name: scramble | 
 |       desc: ''' | 
 |             Enable scrambling, along with randomized scramble keys. Program a fresh chunk of | 
 |             memory and read back (both, via controller and host) to ensure data integrity. On | 
 |             program, verify via backdoor scrambling was done on the raw data correctly. When | 
 |             reading via host, read the same memory via host multiple times back-to-back and ensure | 
 |             the timing is correct (subsequent reads should be faster). When scrambling is not | 
 |             enabled, ensure that the raw data is written and read back. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_wo", "flash_ctrl_ro", "flash_ctrl_rw", | 
 |               "flash_ctrl_write_word_sweep", "flash_ctrl_read_word_sweep"] | 
 |     } | 
 |     { | 
 |       name: filesystem_support | 
 |       desc: ''' | 
 |             Enable ECC and disable scrambling for all regions. | 
 |             Initialize flash with erased state (FlashMemInitSet). | 
 |             Execute random number of writes without writing the same location twice. | 
 |             Record all write locations(Minimum resolution of location is 8bytes). | 
 |             After that, execute write and read back test for random page and check | 
 |              - If the locations are in the written record, write data should be all 0 and | 
 |                readback data should match with the written data. | 
 |              - If the locations are not in the written record, write data should be random and | 
 |                readback data should match with the written data. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_fs_sup"] | 
 |     } | 
 |     { | 
 |       name: rma_write_process_error | 
 |       desc: ''' | 
 |             Verify error handling process duing the rma wipe process. | 
 |             In normal rma process, inject bit error at the write path | 
 |             (tb.dut.u_eflash.gen_flash_cores[0].u_core.gen_prog_data.u_prog.pack_data). | 
 |             This should make debug_state to flash_ctrl_env_pkg::FlashLcIvalid and | 
 |             fatal error (std_fault_status.lcmgr_err) should be triggered. | 
 |             ''' | 
 |       stage: V2 | 
 |       tests: ["flash_ctrl_rma_err", "flash_ctrl_hw_prog_rma_wipe_err"] | 
 |     } | 
 |     { | 
 |       name: asymmetric_read_path | 
 |       desc: ''' | 
 |             Create 'fast' and 'slow' read path using scramble enable. | 
 |             Send flash read requst over slow path followed by fast path. | 
 |             While return data comes from fast path first but they are expected | 
 |             to be returned in request order. | 
 |             ''' | 
 |       stage: V3 | 
 |       tests: ["flash_ctrl_rd_ooo"] | 
 |     } | 
 |   ] | 
 |  | 
 |   covergroups: [ | 
 |     { | 
 |       name: control_cg | 
 |       desc: ''' | 
 |             Covers that all operations READ/PROGRAM/ERASE/UNKNOWN have been tested. | 
 |             Covers that ERASE operation is performed on a page and on entire bank. | 
 |             Covers data and info partitions selection. | 
 |             All valid combinations of the above will also be crossed. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: erase_susp_cg | 
 |       desc: ''' | 
 |             Covers if request of erase suspension occured. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: msgfifo_level_cg | 
 |       desc: ''' | 
 |             Covers that all possible fifo statuses generate interrupts for operations READ/PROGRAM. | 
 |             Covers both boundary values 0 and 31. Also covers acceptable distributions within | 
 |             ranges. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: rd_buff_evict_cg | 
 |       desc: ''' | 
 |             Covers that all possible combinations for following sequences of operations | 
 |             READ/PROGRAM/READ and READ/ERASE/READ are executed. Software Interface can perform all | 
 |             three operations READ/PROGRAM/ERASE while Host Interface can perform direct READ. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: sw_error_cg | 
 |       desc: ''' | 
 |             Covers following error scenarios given in Flash error code register: | 
 |             - op_err: Undefined operation. | 
 |             - mp_err: Flash access has encountered an access permission error. | 
 |             - rd_err: Flash read has an uncorrectable data error. | 
 |             - prog_err: Flash program has an error. | 
 |             - prog_win_err: Flash program has a window resolution error. | 
 |             - prog_type_err: Flash program selected unavailable type. | 
 |             - update_err: A shadow register encountered an update error. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: eviction_cg | 
 |       desc: ''' | 
 |             Covers eviction with mp_region_cfgs for data and info regions. | 
 |             Sample all 4 rd_buf status. | 
 |             When each buffer hazard is set, capture the address stored in the buffer. | 
 |             Then search from tb data base to see which region the address belong to. | 
 |             After that record the config value (scrambe_en and ecc_en) of the region. | 
 |             Use cross over buffer index, the operation to cause the eviction and | 
 |             the region config values. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: fetch_code_cg | 
 |       desc: ''' | 
 |             Covers whether dut received valid or invalid key value from ral.exec register. | 
 |             Cross with tlul.instr_types. | 
 |             ''' | 
 |     } | 
 |     { | 
 |       name: rma_init_cg | 
 |       desc: ''' | 
 |             Cover rma operation is executed regardless of when flash_init started. | 
 |             flash_ctrl_hw_rma runs rma operation and flash init in parallel thread. | 
 |             In this test, sample rma state when flash init starts. | 
 |             If rma state is StRmaIdle, which means rma is not started. So it confirms | 
 |             rma start after flash init start. | 
 |             If rma state is [StRmaPageSel:StRmaInvalid], which mean rma is on going. | 
 |             So it confirms rma start before flash init start. | 
 |             ''' | 
 |     } | 
 |   ] | 
 | } |