[dv/flash] fix erase_suspend test Signed-off-by: Eitan Shapira <eitanshapira89@gmail.com>
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv index 429b277..381b766 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv
@@ -13,14 +13,11 @@ // Configure sequence knobs to tailor it to smoke seq. virtual function void configure_vseq(); // number of transactions - cfg.seq_cfg.max_num_trans = 6; + cfg.seq_cfg.max_num_trans = 15; // no overlap mp regions cfg.seq_cfg.allow_mp_region_overlap = 0; - // equal chance for bank and page erase - cfg.seq_cfg.op_erase_type_bank_pc = 20; - // enable scramble cfg.seq_cfg.mp_region_scramble_en_pc = 50; cfg.seq_cfg.default_region_scramble_en_pc = 50; @@ -189,6 +186,11 @@ `DV_CHECK_RANDOMIZE_FATAL(this) reset_flash(); do_erase(); + // Check recovery by initiating an additional erase to the affected page and backdoor + // verify it. + // After an erase is suspended, the page must be erased before any other transaction can be + // initiated to the selected page. + check_recovery(); end endtask : body @@ -238,24 +240,13 @@ // 2. Scneario - Erase is in progress `uvm_info(`gfn, $sformatf("2. Scenario - Erase is in progress"), UVM_HIGH) - fork - begin : isolation_fork - fork - begin // erase data - `uvm_info(`gfn, $sformatf("FLASH OP ERASE START OP: %0p", flash_op), UVM_HIGH) - flash_ctrl_start_op(flash_op); - wait_flash_op_done(.timeout_ns(cfg.seq_cfg.erase_timeout_ns)); - end - begin // erase suspend while erase data is in progress - `uvm_info(`gfn, $sformatf("START COUNTING BEFORE ES REQ"), UVM_HIGH) - cfg.clk_rst_vif.wait_clks($urandom_range(50, 100)); - csr_wr(.ptr(ral.erase_suspend), .value(1)); - `uvm_info(`gfn, $sformatf("ERASE SUSPEND REQUESTED"), UVM_HIGH) - end - join_any; - disable fork; - end : isolation_fork - join + `uvm_info(`gfn, $sformatf("FLASH OP ERASE START OP: %0p", flash_op), UVM_HIGH) + flash_ctrl_start_op(flash_op); + + `uvm_info(`gfn, $sformatf("START COUNTING BEFORE ES REQ"), UVM_HIGH) + cfg.clk_rst_vif.wait_clks($urandom_range(50, 100)); + csr_wr(.ptr(ral.erase_suspend), .value(1)); + `uvm_info(`gfn, $sformatf("ERASE SUSPEND REQUESTED"), UVM_HIGH) // WAITING THAT ERASE SUSPEND REQ IS DONE AND REQ RETURNED TO ZERO `DV_SPINWAIT(do begin @@ -263,20 +254,32 @@ `uvm_info(`gfn, $sformatf("ERASE SUSPEND REQ: %0p", data), UVM_HIGH) end while (data == 1);, "ERASE SUSPEND TIMEOUT OCCURED!", cfg.seq_cfg.erase_timeout_ns) - cfg.flash_mem_bkdr_read(flash_op, flash_rd_data); - - foreach (flash_rd_data[i]) begin - `uvm_info(`gfn, $sformatf("FLASH RD DATA: %0h", flash_rd_data[i]), UVM_HIGH) - // first 30 data are erased - if (i <= 30) begin - `DV_CHECK_EQ(flash_rd_data[i], ALL_ONES) - end - // last 50 data are not erased - if ((flash_rd_data.size()-i) <= 50) begin - `DV_CHECK_NE(flash_rd_data[i], ALL_ONES) - end - end + wait_flash_op_done(.timeout_ns(cfg.seq_cfg.erase_timeout_ns)); endtask : do_erase + // Task to run another erase on the page in which the erase-suspend done and check it complete + // successfully. + // After an erase is suspended, the page must be erased before any other transaction can be + // initiated to the selected page. + task check_recovery(); + // Flash ctrl operation data queue - used for programing or reading the flash. + data_q_t flash_op_data; + // Expected data. + data_q_t exp_data; + + `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(flash_op_data, flash_op_data.size() == 0;) + + cfg.clk_rst_vif.wait_clks($urandom_range(15, 30)); + + `uvm_info(`gfn, $sformatf("Starting flash_ctrl op: %p", flash_op), UVM_LOW) + flash_ctrl_start_op(flash_op); + exp_data = cfg.calculate_expected_data(flash_op, flash_op_data); + + wait_flash_op_done(.timeout_ns(cfg.seq_cfg.erase_timeout_ns)); + cfg.flash_mem_bkdr_erase_check(flash_op, exp_data); + + + endtask : check_recovery + endclass : flash_ctrl_erase_suspend_vseq