[dv/sysrst_ctrl] Fix low power test failure

The ulp test failure is reported in issue #17238. As explained in the
discussion, I think the failure is a testbench issue.
The test did not set to 0 long enough to pass the debounce timer. So DUT
combined both request and triggers unexpected wake up pins.

Signed-off-by: Cindy Chen <chencindy@opentitan.org>
diff --git a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_ultra_low_pwr_vseq.sv b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_ultra_low_pwr_vseq.sv
index 6d04414..d95eb9d 100644
--- a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_ultra_low_pwr_vseq.sv
+++ b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_ultra_low_pwr_vseq.sv
@@ -88,7 +88,6 @@
      `uvm_info(`gfn, "Starting the body from ultra_low_pwr_vseq", UVM_LOW)
 
      repeat (num_trans) begin
-
        `DV_CHECK_MEMBER_RANDOMIZE_FATAL(en_ulp)
 
        // Enable ultra low power feature
@@ -121,6 +120,15 @@
              drive_lid();
            end
          join
+
+         // Wait until all debounce timer expires, so the state machines will be reset to Idle.
+         begin
+           int wait_cycles[$];
+           wait_cycles.push_back(cycles_to_finish_debounce(pwrb_cycles, set_pwrb_timer));
+           wait_cycles.push_back(cycles_to_finish_debounce(lid_cycles, set_lid_timer));
+           wait_cycles.push_back(cycles_to_finish_debounce(ac_cycles, set_ac_timer));
+           cfg.clk_aon_rst_vif.wait_clks($urandom_range(2, 10) + max(wait_cycles));
+         end
        end
 
        // Enable the bus clock to read the status register
@@ -132,9 +140,11 @@
        csr_rd(ral.ulp_ctl, rdata);
        enable_ulp = get_field_val(ral.ulp_ctl.ulp_enable, rdata);
 
-       `uvm_info(`gfn, $sformatf("enable_ulp=%0b, pwrb_cycles=%0d, pwrb_timer=%0d, ac_cycles=%0d,\
-                 get_ac_timer=%0d, lid_cycles=%0d, lid_timer=%0d", enable_ulp, pwrb_cycles,
-                 get_pwrb_timer, ac_cycles, get_ac_timer, lid_cycles, get_lid_timer), UVM_MEDIUM)
+       `uvm_info(`gfn, {$sformatf("enable_ulp=%0b, pwrb_cycles=%0d, pwrb_timer=%0d",
+                                  enable_ulp, pwrb_cycles, get_pwrb_timer),
+                        $sformatf("ac_cycles=%0d, get_ac_timer=%0d", ac_cycles, get_ac_timer),
+                        $sformatf("lid_cycles=%0d, lid_timer=%0d", lid_cycles, get_lid_timer)},
+                 UVM_MEDIUM)
        // (cycles == timer) => sysrst_ctrl_detect.state : DebounceSt -> IdleSt
        // (cycles == timer + 1) => sysrst_ctrl_detect.state : DetectSt -> IdleSt
        // Therefore we only need to check when cycles > timer + 1
@@ -184,8 +194,16 @@
              cfg.intr_vif.pins
          );
        end
-       cfg.clk_aon_rst_vif.wait_clks(10);
+       cfg.clk_aon_rst_vif.wait_clks($urandom_range(0, 10));
      end
    endtask : body
 
+   // A helper function to determine if the set time is long enough to cover the debounce state.
+   // If the set time is longer than the debounce time, return 0.
+   // If the set time if shorter than the debounce time, return the cycles required to finish
+   // the debounce state.
+   virtual function uint cycles_to_finish_debounce(int set_cycles, int debounce_timer);
+     return (set_cycles >= debounce_timer) ? 0 : (debounce_timer - set_cycles);
+   endfunction
+
 endclass : sysrst_ctrl_ultra_low_pwr_vseq