[dv/common] common task to clear intr state
Task to clear interrupt status if read data is non zero
diff --git a/hw/dv/sv/cip_lib/cip_base_vseq.sv b/hw/dv/sv/cip_lib/cip_base_vseq.sv
index 5460ec4..b1125d1 100644
--- a/hw/dv/sv/cip_lib/cip_base_vseq.sv
+++ b/hw/dv/sv/cip_lib/cip_base_vseq.sv
@@ -10,6 +10,8 @@
`uvm_object_param_utils(cip_base_vseq #(RAL_T, CFG_T, COV_T, VIRTUAL_SEQUENCER_T))
`uvm_object_new
+ // knobs to disable post_start clear interrupt routine
+ bit do_clear_all_interrupts = 1'b1;
task pre_start();
super.pre_start();
@@ -21,6 +23,8 @@
task post_start();
super.post_start();
+ void'($value$plusargs("do_clear_all_interrupts=%0b", do_clear_all_interrupts));
+ if (do_clear_all_interrupts) clear_all_interrupts();
endtask
// tl_access task: does a single TL_W-bit write or read transaction to the specified address
@@ -242,4 +246,33 @@
end
endtask
+ // Task to clear register intr status bits
+ virtual task clear_all_interrupts();
+ uvm_reg all_csrs[$];
+ dv_base_reg csr;
+ bit [TL_DW-1:0] data;
+ bit [TL_DW-1:0] num_used_bits;
+ ral.get_registers(all_csrs);
+ foreach (all_csrs[i]) begin
+ string csr_name = all_csrs[i].get_name();
+ if (!uvm_re_match("intr_state*", csr_name)) begin
+ csr = get_interrupt_csr(csr_name);
+ csr_rd(.ptr(csr), .value(data));
+ if (data != 0) begin
+ `uvm_info(`gtn, $sformatf("Clearing %0s", csr.get_name()), UVM_HIGH)
+ csr_wr(.csr(csr), .value(data));
+ csr_rd(.ptr(csr), .value(data));
+ `DV_CHECK_EQ(data, 0)
+ end
+ // check interrupt pins
+ for (int j = 0; j < csr.get_n_used_bits(); j++) begin
+ bit act_intr_pin_val = cfg.intr_vif.sample_pin(j + num_used_bits);
+ `DV_CHECK_CASE_EQ(act_intr_pin_val, 0)
+ end
+ num_used_bits += csr.get_n_used_bits();
+ end
+ end
+ all_csrs.delete();
+ endtask
+
endclass