| // 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. | |
| ''' | |
| } | |
| ] | |
| } |