diff --git a/dv/uvm/core_ibex/env/core_ibex_env_cfg.sv b/dv/uvm/core_ibex/env/core_ibex_env_cfg.sv index 681e9607..a717c8a7 100644 --- a/dv/uvm/core_ibex/env/core_ibex_env_cfg.sv +++ b/dv/uvm/core_ibex/env/core_ibex_env_cfg.sv @@ -21,12 +21,16 @@ class core_ibex_env_cfg extends uvm_object; rand scrambling_key_agent_cfg scrambling_key_cfg; // Double-Fault detection in scoreboard - bit enable_double_fault_detector = 0; + bit enable_double_fault_detector = 1; int unsigned double_fault_threshold_consecutive = 100; int unsigned double_fault_threshold_total = 1000; + // If '1', reaching either threshold fatally ends the test. + // If '0', we end the test with a pass. + bit is_double_fault_detected_fatal = 1; `uvm_object_utils_begin(core_ibex_env_cfg) `uvm_field_int(enable_double_fault_detector, UVM_DEFAULT) + `uvm_field_int(is_double_fault_detected_fatal, UVM_DEFAULT) `uvm_field_int(enable_irq_single_seq, UVM_DEFAULT) `uvm_field_int(enable_irq_multiple_seq, UVM_DEFAULT) `uvm_field_int(enable_irq_nmi_seq, UVM_DEFAULT) @@ -43,6 +47,7 @@ class core_ibex_env_cfg extends uvm_object; function new(string name = ""); super.new(name); void'($value$plusargs("enable_double_fault_detector=%0d", enable_double_fault_detector)); + void'($value$plusargs("is_double_fault_detected_fatal=%0d", is_double_fault_detected_fatal)); void'($value$plusargs("enable_irq_single_seq=%0d", enable_irq_single_seq)); void'($value$plusargs("enable_irq_multiple_seq=%0d", enable_irq_multiple_seq)); void'($value$plusargs("enable_irq_nmi_seq=%0d", enable_irq_nmi_seq)); diff --git a/dv/uvm/core_ibex/env/core_ibex_scoreboard.sv b/dv/uvm/core_ibex/env/core_ibex_scoreboard.sv index 36157a44..8eb3fa11 100644 --- a/dv/uvm/core_ibex/env/core_ibex_scoreboard.sv +++ b/dv/uvm/core_ibex/env/core_ibex_scoreboard.sv @@ -58,7 +58,6 @@ class core_ibex_scoreboard extends uvm_scoreboard; double_fault_cnt_consecutive = 0; end - // Create an event if either counter reaches its threshold value, then reset the counter. if (double_fault_cnt_consecutive == cfg.double_fault_threshold_consecutive) begin fault_threshold_consecutive_reached.trigger(); @@ -71,8 +70,12 @@ class core_ibex_scoreboard extends uvm_scoreboard; end end - // Latch a signal to show that we have seen a double_fault. - // The pulse may be receieved sometime before the rvfi_seq_item. + // Latch the 'double_fault_seen_o' signal to catch the fault. + // The single pulse may be receieved sometime before the rvfi_seq_item + // corresponding to the faulting instruction is generated. Hence we + // latch that pulse when it is seen, and then reset above when the + // seq_item arrives. + // https://github.com/lowRISC/ibex/pull/1848#discussion_r995903762 begin forever begin @(posedge cfg.ibex_dut_vif.double_fault_seen); diff --git a/dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml b/dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml index 16b3b7ba..4d126337 100644 --- a/dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml +++ b/dv/uvm/core_ibex/riscv_dv_extension/testlist.yaml @@ -744,9 +744,7 @@ +instr_cnt=6000 +pmp_max_offset=00024000 +pmp_randomize=1 - +pmp_allow_illegal_tor=1 - sim_opts: > - +enable_double_fault_detector=1 + +pmp_allow_addr_overlap=1 rtl_test: core_ibex_base_test rtl_params: PMPEnable: 1 diff --git a/dv/uvm/core_ibex/tests/core_ibex_base_test.sv b/dv/uvm/core_ibex/tests/core_ibex_base_test.sv index 5a322514..358001b9 100644 --- a/dv/uvm/core_ibex/tests/core_ibex_base_test.sv +++ b/dv/uvm/core_ibex/tests/core_ibex_base_test.sv @@ -236,6 +236,10 @@ class core_ibex_base_test extends uvm_test; begin if (cfg.enable_double_fault_detector) begin env.scoreboard.dfd_wait_for_pass_events(); + if (cfg.is_double_fault_detected_fatal) begin + `uvm_fatal(`gfn, "Fatal threshold for double_fault detector reached.") + end + // If we get here, join this fork to end the test gracefully. `uvm_info(`gfn, "Test done due to double_fault detector.", UVM_LOW) end else begin wait (test_done == 1'b1);