[dv/rstmgr] Simplify reset checking
Minor coverage tuning for reset_req mubi.
Signed-off-by: Guillermo Maturana <maturana@google.com>
diff --git a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv
index 060a811..286429f 100644
--- a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv
+++ b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv
@@ -11,6 +11,8 @@
`uvm_object_utils(rstmgr_base_vseq)
+ `uvm_object_new
+
// Set clock frequencies per spec, except the aon is 200kHZ, which is
// too slow and could slow testing down for no good reason.
localparam int AON_FREQ_MHZ = 3;
@@ -41,14 +43,8 @@
} reset_e;
typedef struct {
- int code;
- logic enable;
- logic update;
- } reset_expectations_t;
-
- typedef struct {
string description;
- reset_expectations_t expects;
+ int code;
} reset_test_info_t;
rand reset_e which_reset;
@@ -97,55 +93,37 @@
reset_test_info_t reset_test_infos[reset_e] = '{
ResetPOR: '{
description: "POR reset",
- expects: '{
- code: 1,
- enable: 1'b0,
- update: 1'b0
- }
+ code: 1
},
ResetScan: '{
description: "scan reset",
- expects: '{
- code: 1,
- enable: 1'b0,
- update: 1'b0
- }
+ code: 1
},
ResetLowPower: '{
description: "low power reset",
- expects: '{
- code: 2,
- enable: 1'b1,
- update: 1'b1
- }
+ code: 2
},
ResetNdm: '{
description: "ndm reset",
- expects: '{
- code: 4,
- enable: 1'b1,
- update: 1'b1
- }
+ code: 4
},
ResetSw: '{
description: "software reset",
- expects: '{
- code: 8,
- enable: 1'b0,
- update: 1'b1
- }
+ code: 8
},
ResetHw: '{
description: "hardware reset",
- expects: '{
- code: 16,
- enable: 1'b0,
- update: 1'b1
- }
+ code: 16
}
};
- `uvm_object_new
+ function bit aon_reset(reset_e reset);
+ return reset inside {ResetPOR, ResetScan};
+ endfunction
+
+ function bit clear_capture_enable(reset_e reset);
+ return !(reset inside {ResetLowPower, ResetNdm});
+ endfunction
function void post_randomize();
scanmode = get_rand_mubi4_val(scanmode_on_weight, 4, 4);
@@ -306,7 +284,7 @@
virtual protected task clear_alert_and_cpu_info();
set_alert_and_cpu_info_for_capture('0, '0);
- send_sw_reset();
+ send_sw_reset(MuBi4True);
check_alert_and_cpu_info_after_reset(.alert_dump('0), .cpu_dump('0), .enable(0));
endtask
@@ -400,12 +378,14 @@
endtask
// Requests a sw reset. It is cleared by hardware once the reset is taken.
- virtual protected task send_sw_reset();
- `uvm_info(`gfn, "Sending sw reset", UVM_LOW)
- csr_wr(.ptr(ral.reset_req), .value(prim_mubi_pkg::MuBi4True));
- reset_start(pwrmgr_pkg::HwReq);
- cfg.io_div4_clk_rst_vif.wait_clks(non_ndm_reset_cycles);
- reset_done();
+ virtual protected task send_sw_reset(mubi4_t value);
+ csr_wr(.ptr(ral.reset_req), .value(value));
+ if (value == prim_mubi_pkg::MuBi4True) begin
+ `uvm_info(`gfn, "Sending sw reset", UVM_LOW)
+ reset_start(pwrmgr_pkg::HwReq);
+ cfg.io_div4_clk_rst_vif.wait_clks(non_ndm_reset_cycles);
+ reset_done();
+ end
endtask
virtual task dut_init(string reset_kind = "HARD");
diff --git a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_reset_vseq.sv b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_reset_vseq.sv
index 3964fa4..6be67ac 100644
--- a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_reset_vseq.sv
+++ b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_reset_vseq.sv
@@ -2,25 +2,32 @@
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
-// Tests the reset_info CSR settings for random resets.
-// Notice as far as rstmgr once POR or scan reset are asserted, they have
-// identical side-effects for rstmgr.
+// Tests the reset_info CSR settings, and alert and cpu dump capture for random
+// resets.
+//
+// Notice that for rstmgr both POR and scan reset have identical side-effects.
//
// Each run releases rst_cpu_n a few cycles after a scan reset. This requires
// the responder to be disabled from automatically deactivating rst_cpu_n after
// rst_sys_src_n goes inactive.
//
-// It is simpler to manipulate the responder once running so we cause a scan
-// reset after disabling it, and before the other resets. This tests that resets
-// other than scan don't update the reset_info CSR, and don't capture cpu or
-// alert dumps.
+// It is simpler to manipulate the responder once running so we cause another
+// aon reset after disabling it, and before the other resets. This tests that,
+// prior to rst_cpu_n, non-aon resets don't update the reset_info CSR, and don't
+// capture cpu or alert dumps.
class rstmgr_reset_vseq extends rstmgr_base_vseq;
`uvm_object_utils(rstmgr_reset_vseq)
`uvm_object_new
- rand logic enable_alert_info;
- rand logic enable_cpu_info;
+ constraint num_trans_c {num_trans inside {[40 : 60]};}
+
+ constraint which_reset_c {which_reset != 0;}
+
+ // VCS seems to have non-uniform distributions for this variable.
+ rand logic alert_enable;
+
+ rand logic cpu_enable;
rand int wait_for_release_response_update_cycles;
constraint wait_for_release_response_update_cycles_c {
@@ -36,6 +43,13 @@
rand reset_e start_reset;
constraint start_reset_c {start_reset inside {ResetPOR, ResetScan};}
+ mubi4_t sw_reset_csr;
+
+ function void post_randomize();
+ if (which_reset == ResetSw) sw_reset_csr = MuBi4True;
+ else sw_reset_csr = get_rand_mubi4_val(0, 2, 4);
+ endfunction
+
local task update_cpu_to_sys_rst_release_response(bit enable);
enable_cpu_to_sys_rst_release_response = enable;
`uvm_info(`gfn, $sformatf("%0sabling sys_rst_responder", enable ? "En" : "Dis"), UVM_MEDIUM)
@@ -57,6 +71,8 @@
int expected_reset_info_code;
logic expected_alert_enable;
logic expected_cpu_enable;
+ alert_crashdump_t expected_alert_dump = '0;
+ cpu_crash_dump_t expected_cpu_dump = '0;
alert_crashdump_t prev_alert_dump = '0;
cpu_crash_dump_t prev_cpu_dump = '0;
int trans_before_enabling_cpu_rst_response;
@@ -79,54 +95,78 @@
), UVM_MEDIUM)
// Clear reset_info register, and enable cpu and alert info capture.
- set_alert_info_for_capture(alert_dump, enable_alert_info);
- set_cpu_info_for_capture(cpu_dump, enable_cpu_info);
+ set_alert_info_for_capture(alert_dump, alert_enable);
+ set_cpu_info_for_capture(cpu_dump, cpu_enable);
csr_wr(.ptr(ral.reset_info), .value('1));
// We need to start with an AON reset to process non-capturing resets.
if (start_reset == ResetPOR) por_reset();
else if (start_reset == ResetScan) send_scan_reset();
+ // On either of these resets we expect captures to be all zero and enables to be off.
+ expected_alert_dump = '0;
+ expected_cpu_dump = '0;
+ expected_alert_enable = 0;
+ expected_cpu_enable = 0;
+
reset_test_info = reset_test_infos[start_reset];
cfg.clk_rst_vif.wait_clks(8);
// Wait till rst_lc_n is inactive for non-aon.
wait(cfg.rstmgr_vif.resets_o.rst_lc_n[1]);
- check_reset_info(reset_test_info.expects.code, reset_test_info.description);
- check_alert_info_after_reset('0, 0);
- check_cpu_info_after_reset('0, 0);
+ check_reset_info(reset_test_info.code, reset_test_info.description);
+ check_alert_info_after_reset(expected_alert_dump, expected_alert_enable);
+ check_cpu_info_after_reset(expected_cpu_dump, expected_cpu_enable);
+ prev_alert_dump = expected_alert_dump;
+ prev_cpu_dump = expected_cpu_dump;
for (int i = 0; i < num_trans; ++i) begin
+ logic clear_enables;
+ logic update_capture_dump;
+
`uvm_info(`gfn, $sformatf("Starting new round %0d", i), UVM_MEDIUM)
`DV_CHECK_RANDOMIZE_FATAL(this)
- set_alert_info_for_capture(alert_dump, enable_alert_info);
- set_cpu_info_for_capture(cpu_dump, enable_cpu_info);
- csr_wr(.ptr(ral.reset_info), .value('1));
- reset_test_info = reset_test_infos[which_reset];
-
if (i == trans_before_enabling_cpu_rst_response) begin
update_cpu_to_sys_rst_release_response(.enable(1));
capture = 1;
end
- expected_reset_info_code = reset_test_info.expects.code;
- expected_alert_enable = enable_alert_info && (!capture || reset_test_info.expects.enable);
- expected_cpu_enable = enable_cpu_info && (!capture || reset_test_info.expects.enable);
+ set_alert_info_for_capture(alert_dump, alert_enable);
+ set_cpu_info_for_capture(cpu_dump, cpu_enable);
+ csr_wr(.ptr(ral.reset_info), .value('1));
+
+ reset_test_info = reset_test_infos[which_reset];
+ clear_enables = aon_reset(which_reset) || (capture && clear_capture_enable(which_reset));
+ update_capture_dump = capture && !aon_reset(which_reset);
+
+ expected_reset_info_code = (capture || aon_reset(which_reset)) ? reset_test_info.code : '0;
+ expected_alert_enable = alert_enable && !clear_enables;
+ expected_cpu_enable = cpu_enable && !clear_enables;
+ // This is expedient, since aon resets will clear any dumps.
+ if (aon_reset(which_reset)) begin
+ prev_alert_dump = '0;
+ prev_cpu_dump = '0;
+ end
+ expected_alert_dump = (alert_enable && update_capture_dump) ? alert_dump : prev_alert_dump;
+ expected_cpu_dump = (cpu_enable && update_capture_dump) ? cpu_dump : prev_cpu_dump;
+
+ `uvm_info(`gfn, $sformatf(
+ "%0s with global capturing %0sbled, alert_en %b, cpu_en %b",
+ which_reset.name(),
+ (capture ? "en" : "dis"),
+ alert_enable,
+ cpu_enable
+ ), UVM_MEDIUM)
+
+ send_sw_reset(sw_reset_csr);
case (which_reset)
- ResetPOR, ResetScan: begin
- // This resets the info registers, which means the previous info contents become zero.
- prev_alert_dump = '0;
- prev_cpu_dump = '0;
- expected_alert_enable = 0;
- expected_cpu_enable = 0;
- if (which_reset == ResetPOR) por_reset();
- else if (which_reset == ResetScan) send_scan_reset();
- end
+ ResetPOR: por_reset();
+ ResetScan: send_scan_reset();
ResetLowPower: send_reset(pwrmgr_pkg::LowPwrEntry, 0);
ResetNdm: send_ndm_reset();
- ResetSw: send_sw_reset();
+ ResetSw: `DV_CHECK_EQ(sw_reset_csr, MuBi4True)
ResetHw: begin
- expected_reset_info_code = {'0, rstreqs, 4'b0};
+ if (capture) expected_reset_info_code = {'0, rstreqs, 4'b0};
send_reset(pwrmgr_pkg::HwReq, rstreqs);
end
default: `uvm_fatal(`gfn, $sformatf("Unexpected reset type %0d", which_reset))
@@ -134,29 +174,13 @@
cfg.clk_rst_vif.wait_clks(8);
wait(cfg.rstmgr_vif.resets_o.rst_lc_n[1]);
- if (!capture) begin
- `uvm_info(`gfn, $sformatf("In no capture %0d", i), UVM_MEDIUM)
- check_reset_info(which_reset inside {ResetPOR, ResetScan} ? expected_reset_info_code : 0,
- reset_test_info.description);
- check_alert_info_after_reset(.alert_dump('0), .enable(expected_alert_enable));
- check_cpu_info_after_reset(.cpu_dump('0), .enable(expected_cpu_enable));
- end else begin
- `uvm_info(`gfn, $sformatf("In capture %0d", i), UVM_MEDIUM)
- check_reset_info(expected_reset_info_code, reset_test_info.description);
-
- if (reset_test_info.expects.update && enable_alert_info) begin
- check_alert_info_after_reset(alert_dump, expected_alert_enable);
- prev_alert_dump = alert_dump;
- end else begin
- check_alert_info_after_reset(prev_alert_dump, expected_alert_enable);
- end
-
- if (reset_test_info.expects.update && enable_cpu_info) begin
- check_cpu_info_after_reset(cpu_dump, expected_cpu_enable);
- prev_cpu_dump = cpu_dump;
- end else begin
- check_cpu_info_after_reset(prev_cpu_dump, expected_cpu_enable);
- end
+ check_reset_info(expected_reset_info_code, reset_test_info.description);
+ check_alert_info_after_reset(.alert_dump(expected_alert_dump),
+ .enable(expected_alert_enable));
+ check_cpu_info_after_reset(.cpu_dump(expected_cpu_dump), .enable(expected_cpu_enable));
+ if (capture) begin
+ prev_alert_dump = expected_alert_dump;
+ prev_cpu_dump = expected_cpu_dump;
end
end
csr_wr(.ptr(ral.reset_info), .value('1));
diff --git a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv
index ea0ce00..4594577 100644
--- a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv
+++ b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv
@@ -69,7 +69,7 @@
set_alert_and_cpu_info_for_capture(alert_dump, cpu_dump);
// Send sw reset.
- send_sw_reset();
+ send_sw_reset(MuBi4True);
check_reset_info(8, "Expected reset_info to indicate sw reset");
check_alert_and_cpu_info_after_reset(alert_dump, cpu_dump, 0);