[dv/alert_handler] Fix crashdump with reset
This PR fixes a race condition between crashdump change and reset.
Signed-off-by: Cindy Chen <chencindy@opentitan.org>
diff --git a/hw/ip_templates/alert_handler/dv/env/alert_handler_scoreboard.sv b/hw/ip_templates/alert_handler/dv/env/alert_handler_scoreboard.sv
index bc58653..2941f22 100644
--- a/hw/ip_templates/alert_handler/dv/env/alert_handler_scoreboard.sv
+++ b/hw/ip_templates/alert_handler/dv/env/alert_handler_scoreboard.sv
@@ -402,17 +402,18 @@
alert_pkg::alert_crashdump_t crashdump_val =
alert_pkg::alert_crashdump_t'(cfg.crashdump_vif.sample());
- // If crashdump reached the phase programmed at `crashdump_trigger_shadowed`, `crashdump_o`
- // value should keep stable until reset.
- if (crashdump_triggered) begin
- `uvm_fatal(`gfn, "crashdump value should not change after trigger condition is reached!")
- end
-
// Wait two negedge clock cycles to make sure csr mirrored values are updated.
`DV_SPINWAIT_EXIT(cfg.clk_rst_vif.wait_n_clks(2);, wait (cfg.under_reset == 1);)
if (!cfg.under_reset) begin
- foreach (crashdump_val.class_esc_state[i]) begin
+ // If crashdump reached the phase programmed at `crashdump_trigger_shadowed`,
+ // `crashdump_o` value should keep stable until reset.
+ if (crashdump_triggered) begin
+ `uvm_fatal(`gfn,
+ "crashdump value should not change after trigger condition is reached!")
+ end
+
+ foreach (crashdump_val.class_esc_state[i]) begin
uvm_reg crashdump_trigger_csr = ral.get_reg_by_name(
$sformatf("class%0s_crashdump_trigger_shadowed", class_name[i]));
if (crashdump_val.class_esc_state[i] == (`gmv(crashdump_trigger_csr) + 3'b100)) begin
diff --git a/hw/top_earlgrey/ip_autogen/alert_handler/dv/env/alert_handler_scoreboard.sv b/hw/top_earlgrey/ip_autogen/alert_handler/dv/env/alert_handler_scoreboard.sv
index bc58653..2941f22 100644
--- a/hw/top_earlgrey/ip_autogen/alert_handler/dv/env/alert_handler_scoreboard.sv
+++ b/hw/top_earlgrey/ip_autogen/alert_handler/dv/env/alert_handler_scoreboard.sv
@@ -402,17 +402,18 @@
alert_pkg::alert_crashdump_t crashdump_val =
alert_pkg::alert_crashdump_t'(cfg.crashdump_vif.sample());
- // If crashdump reached the phase programmed at `crashdump_trigger_shadowed`, `crashdump_o`
- // value should keep stable until reset.
- if (crashdump_triggered) begin
- `uvm_fatal(`gfn, "crashdump value should not change after trigger condition is reached!")
- end
-
// Wait two negedge clock cycles to make sure csr mirrored values are updated.
`DV_SPINWAIT_EXIT(cfg.clk_rst_vif.wait_n_clks(2);, wait (cfg.under_reset == 1);)
if (!cfg.under_reset) begin
- foreach (crashdump_val.class_esc_state[i]) begin
+ // If crashdump reached the phase programmed at `crashdump_trigger_shadowed`,
+ // `crashdump_o` value should keep stable until reset.
+ if (crashdump_triggered) begin
+ `uvm_fatal(`gfn,
+ "crashdump value should not change after trigger condition is reached!")
+ end
+
+ foreach (crashdump_val.class_esc_state[i]) begin
uvm_reg crashdump_trigger_csr = ral.get_reg_by_name(
$sformatf("class%0s_crashdump_trigger_shadowed", class_name[i]));
if (crashdump_val.class_esc_state[i] == (`gmv(crashdump_trigger_csr) + 3'b100)) begin