blob: cc9056ec612a20cc9cb05ef69b97db678a3922fa [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
// Description:
// The reset test randomly introduces external resets.
class pwrmgr_sw_reset_vseq extends pwrmgr_base_vseq;
`uvm_object_utils(pwrmgr_sw_reset_vseq)
`uvm_object_new
constraint wakeups_c {wakeups == 0;}
constraint wakeups_en_c {wakeups_en == 0;}
task body();
int exp_rst;
wait_for_fast_fsm_active();
check_reset_status('0);
num_trans_c.constraint_mode(0);
num_trans = 30;
for (int i = 0; i < num_trans; ++i) begin
`uvm_info(`gfn, "Starting new round", UVM_MEDIUM)
`DV_CHECK_RANDOMIZE_FATAL(this)
setup_interrupt(.enable(en_intr));
cfg.pwrmgr_vif.sw_rst_req_i = $urandom_range(0, 15);
exp_rst = (cfg.pwrmgr_vif.sw_rst_req_i == prim_mubi_pkg::MuBi4True);
cfg.slow_clk_rst_vif.wait_clks(4);
// sw reset causes fast state machine transition to lowpower state
if (exp_rst == 1) begin
`DV_SPINWAIT(wait(cfg.pwrmgr_vif.fast_state != pwrmgr_pkg::FastPwrStateActive);,
"timeout waiting for non fast-active state", 1000)
end
// This read is not always possible since the CPU may be off.
wait(cfg.pwrmgr_vif.pwr_clk_req.main_ip_clk_en == 1'b1);
wait_for_fast_fsm_active();
`uvm_info(`gfn, "Back from reset", UVM_MEDIUM)
check_wake_info(.reasons('0), .fall_through(1'b0), .abort(1'b0));
cfg.slow_clk_rst_vif.wait_clks(4);
check_reset_status('0);
// And check interrupt is not set.
check_and_clear_interrupt(.expected(1'b0));
end
clear_wake_info();
endtask
endclass : pwrmgr_sw_reset_vseq