[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