[dv/otp] all escalation_test add otp_check_fatal_alert

This PR inject faults to trigger otp_ctrl_check_fatal_alert.
This PR implements a TODO in issue #15649

Signed-off-by: Cindy Chen <chencindy@opentitan.org>
diff --git a/hw/top_earlgrey/dv/env/seq_lib/chip_sw_all_escalation_resets_vseq.sv b/hw/top_earlgrey/dv/env/seq_lib/chip_sw_all_escalation_resets_vseq.sv
index 0001a8f..bba19c2 100644
--- a/hw/top_earlgrey/dv/env/seq_lib/chip_sw_all_escalation_resets_vseq.sv
+++ b/hw/top_earlgrey/dv/env/seq_lib/chip_sw_all_escalation_resets_vseq.sv
@@ -37,8 +37,8 @@
     '{"*lc_ctrl*prim_reg_we_check*", TopEarlgreyAlertIdLcCtrlFatalBusIntegError},
     '{"*otbn*prim_reg_we_check*", TopEarlgreyAlertIdOtbnFatal},
     // TODO TopEarlgreyAlertIdOtpCtrlFatalMacroError,
-    // TODO TopEarlgreyAlertIdOtpCtrlFatalCheckError
     // TODO TopEarlgreyAlertIdOtpCtrlFatalPrimOtpAlert.
+    '{"*otp_ctrl*u_otp_ctrl_dai*", TopEarlgreyAlertIdOtpCtrlFatalCheckError},
     '{"*otp_ctrl*prim_reg_we_check*", TopEarlgreyAlertIdOtpCtrlFatalBusIntegError},
     '{"*pattgen*prim_reg_we_check*", TopEarlgreyAlertIdPattgenFatalFault},
     '{"*pinmux*prim_reg_we_check*", TopEarlgreyAlertIdPinmuxAonFatalFault},
diff --git a/sw/device/tests/sim_dv/all_escalation_resets_test.c b/sw/device/tests/sim_dv/all_escalation_resets_test.c
index 3e299db..7e0f86f 100644
--- a/sw/device/tests/sim_dv/all_escalation_resets_test.c
+++ b/sw/device/tests/sim_dv/all_escalation_resets_test.c
@@ -219,7 +219,7 @@
 // TODO: test lc_ctrl fatal_state, alert 17.
 static const char *lc_ctrl_inst_name = "lc_ctrl";
 static const char *otbn_inst_name = "otbn";
-// TODO test fatal macro, fatal check, and fatal prim, alerts 11, 12, and 14.
+// TODO test fatal macro, and fatal prim, alerts 11 and 14.
 // They don't have onehot_checkers, cause both u_reg, and u_reg_tap checkers?
 static const char *otp_ctrl_inst_name = "otp_ctrl";
 static const char *pattgen_inst_name = "pattgen";
@@ -368,7 +368,10 @@
       relevant_mask, kDifOtpCtrlStatusCodeCheckPending, false);
   CHECK_DIF_OK(dif_otp_ctrl_get_status(&otp_ctrl, &status));
   relevant_codes = status.codes & relevant_mask;
-  expected_codes = enable ? (1 << kDifOtpCtrlStatusCodeBusIntegError) : 0;
+  dif_otp_ctrl_status_code_t exp_err = (type == we_check)
+                                           ? kDifOtpCtrlStatusCodeBusIntegError
+                                           : kDifOtpCtrlStatusCodeDaiError;
+  expected_codes = enable ? (1 << exp_err) : 0;
   CHECK(relevant_codes == expected_codes,
         "For %s got codes 0x%x, expected 0x%x", ip_inst, relevant_codes,
         expected_codes);
@@ -845,7 +848,6 @@
       fault_checker = fc;
     } break;
       // TODO add mechanism to inject:
-      // kTopEarlgreyAlertIdOtpCtrlFatalCheckError sparse fsm
       // kTopEarlgreyAlertIdOtpCtrlFatalMacroError uncorrectable ecc from macro
       // In any partition otp_ctrl_part_unbuf error_q = MacroEccUncorrError
       // kTopEarlgreyAlertIdOtpCtrlFatalPrimOtpAlert force at prim_otp interface
@@ -853,6 +855,11 @@
       // forcing otp_prog_err_o from lc_ctrl_fsm and
       // kTopEarlgreyAlertIdLcCtrlFatalStateError using sparse fsm.
       // alerts, and corresponding CSR bit to check.
+    case kTopEarlgreyAlertIdOtpCtrlFatalCheckError: {
+      fault_checker_t fc = {otp_ctrl_fault_checker, otp_ctrl_inst_name,
+                            sparse_fsm_check};
+      fault_checker = fc;
+    } break;
     case kTopEarlgreyAlertIdOtpCtrlFatalBusIntegError: {
       fault_checker_t fc = {otp_ctrl_fault_checker, otp_ctrl_inst_name,
                             we_check};
@@ -1112,7 +1119,8 @@
     // state the lc_ctrl blocks the CPU.
     if (kExpectedAlertNumber == kTopEarlgreyAlertIdFlashCtrlFatalStdErr ||
         kExpectedAlertNumber == kTopEarlgreyAlertIdSramCtrlMainFatalError ||
-        kExpectedAlertNumber == kTopEarlgreyAlertIdLcCtrlFatalStateError) {
+        kExpectedAlertNumber == kTopEarlgreyAlertIdLcCtrlFatalStateError ||
+        kExpectedAlertNumber == kTopEarlgreyAlertIdOtpCtrlFatalCheckError) {
       CHECK(interrupt_count == 0,
             "Expected regular ISR should not run for flash_ctrl, lc_ctrl fatal "
             "state, or sram_ctrl_main faults");