[flash_ctrl,dv] regression fix following regression failures are fixed - flash_ctrl_mp_regions add local function to access local region_cfg db - flash_ctrl_derr_detect reset tb mem model (for last-mile-sb) before multiple test runs increase txn number to guarantee at least one double bit error - flash_ctrl_mid_op_rst remove diable fork having csr thread - Other misc clean up Signed-off-by: Jaedon Kim <jdonjdon@google.com>
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_connect_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_connect_vseq.sv index 8e29c63..e31e154 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_connect_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_connect_vseq.sv
@@ -47,9 +47,9 @@ mystr = {dut_path, ".cio_tdo_o"}; `DV_CHECK(uvm_hdl_read(mystr, jtag_dst_rsp.tdo)) - // Make non-declared port don't care.x - jtag_dst_req.trst_n = jtag_src_req.trst_n; - jtag_dst_rsp.tdo_oe = jtag_src_rsp.tdo_oe; + // Make non-declared port don't care. + jtag_dst_req.trst_n = jtag_src_req.trst_n & lc_nvm_debug_en; + jtag_dst_rsp.tdo_oe = jtag_src_rsp.tdo_oe & lc_nvm_debug_en; `DV_CHECK_EQ(jtag_dst_req, jtag_src_req & {4{lc_nvm_debug_en}}) `DV_CHECK_EQ(jtag_dst_rsp, jtag_src_rsp & {2{lc_nvm_debug_en}})
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_derr_detect_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_derr_detect_vseq.sv index a544e8c..40c33f2 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_derr_detect_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_derr_detect_vseq.sv
@@ -21,7 +21,7 @@ fork begin - repeat(20) begin + repeat(40) begin `DV_CHECK_RANDOMIZE_FATAL(this) ctrl = rand_op; bank = rand_op.addr[OTFBankId]; @@ -37,7 +37,7 @@ end end begin - for (int i = 0; i < 3; ++i) begin + for (int i = 0; i < 4; ++i) begin fork send_rand_host_rd(); join_none
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_intr_rd_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_intr_rd_vseq.sv index 8f78f1c..72a118d 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_intr_rd_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_intr_rd_vseq.sv
@@ -4,7 +4,7 @@ // Send read only traffic with interrup mode. // No protection is applied. -class flash_ctrl_intr_rd_vseq extends flash_ctrl_otf_base_vseq; +class flash_ctrl_intr_rd_vseq extends flash_ctrl_legacy_base_vseq; `uvm_object_utils(flash_ctrl_intr_rd_vseq) `uvm_object_new
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mid_op_rst_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mid_op_rst_vseq.sv index 1e45e80..16f2877 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mid_op_rst_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mid_op_rst_vseq.sv
@@ -160,8 +160,7 @@ csr_wr(.ptr(ral.erase_suspend), .value(1)); low_ready_h(); end - join_any; - disable fork; + join end : isolation_fork_erase_suspend join wait_cfg_prog_rd(); @@ -186,11 +185,10 @@ cfg.clk_rst_vif.wait_clks(19); low_ready_h(); end - join_any; - disable fork; + join end : isolation_fork_read join - wait_cfg_prog_rd(); + wait_cfg_prog_rd(); endtask : body
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv index 8a521cf..8a15695 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv
@@ -4,6 +4,7 @@ // Memory protect test. Overlapping regions with randomization. // Send one op among program, read and erase (page) in each trans round. +// This sequence uses local mp_region db. Don't use cfg.get_region() class flash_ctrl_mp_regions_vseq extends flash_ctrl_base_vseq; `uvm_object_utils(flash_ctrl_mp_regions_vseq) @@ -257,7 +258,7 @@ for (int i = 0; i < size; i++) begin if (flash_op.partition == FlashPartData) begin page = cfg.addr2page(flash_op.addr); - my_region = cfg.get_region(page); + my_region = get_region_from_page(page); end else begin page = cfg.addr2page(flash_op.addr[OTFBankId-1:0]); my_region = cfg.get_region_from_info(mp_info_pages[bank][flash_op.partition>>1][page]); @@ -269,7 +270,7 @@ if (tail) begin if (flash_op.partition == FlashPartData) begin page = cfg.addr2page(flash_op.addr); - my_region = cfg.get_region(page); + my_region = get_region_from_page(page); end else begin page = cfg.addr2page(flash_op.otf_addr); my_region = cfg.get_region_from_info(mp_info_pages[bank][flash_op.partition>>1][page]); @@ -281,7 +282,7 @@ end else begin // if (flash_op.op == FlashOpRead) if (flash_op.partition == FlashPartData) begin page = cfg.addr2page(flash_op.addr); - my_region = cfg.get_region(page); + my_region = get_region_from_page(page); end else begin page = cfg.addr2page(flash_op.addr[OTFBankId-1:0]); my_region = cfg.get_region_from_info(mp_info_pages[bank][flash_op.partition>>1][page]); @@ -290,8 +291,7 @@ end if(illegal_trans) begin - cfg.scb_h.exp_alert["recov_err"] = 1; - cfg.scb_h.alert_chk_max_delay["recov_err"] = 2000; // cycles + set_otf_exp_alert("recov_err"); end `uvm_info("do_mp_reg", $sformatf("trans:%0d page:%x region:%0d illegal_trans:%0d", @@ -391,4 +391,19 @@ flash_ctrl_bank_erase_cfg(.bank_erase_en(bank_erase_en)); endtask // configure_flash_protection + function flash_mp_region_cfg_t get_region_from_page(int page, bit dis = 1); + flash_mp_region_cfg_t my_region; + if (cfg.p2r_map[page] == 8) begin + my_region = cfg.default_region_cfg; + end else begin + my_region = this.mp_regions[cfg.p2r_map[page]]; + if (my_region.en != MuBi4True) my_region = cfg.default_region_cfg; + end + if (dis) begin + `uvm_info("get_region_from_page", $sformatf("page:%0d --> region:%0d", + page, cfg.p2r_map[page]), UVM_MEDIUM) + end + return my_region; + endfunction // get_region_from_page + endclass : flash_ctrl_mp_regions_vseq
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_otf_base_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_otf_base_vseq.sv index ca65863..94c5f18 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_otf_base_vseq.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_otf_base_vseq.sv
@@ -127,9 +127,9 @@ init_p2r_map(); `uvm_info("cfg_summary", - $sformatf({"flash_init:%s ecc_mode %0d allow_spec_info_acc:%3b", + $sformatf({"flash_init:%s ecc_mode %s allow_spec_info_acc:%3b", " scr_ecc_cfg:%s always_read:%0d"}, - flash_init.name, cfg.ecc_mode, allow_spec_info_acc, + flash_init.name, cfg.ecc_mode.name, allow_spec_info_acc, scr_ecc_cfg.name, cfg.en_always_read), UVM_MEDIUM) @@ -1229,6 +1229,12 @@ cfg.otf_read_entry.hash.delete(); foreach (cfg.otf_read_entry.prv_read[i]) cfg.otf_read_entry.prv_read[i] = '{}; cfg.otf_scb_h.clear_fifos(); + + for (int i = 0; i < NumBanks; i++) begin + cfg.otf_scb_h.data_mem[i].delete(); + foreach (cfg.otf_scb_h.info_mem[i][j]) + cfg.otf_scb_h.info_mem[i][j].delete(); + end endtask // otf_tb_clean_up // Populate cfg.mp_info with default_info_page_cfg except scr, ecc.
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_vseq_list.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_vseq_list.sv index 99b9329..be8d2c4 100644 --- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_vseq_list.sv +++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_vseq_list.sv
@@ -25,8 +25,8 @@ `include "flash_ctrl_error_mp_vseq.sv" `include "flash_ctrl_invalid_op_vseq.sv" `include "flash_ctrl_mid_op_rst_vseq.sv" -`include "flash_ctrl_stress_all_vseq.sv" `include "flash_ctrl_otf_base_vseq.sv" +`include "flash_ctrl_legacy_base_vseq.sv" `include "flash_ctrl_wo_vseq.sv" `include "flash_ctrl_ro_vseq.sv" `include "flash_ctrl_rw_vseq.sv" @@ -43,8 +43,8 @@ `include "flash_ctrl_intr_rd_vseq.sv" `include "flash_ctrl_intr_wr_vseq.sv" `include "flash_ctrl_prog_reset_vseq.sv" -`include "flash_ctrl_legacy_base_vseq.sv" `include "flash_ctrl_rw_evict_vseq.sv" `include "flash_ctrl_re_evict_vseq.sv" `include "flash_ctrl_oversize_error_vseq.sv" `include "flash_ctrl_connect_vseq.sv" +`include "flash_ctrl_stress_all_vseq.sv"
diff --git a/hw/ip/flash_ctrl/dv/flash_ctrl_base_sim_cfg.hjson b/hw/ip/flash_ctrl/dv/flash_ctrl_base_sim_cfg.hjson index ad69751..38047bb 100644 --- a/hw/ip/flash_ctrl/dv/flash_ctrl_base_sim_cfg.hjson +++ b/hw/ip/flash_ctrl/dv/flash_ctrl_base_sim_cfg.hjson
@@ -45,15 +45,10 @@ } ] - build_modes: [] - // Add additional tops for simulation. sim_tops: ["flash_ctrl_bind","flash_ctrl_cov_bind", "sec_cm_prim_onehot_check_bind", "sec_cm_prim_count_bind", "sec_cm_prim_sparse_fsm_flop_bind"] - // Flash Ctrl coverage exclusion. - // xcelium_cov_refine_files: ["{proj_root}/hw/ip/flash_ctrl/dv/cov/flash_ctrl_cov.vRefine"] - // Default iterations for all tests - each test entry can override this. reseed: 50 @@ -289,13 +284,13 @@ { name: flash_ctrl_intr_rd uvm_test_seq: flash_ctrl_intr_rd_vseq - run_opts: ["+scb_otf_en=1"] + run_opts: ["+scb_otf_en=1", "+ecc_mode=1", "+en_always_read=1"] reseed: 40 } { name: flash_ctrl_intr_wr uvm_test_seq: flash_ctrl_intr_wr_vseq - run_opts: ["+scb_otf_en=1", "+test_timeout_ns=500_000_000"] + run_opts: ["+scb_otf_en=1", "+ecc_mode=1", "+test_timeout_ns=500_000_000"] reseed: 10 } {