Change double_fault detector to on by default, fatal error if triggered

Add a plusargs "+is_double_fault_detected_fatal" to the top-level cfg,
which is set to 1 by default.

Set the default for the "+enable_double_fault_detector" to 1.
This commit is contained in:
Harry Callahan 2022-10-14 19:19:38 +01:00
parent b214fa1c72
commit bece44f4d6
4 changed files with 17 additions and 7 deletions

View file

@ -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));

View file

@ -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);

View file

@ -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

View file

@ -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);