[sensor_ctrl] Various updates to sensor_ctrl

- Based on recent nuvoton discussions
- Remove sensor_ctrl from always on domain
- Update sensor_ctrl alert event handling to assume async
- Remove 'ack modes' and replace with recoverable / fatal alerts
- Add software programming to categorize alerts into fatal or
  recoverable
- Add wakeup function

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/top_earlgrey/data/top_earlgrey.hjson b/hw/top_earlgrey/data/top_earlgrey.hjson
index 7730a48..f570461 100644
--- a/hw/top_earlgrey/data/top_earlgrey.hjson
+++ b/hw/top_earlgrey/data/top_earlgrey.hjson
@@ -440,11 +440,11 @@
       base_addr: "0x40480000",
       attr: "reggen_only",
     },
-    { name: "sensor_ctrl_aon",
+    { name: "sensor_ctrl",
       type: "sensor_ctrl",
-      clock_srcs: {clk_i: "io_div4"},
+      clock_srcs: {clk_i: "io_div4", clk_aon_i: "aon"},
       clock_group: "secure",
-      reset_connections: {rst_ni: "lc_io_div4"},
+      reset_connections: {rst_ni: "lc_io_div4", rst_aon_ni: "lc_aon"},
       domain: ["Aon"],
       base_addr: "0x40490000",
       attr: "reggen_top",
@@ -922,10 +922,10 @@
         'otp_ctrl.otp_ext_voltage_h'      : 'otp_ext_voltage_h',
         'otp_ctrl.otp_alert'              : 'otp_alert',
         'rstmgr_aon.por_n'                : 'por_n'
-        'sensor_ctrl_aon.ast_alert'       : 'sensor_ctrl_ast_alert',
-        'sensor_ctrl_aon.ast_status'      : 'sensor_ctrl_ast_status',
-        'sensor_ctrl_aon.ast2pinmux'      : 'ast2pinmux',
-        'sensor_ctrl_aon.ast_init_done'   : 'ast_init_done',
+        'sensor_ctrl.ast_alert'           : 'sensor_ctrl_ast_alert',
+        'sensor_ctrl.ast_status'          : 'sensor_ctrl_ast_status',
+        'sensor_ctrl.ast2pinmux'          : 'ast2pinmux',
+        'sensor_ctrl.ast_init_done'       : 'ast_init_done',
         'spi_device.sck_monitor'          : 'sck_monitor',
         'usbdev.usb_ref_val'              : '',
         'usbdev.usb_ref_pulse'            : '',
@@ -1132,7 +1132,7 @@
       { instance: "pattgen",         port: '',               connection: 'muxed' , pad: ''             , desc: ''},
       { instance: "spi_host1",       port: '',               connection: 'muxed' , pad: ''             , desc: ''},
       { instance: "flash_ctrl",      port: '',               connection: 'muxed' , pad: ''             , desc: ''},
-      { instance: "sensor_ctrl_aon", port: '',               connection: 'muxed' , pad: ''             , desc: ''},
+      { instance: "sensor_ctrl",     port: '',               connection: 'muxed' , pad: ''             , desc: ''},
       { instance: "pwm_aon",         port: '',               connection: 'muxed' , pad: ''             , desc: ''},
       { instance: "otp_ctrl",        port: 'test[0]',        connection: 'muxed' , pad: ''             , desc: ''},
       // Sysrst ctrl has both muxed and dedicated IOs
diff --git a/hw/top_earlgrey/data/xbar_peri.hjson b/hw/top_earlgrey/data/xbar_peri.hjson
index 3f46641..a8e45de 100644
--- a/hw/top_earlgrey/data/xbar_peri.hjson
+++ b/hw/top_earlgrey/data/xbar_peri.hjson
@@ -147,7 +147,7 @@
       reset:     "rst_peri_ni",
       pipeline:  "false"
     },
-    { name:      "sensor_ctrl_aon",
+    { name:      "sensor_ctrl",
       type:      "device",
       clock:     "clk_peri_i",
       reset:     "rst_peri_ni",
@@ -201,7 +201,7 @@
       "uart0", "uart1", "uart2", "uart3", "i2c0", "i2c1", "i2c2", "pattgen",
       "gpio", "spi_device", "spi_host0", "spi_host1", "rv_timer", "usbdev",
       "pwrmgr_aon", "rstmgr_aon", "clkmgr_aon", "pinmux_aon",
-      "otp_ctrl.core", "otp_ctrl.prim", "lc_ctrl", "sensor_ctrl_aon",
+      "otp_ctrl.core", "otp_ctrl.prim", "lc_ctrl", "sensor_ctrl",
       "alert_handler", "ast", "sram_ctrl_ret_aon.ram", "sram_ctrl_ret_aon.regs",
       "aon_timer_aon", "adc_ctrl_aon", "sysrst_ctrl_aon", "pwm_aon"
     ],
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson b/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson
index c0bbe4d..6409293 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson
+++ b/hw/top_earlgrey/ip/sensor_ctrl/data/sensor_ctrl.hjson
@@ -9,7 +9,8 @@
 #
 {
   name: "SENSOR_CTRL",
-  clocking: [{clock: "clk_i", reset: "rst_ni"}],
+  clocking: [{clock: "clk_i", reset: "rst_ni", primary: true},
+             {clock: "clk_aon_i", reset: "rst_aon_ni"}],
   bus_interfaces: [
     { protocol: "tlul", direction: "device" }
   ],
@@ -21,10 +22,22 @@
   ],
   regwidth: "32",
   param_list: [
-    { name:    "NumAlerts",
+    { name:    "NumAlertEvents",
       type:    "int",
       default: "13",
-      desc:    "Number of alerts",
+      desc:    "Number of alert events from ast",
+      local:   "true"
+    },
+    { name:    "NumLocalEvents",
+      type:    "int",
+      default: "1",
+      desc:    "Number of local events",
+      local:   "true"
+    },
+    { name:    "NumAlerts",
+      type:    "int",
+      default: "2",
+      desc:    "Number of alerts sent from sensor control",
       local:   "true"
     },
     { name:    "NumIoRails",
@@ -35,46 +48,19 @@
     },
   ],
 
+  wakeup_list: [
+    { name: "wkup_req",
+      desc: "Raised if an alert event is seen during low power"
+    },
+  ],
+
   alert_list: [
-    { name: "recov_as",
-      desc: "Triggered through AST",
+    { name: "recov_alert",
+      desc: "recoverable sensor_ctrl alerts",
     },
-    { name: "recov_cg",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_gd",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ts_hi",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ts_lo",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_fla",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_otp",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ot0",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ot1",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ot2",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ot3",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ot4",
-      desc: "Triggered through AST",
-    },
-    { name: "recov_ot5",
-      desc: "Triggered through AST",
-    },
+    { name: "fatal_alert",
+      desc: "fatal sensor_ctrl alerts",
+    }
   ]
 
 
@@ -108,6 +94,13 @@
       width:   9,
       package: ""
     },
+
+    { struct:  "logic",
+      type:    "uni",
+      name:    "wkup_req",
+      act:     "req",
+      package: ""
+    },
   ],
 
 registers: [
@@ -115,7 +108,7 @@
       swaccess: "rw0c",
       hwaccess: "none",
       desc: '''
-      Controls the configurability of !!ACK_MODE register.
+      Controls the configurability of !!FATAL_ALERT_EN register.
       ''',
 
       fields: [
@@ -131,33 +124,9 @@
 
     { multireg: {
         cname: "SENSOR_CTRL",
-        name: "ACK_MODE",
-        desc: "Alert acknowledge mode",
-        count: "NumAlerts",
-        swaccess: "rw",
-        hwaccess: "hro",
-        regwen: "CFG_REGWEN",
-        fields: [
-            { bits: "1:0",
-              name: "VAL",
-              desc: '''
-                Acknowledge mode to alerts.
-                0 is immediate acknowledge, the hardware immediately acks an incoming alert.
-                1 is software acknowledge.  Software must program the appropriate bit in !!ALERT_STATE to acknowledge the alert.
-                2 is no acknowledge.  When in this mode, any alert will effectively be considered fatal to the system.
-                3 is not a valid selection, but behaves similarly to 2.
-                ''',
-              resval: "0"
-            },
-        ],
-      },
-    },
-
-    { multireg: {
-        cname: "SENSOR_CTRL",
         name: "ALERT_TRIG",
         desc: "Alert trigger test",
-        count: "NumAlerts",
+        count: "NumAlertEvents",
         swaccess: "rw",
         hwaccess: "hro",
         fields: [
@@ -179,18 +148,64 @@
 
     { multireg: {
         cname: "SENSOR_CTRL",
-        name: "ALERT_STATE",
+        name: "FATAL_ALERT_EN",
+        regwen: "CFG_REGWEN",
         desc: '''
-          A bit is set whenever there is an incoming alert event.
-          Software reads back the alert that was set and clears the appropriate bits to acknowledge the alert.
-
-          This is only valid when !!ACK_MODE is set to software.
-          For bit mapping, please see !!ALERT_TEST
+          Each bit represents that a corresponding alert is marked fatal instead of
+          recoverable
         ''',
-        count: "NumAlerts",
+        count: "NumAlertEvents",
+        swaccess: "rw",
+        hwaccess: "hro",
+        fields: [
+            { bits: "0",
+              name: "VAL",
+              desc: '''
+                1 - An alert event is fatal.
+                0 - An alert event is recoverable.
+              ''',
+              resval: "0"
+            },
+        ],
+      },
+    },
+
+    { multireg: {
+        cname: "SENSOR_CTRL",
+        name: "RECOV_ALERT",
+        desc: '''
+          Each bit represents that a recoverable alert has been triggered by Ast.
+          Since these are recoverable alerts, they can be cleared by software.
+        ''',
+        count: "NumAlertEvents",
         swaccess: "rw1c",
         hwaccess: "hrw",
-        hwqe: "true",
+        fields: [
+            { bits: "0",
+              name: "VAL",
+              desc: '''
+                1 - An alert event has been set
+                0 - No alert event has been set
+              ''',
+              resval: "0"
+            },
+        ],
+      },
+    },
+
+    { multireg: {
+        cname: "SENSOR_CTRL",
+        name: "FATAL_ALERT",
+        desc: '''
+          Each bit represents that a fatal alert has been triggered by Ast.
+          Since these registers represent fatal alerts, they cannot be cleared.
+
+          The lower bits are used for ast alert events.
+          The upper bits are used for local events.
+        ''',
+        count: "NumAlertEvents+NumLocalEvents",
+        swaccess: "ro",
+        hwaccess: "hrw",
         fields: [
             { bits: "0",
               name: "VAL",
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/doc/_index.md b/hw/top_earlgrey/ip/sensor_ctrl/doc/_index.md
index 9c58f0f..31774dd 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/doc/_index.md
+++ b/hw/top_earlgrey/ip/sensor_ctrl/doc/_index.md
@@ -16,6 +16,7 @@
 - Alert forwarding to `alert handler`
 - Status readback for `analog sensor top`
 - Pad debug hook up for `analog sensor top`
+- Wakeup based on alert events
 
 # Theory of Operations
 
@@ -23,7 +24,7 @@
 
 The diagram below shows how `sensor control` helps `analog sensor top` integration into the overall design.
 
-## Alert Handshake
+## Recoverable and Fatal Alerts
 
 The `analog sensor top` sends alert requests in independent, differential form to the `sensor control`.
 Each alert request consists of a pair of signals, one active high and one active low.
@@ -34,13 +35,21 @@
 Once an alert request is detected as active, the `sensor control` then formulates a proper alert event through the `prim_alert_sender` and sends a notification to the `alert handler`.
 
 The `sensor control` can optionally generate alert acknowledgements back to the `analog sensor top`.
-When an alert request is detected as active, the `sensor control` has 3 options after sending out the alert:
 
-- Do not acknowledge: Allow alerts to be continually triggered.
-- Software acknowledge: Let software decide whether an alert should stop triggering.
-- Hardware acknowledge. Let hardware immediately acknowledge the alert.
+For each incoming alert, it can be programmed as fatal or recoverable through {{< regref "FATAL_ALERT_EN" >}}.
+If set to recoverable, an alert will be registered in {{< regref "RECOV_ALERT" >}} and the original `analog sensor top` event acknowledged.
+The acknowledgement prevents alerts from constantly being sent.
 
-Once the `analog sensor top` receives the acknowledgment, it then drops the corresponding alert request.
+If set to fatal, an alert will be registered in {{< regref "FATAL_ALERT" >}} but the original `analog sensor top` event will not be acknowledged.
+This causes the alert to constantly send until the system escalates in some form.
+
+## Wakeup Requests
+
+In addition to forwarding events to the `alert handler`, incoming events can also be aggregated into a wakeup request to the system.
+The `sensor_ctrl` does not make assumptions about its power domains and thus it is up to the integrating system to decide which power modes allow alert event wakeups.
+
+As an example, if the `sensor_ctrl` is not placed in an always on domain, then it cannot send alert based wakeups if the system is in a deep low power state.
+It will only be able to send wakeups when the system is powered and the `clk_aon_i` input is available.
 
 ## Hardware Interfaces
 
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv
index 06f3fbb..b2bb164 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl.sv
@@ -15,6 +15,8 @@
   // Primary module clocks
   input clk_i,
   input rst_ni,
+  input clk_aon_i,
+  input rst_aon_ni,
 
   // Bus Interface
   input tlul_pkg::tl_h2d_t tl_i,
@@ -33,18 +35,53 @@
 
   // Alerts
   input  prim_alert_pkg::alert_rx_t [NumAlerts-1:0] alert_rx_i,
-  output prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o
+  output prim_alert_pkg::alert_tx_t [NumAlerts-1:0] alert_tx_o,
 
+  // wakeup to power manager
+  output logic wkup_req_o
 );
 
   // The reg_pkg number of alerts and ast alerts must always match
-  `ASSERT_INIT(NumAlertsMatch_A, ast_pkg::NumAlerts == NumAlerts)
+  `ASSERT_INIT(NumAlertsMatch_A, ast_pkg::NumAlerts == NumAlertEvents)
+
+  ///////////////////////////
+  // Incoming event synchronization - alerts can assert asynchronously
+  ///////////////////////////
+  logic [NumAlertEvents-1:0] async_alert_event_p, alert_event_p;
+  logic [NumAlertEvents-1:0] async_alert_event_n, alert_event_n;
+
+  for (genvar i = 0; i < NumAlertEvents; i++) begin : gen_alert_sync_assign
+    assign async_alert_event_p[i] = ast_alert_i.alerts[i].p;
+    assign async_alert_event_n[i] = ast_alert_i.alerts[i].n;
+  end
+
+  prim_flop_2sync #(
+    .Width(NumAlertEvents),
+    .ResetValue('0)
+  ) u_alert_p_sync (
+    .clk_i,
+    .rst_ni,
+    .d_i(async_alert_event_p),
+    .q_o(alert_event_p)
+  );
+
+  prim_flop_2sync #(
+    .Width(NumAlertEvents),
+    .ResetValue({NumAlertEvents{1'b1}})
+  ) u_alert_n_sync (
+    .clk_i,
+    .rst_ni,
+    .d_i(async_alert_event_n),
+    .q_o(alert_event_n)
+  );
+
 
   ///////////////////////////
   // Register interface
   ///////////////////////////
   sensor_ctrl_reg2hw_t reg2hw;
   sensor_ctrl_hw2reg_t hw2reg;
+  logic intg_err;
 
   sensor_ctrl_reg_top u_reg (
     .clk_i,
@@ -53,7 +90,7 @@
     .tl_o,
     .reg2hw,
     .hw2reg,
-    .intg_err_o(),
+    .intg_err_o(intg_err),
     .devmode_i(1'b1)
   );
 
@@ -64,119 +101,159 @@
 
 
   ///////////////////////////
-  // Alert handling
+  // Alert Event Handling
   ///////////////////////////
 
-  logic [NumAlerts-1:0] alert_test;
-  logic [NumAlerts-1:0] alerts_vld, alerts_clr;
-  logic [NumAlerts-1:0] sw_ack_mode;
-  logic [NumAlerts-1:0] no_ack_mode;
+  logic [NumAlertEvents-1:0] event_vld, event_clr;
 
   // While the alerts are differential, they are not perfectly aligned.
   // Instead, each alert is treated independently.
   always_comb begin
-    for (int i = 0; i < NumAlerts; i++) begin
-      alerts_vld[i] = ast_alert_i.alerts[i].p | ~ast_alert_i.alerts[i].n;
+    for (int i = 0; i < NumAlertEvents; i++) begin
+      event_vld[i] = alert_event_p[i] | ~alert_event_n[i];
     end
   end
 
-  // alert test connection
-  assign alert_test[ast_pkg::AsSel]   = reg2hw.alert_test.recov_as.qe    &
-                                        reg2hw.alert_test.recov_as.q;
-  assign alert_test[ast_pkg::CgSel]   = reg2hw.alert_test.recov_cg.qe    &
-                                        reg2hw.alert_test.recov_cg.q;
-  assign alert_test[ast_pkg::GdSel]   = reg2hw.alert_test.recov_gd.qe    &
-                                        reg2hw.alert_test.recov_gd.q;
-  assign alert_test[ast_pkg::TsHiSel] = reg2hw.alert_test.recov_ts_hi.qe &
-                                        reg2hw.alert_test.recov_ts_hi.q;
-  assign alert_test[ast_pkg::TsLoSel] = reg2hw.alert_test.recov_ts_lo.qe &
-                                        reg2hw.alert_test.recov_ts_lo.q;
-  assign alert_test[ast_pkg::FlaSel]  = reg2hw.alert_test.recov_fla.qe   &
-                                        reg2hw.alert_test.recov_fla.q;
-  assign alert_test[ast_pkg::OtpSel]  = reg2hw.alert_test.recov_otp.qe   &
-                                        reg2hw.alert_test.recov_otp.q;
-  assign alert_test[ast_pkg::Ot0Sel]  = reg2hw.alert_test.recov_ot0.qe   &
-                                        reg2hw.alert_test.recov_ot0.q;
-  assign alert_test[ast_pkg::Ot1Sel]  = reg2hw.alert_test.recov_ot1.qe   &
-                                        reg2hw.alert_test.recov_ot1.q;
-  assign alert_test[ast_pkg::Ot2Sel]  = reg2hw.alert_test.recov_ot2.qe   &
-                                        reg2hw.alert_test.recov_ot2.q;
-  assign alert_test[ast_pkg::Ot3Sel]  = reg2hw.alert_test.recov_ot3.qe   &
-                                        reg2hw.alert_test.recov_ot3.q;
-  assign alert_test[ast_pkg::Ot4Sel]  = reg2hw.alert_test.recov_ot4.qe   &
-                                        reg2hw.alert_test.recov_ot4.q;
-  assign alert_test[ast_pkg::Ot5Sel]  = reg2hw.alert_test.recov_ot5.qe   &
-                                        reg2hw.alert_test.recov_ot5.q;
-
-
-  // fire an alert whenever indicated
-  for (genvar i = 0; i < NumAlerts; i++) begin : gen_alert_senders
+  // Only recoverable alerts are ack'd.  Fatal alerts are captured and continuously
+  // triggered, there is thus not a need to ever acknowledge the source.
+  // For recoverable alerts, the ack is only sent once the alert is captured into software readable
+  // registers
+  logic [NumAlertEvents-1:0] recov_event;
+  logic [NumAlertEvents-1:0] fatal_event;
+  for (genvar i = 0; i < NumAlertEvents; i++) begin : gen_ast_alert_events
 
     // when there is a valid alert, set the alert state
-    logic valid_alert;
+    assign recov_event[i] = event_vld[i] & ~reg2hw.fatal_alert_en[i];
+    assign fatal_event[i] = event_vld[i] & reg2hw.fatal_alert_en[i];
 
-    assign sw_ack_mode[i] = ast_ack_mode_e'(reg2hw.ack_mode[i].q) == SwAck;
-    assign no_ack_mode[i] = ast_ack_mode_e'(reg2hw.ack_mode[i].q) == NoAck |
-                            ast_ack_mode_e'(reg2hw.ack_mode[i].q) == InvalidAck;
+    assign hw2reg.recov_alert[i].d  = 1'b1;
+    assign hw2reg.recov_alert[i].de = recov_event[i];
 
-    // if differential checks fail, generate alert
-    assign valid_alert = alerts_vld[i];
-    assign hw2reg.alert_state[i].d  = sw_ack_mode[i];
-    assign hw2reg.alert_state[i].de = valid_alert;
+    assign hw2reg.fatal_alert[i].d  = 1'b1;
+    assign hw2reg.fatal_alert[i].de = fatal_event[i];
 
-    logic alert_req;
-    logic alert_ack;
-    assign alert_req = sw_ack_mode[i] ? reg2hw.alert_state[i].q : valid_alert;
+    // only recoverable alerts ack
+    assign event_clr[i] = recov_event[i] & reg2hw.recov_alert[i].q;
 
-    prim_alert_sender #(
-      .AsyncOn(AlertAsyncOn[i]),
-      .IsFatal(0)
-    ) u_prim_alert_sender (
-      .clk_i,
-      .rst_ni,
-      .alert_test_i(alert_test[i]),
-      .alert_req_i(alert_req),
-      .alert_ack_o(alert_ack),
-      .alert_state_o(),
-      .alert_rx_i(alert_rx_i[i]),
-      .alert_tx_o(alert_tx_o[i])
-    );
-
-    assign alerts_clr[i] = no_ack_mode[i] ? '0 :
-                           sw_ack_mode[i] ? reg2hw.alert_state[i].q & reg2hw.alert_state[i].qe :
-                                            alert_req & alert_ack;
   end
 
-  // When in immediate ack mode, ack alerts as they are received by the sender
-  // When in software ack mode, only ack when software issues the command to clear alert_state
-  //
+  // handle internal alert events, currently only have fatals
+  for (genvar i = NumAlertEvents; i < TotalEvents; i++) begin : gen_local_alert_events
+    assign hw2reg.fatal_alert[i].d  = 1'b1;
+    assign hw2reg.fatal_alert[i].de = intg_err;
+  end
+
   // Note, even though the incoming alerts are differential, they are NOT expected to be
   // consistent all the time.  It is more appropriate for sensor_ctrl to treat them as
   // independent lines.
-  // As a result, the alerts_clr is only applied if an incoming alert is set to the active polarity.
+  // As a result, the alert_ack is only applied if an incoming alert is set to the active polarity.
   //
-  // Note, due to the converging nature of sensor ctrl (non-synced inputs being forwarded to 1
-  // alert), it is possible that when one alert arrives, it is ack'd right when the differential
-  // version comes.  As a result, the first alert will be ack'd, and the second will also
-  // immediately be ack'd, resulting in one alert being sent.
-  // This is OK because the intent is to send the alert anyways, and the ack would not have happened
-  // if the alert was not sent out.  If the incoming alert stays high, then alerts will continue to
-  // fire.
+
   always_comb begin
-    for (int i = 0; i < NumAlerts; i++) begin
-      ast_alert_o.alerts_ack[i].p = ast_alert_i.alerts[i].p & alerts_clr[i];
-      ast_alert_o.alerts_ack[i].n = ~(~ast_alert_i.alerts[i].n & alerts_clr[i]);
+    for (int i = 0; i < NumAlertEvents; i++) begin
+      ast_alert_o.alerts_ack[i].p = alert_event_p[i] & event_clr[i];
+      ast_alert_o.alerts_ack[i].n = ~(~alert_event_n[i] & event_clr[i]);
     end
   end
 
   // alert trigger for test
   always_comb begin
-    for (int i = 0; i < NumAlerts; i++) begin
+    for (int i = 0; i < NumAlertEvents; i++) begin
       ast_alert_o.alerts_trig[i].p = reg2hw.alert_trig[i];
       ast_alert_o.alerts_trig[i].n = ~reg2hw.alert_trig[i];
     end
   end
 
+
+  // alert test connection
+  logic [NumAlerts-1:0] alert_test;
+  assign alert_test[RecovAlert] = reg2hw.alert_test.recov_alert.qe &
+                                  reg2hw.alert_test.recov_alert.q;
+  assign alert_test[FatalAlert] = reg2hw.alert_test.fatal_alert.qe &
+                                  reg2hw.alert_test.fatal_alert.q;
+
+  prim_alert_sender #(
+    .AsyncOn(AlertAsyncOn[RecovAlert]),
+    .IsFatal(0)
+  ) u_prim_recov_alert_sender (
+    .clk_i,
+    .rst_ni,
+    .alert_test_i(alert_test[RecovAlert]),
+    .alert_req_i(|recov_event),
+    .alert_ack_o(),
+    .alert_state_o(),
+    .alert_rx_i(alert_rx_i[RecovAlert]),
+    .alert_tx_o(alert_tx_o[RecovAlert])
+  );
+
+  prim_alert_sender #(
+    .AsyncOn(AlertAsyncOn[FatalAlert]),
+    .IsFatal(1)
+  ) u_prim_fatal_alert_sender (
+    .clk_i,
+    .rst_ni,
+    .alert_test_i(alert_test[FatalAlert]),
+    .alert_req_i(|reg2hw.fatal_alert),
+    .alert_ack_o(),
+    .alert_state_o(),
+    .alert_rx_i(alert_rx_i[FatalAlert]),
+    .alert_tx_o(alert_tx_o[FatalAlert])
+  );
+
+  ///////////////////////////
+  // wakeup generation
+  ///////////////////////////
+
+  // wakeups are synchronized separately from the normal event handling.
+  // The alert handling is not synchronized through these below because
+  // the ack latency would be very long for no apparent gain.
+
+  logic async_wake;
+  logic unstable_wake_req;
+
+  // async wake combines ast inputs as well as recoverable alerts.
+  // This is because it is possible for alert events to arrive "right"
+  // on the boundary of low power. In the event this happens, the
+  // original event is immediately 'acked', making it possible for the
+  // sync flops below to miss the event. By mixing in recov_alert,
+  // we guarantee that if the event is caught by the regfile, it can also
+  // be used to trigger wake from low power.
+  // Fatal alerts are not used here because they do not ever ack, meaning
+  // the originating event can never disappear.
+  assign async_wake = |async_alert_event_p  |
+                      ~&async_alert_event_n |
+                      |reg2hw.recov_alert;
+
+  prim_flop_2sync #(
+    .Width(1),
+    .ResetValue('0)
+  ) u_wake_sync (
+    .clk_i,
+    .rst_ni,
+    .d_i(async_wake),
+    .q_o(unstable_wake_req)
+  );
+
+  logic [2:0] wake_req_filter;
+  always_ff @(posedge clk_aon_i or negedge rst_aon_ni) begin
+    if (!rst_aon_ni) begin
+      wake_req_filter <= '0;
+    end else begin
+      wake_req_filter <= {wake_req_filter[1:0], unstable_wake_req};
+    end
+  end
+
+  // The filter is needed since the input is purely combinational
+  // among async events.  The filter is thus used to ensure the
+  // wake indication is real and not a glitch.
+  always_ff @(posedge clk_aon_i or negedge rst_aon_ni) begin
+    if (!rst_aon_ni) begin
+      wkup_req_o <= '0;
+    end else begin
+      wkup_req_o <= |wake_req_filter;
+    end
+  end
+
   ///////////////////////////
   // pinmux feedthrough to ast
   ///////////////////////////
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_pkg.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_pkg.sv
index 4c2c3e4..5aa8bf4 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_pkg.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_pkg.sv
@@ -5,12 +5,12 @@
 
 package sensor_ctrl_pkg;
 
-  // Ack mode enumerations
-  typedef enum logic [1:0] {
-    ImmAck,
-    SwAck,
-    NoAck,
-    InvalidAck // not a valid selection
-  } ast_ack_mode_e;
+  // alert position
+  parameter int RecovAlert = 0;
+  parameter int FatalAlert = 1;
+
+  // Total events
+  parameter int TotalEvents = sensor_ctrl_reg_pkg::NumAlertEvents +
+                sensor_ctrl_reg_pkg::NumLocalEvents;
 
 endpackage // sensor_ctrl_pkg
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv
index dc74247..25332bf 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_pkg.sv
@@ -7,7 +7,9 @@
 package sensor_ctrl_reg_pkg;
 
   // Param list
-  parameter int NumAlerts = 13;
+  parameter int NumAlertEvents = 13;
+  parameter int NumLocalEvents = 1;
+  parameter int NumAlerts = 2;
   parameter int NumIoRails = 2;
 
   // Address widths within the block
@@ -21,74 +23,38 @@
     struct packed {
       logic        q;
       logic        qe;
-    } recov_as;
+    } recov_alert;
     struct packed {
       logic        q;
       logic        qe;
-    } recov_cg;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_gd;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ts_hi;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ts_lo;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_fla;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_otp;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ot0;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ot1;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ot2;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ot3;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ot4;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } recov_ot5;
+    } fatal_alert;
   } sensor_ctrl_reg2hw_alert_test_reg_t;
 
   typedef struct packed {
-    logic [1:0]  q;
-  } sensor_ctrl_reg2hw_ack_mode_mreg_t;
-
-  typedef struct packed {
     logic        q;
   } sensor_ctrl_reg2hw_alert_trig_mreg_t;
 
   typedef struct packed {
     logic        q;
-    logic        qe;
-  } sensor_ctrl_reg2hw_alert_state_mreg_t;
+  } sensor_ctrl_reg2hw_fatal_alert_en_mreg_t;
+
+  typedef struct packed {
+    logic        q;
+  } sensor_ctrl_reg2hw_recov_alert_mreg_t;
+
+  typedef struct packed {
+    logic        q;
+  } sensor_ctrl_reg2hw_fatal_alert_mreg_t;
 
   typedef struct packed {
     logic        d;
     logic        de;
-  } sensor_ctrl_hw2reg_alert_state_mreg_t;
+  } sensor_ctrl_hw2reg_recov_alert_mreg_t;
+
+  typedef struct packed {
+    logic        d;
+    logic        de;
+  } sensor_ctrl_hw2reg_fatal_alert_mreg_t;
 
   typedef struct packed {
     struct packed {
@@ -103,60 +69,54 @@
 
   // Register -> HW type
   typedef struct packed {
-    sensor_ctrl_reg2hw_alert_test_reg_t alert_test; // [90:65]
-    sensor_ctrl_reg2hw_ack_mode_mreg_t [12:0] ack_mode; // [64:39]
-    sensor_ctrl_reg2hw_alert_trig_mreg_t [12:0] alert_trig; // [38:26]
-    sensor_ctrl_reg2hw_alert_state_mreg_t [12:0] alert_state; // [25:0]
+    sensor_ctrl_reg2hw_alert_test_reg_t alert_test; // [56:53]
+    sensor_ctrl_reg2hw_alert_trig_mreg_t [12:0] alert_trig; // [52:40]
+    sensor_ctrl_reg2hw_fatal_alert_en_mreg_t [12:0] fatal_alert_en; // [39:27]
+    sensor_ctrl_reg2hw_recov_alert_mreg_t [12:0] recov_alert; // [26:14]
+    sensor_ctrl_reg2hw_fatal_alert_mreg_t [13:0] fatal_alert; // [13:0]
   } sensor_ctrl_reg2hw_t;
 
   // HW -> register type
   typedef struct packed {
-    sensor_ctrl_hw2reg_alert_state_mreg_t [12:0] alert_state; // [30:5]
+    sensor_ctrl_hw2reg_recov_alert_mreg_t [12:0] recov_alert; // [58:33]
+    sensor_ctrl_hw2reg_fatal_alert_mreg_t [13:0] fatal_alert; // [32:5]
     sensor_ctrl_hw2reg_status_reg_t status; // [4:0]
   } sensor_ctrl_hw2reg_t;
 
   // Register offsets
   parameter logic [BlockAw-1:0] SENSOR_CTRL_ALERT_TEST_OFFSET = 5'h 0;
   parameter logic [BlockAw-1:0] SENSOR_CTRL_CFG_REGWEN_OFFSET = 5'h 4;
-  parameter logic [BlockAw-1:0] SENSOR_CTRL_ACK_MODE_OFFSET = 5'h 8;
-  parameter logic [BlockAw-1:0] SENSOR_CTRL_ALERT_TRIG_OFFSET = 5'h c;
-  parameter logic [BlockAw-1:0] SENSOR_CTRL_ALERT_STATE_OFFSET = 5'h 10;
-  parameter logic [BlockAw-1:0] SENSOR_CTRL_STATUS_OFFSET = 5'h 14;
+  parameter logic [BlockAw-1:0] SENSOR_CTRL_ALERT_TRIG_OFFSET = 5'h 8;
+  parameter logic [BlockAw-1:0] SENSOR_CTRL_FATAL_ALERT_EN_OFFSET = 5'h c;
+  parameter logic [BlockAw-1:0] SENSOR_CTRL_RECOV_ALERT_OFFSET = 5'h 10;
+  parameter logic [BlockAw-1:0] SENSOR_CTRL_FATAL_ALERT_OFFSET = 5'h 14;
+  parameter logic [BlockAw-1:0] SENSOR_CTRL_STATUS_OFFSET = 5'h 18;
 
   // Reset values for hwext registers and their fields
-  parameter logic [12:0] SENSOR_CTRL_ALERT_TEST_RESVAL = 13'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_AS_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_CG_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_GD_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_TS_HI_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_TS_LO_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_FLA_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OTP_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT0_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT1_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT2_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT3_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT4_RESVAL = 1'h 0;
-  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_OT5_RESVAL = 1'h 0;
+  parameter logic [1:0] SENSOR_CTRL_ALERT_TEST_RESVAL = 2'h 0;
+  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_RECOV_ALERT_RESVAL = 1'h 0;
+  parameter logic [0:0] SENSOR_CTRL_ALERT_TEST_FATAL_ALERT_RESVAL = 1'h 0;
 
   // Register index
   typedef enum int {
     SENSOR_CTRL_ALERT_TEST,
     SENSOR_CTRL_CFG_REGWEN,
-    SENSOR_CTRL_ACK_MODE,
     SENSOR_CTRL_ALERT_TRIG,
-    SENSOR_CTRL_ALERT_STATE,
+    SENSOR_CTRL_FATAL_ALERT_EN,
+    SENSOR_CTRL_RECOV_ALERT,
+    SENSOR_CTRL_FATAL_ALERT,
     SENSOR_CTRL_STATUS
   } sensor_ctrl_id_e;
 
   // Register width information to check illegal writes
-  parameter logic [3:0] SENSOR_CTRL_PERMIT [6] = '{
-    4'b 0011, // index[0] SENSOR_CTRL_ALERT_TEST
+  parameter logic [3:0] SENSOR_CTRL_PERMIT [7] = '{
+    4'b 0001, // index[0] SENSOR_CTRL_ALERT_TEST
     4'b 0001, // index[1] SENSOR_CTRL_CFG_REGWEN
-    4'b 1111, // index[2] SENSOR_CTRL_ACK_MODE
-    4'b 0011, // index[3] SENSOR_CTRL_ALERT_TRIG
-    4'b 0011, // index[4] SENSOR_CTRL_ALERT_STATE
-    4'b 0001  // index[5] SENSOR_CTRL_STATUS
+    4'b 0011, // index[2] SENSOR_CTRL_ALERT_TRIG
+    4'b 0011, // index[3] SENSOR_CTRL_FATAL_ALERT_EN
+    4'b 0011, // index[4] SENSOR_CTRL_RECOV_ALERT
+    4'b 0011, // index[5] SENSOR_CTRL_FATAL_ALERT
+    4'b 0001  // index[6] SENSOR_CTRL_STATUS
   };
 
 endpackage
diff --git a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv
index e83ca30..265e9c9 100644
--- a/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv
+++ b/hw/top_earlgrey/ip/sensor_ctrl/rtl/sensor_ctrl_reg_top.sv
@@ -109,49 +109,11 @@
   // Format: <reg>_<field>_{wd|we|qs}
   //        or <reg>_{wd|we|qs} if field == 1 or 0
   logic alert_test_we;
-  logic alert_test_recov_as_wd;
-  logic alert_test_recov_cg_wd;
-  logic alert_test_recov_gd_wd;
-  logic alert_test_recov_ts_hi_wd;
-  logic alert_test_recov_ts_lo_wd;
-  logic alert_test_recov_fla_wd;
-  logic alert_test_recov_otp_wd;
-  logic alert_test_recov_ot0_wd;
-  logic alert_test_recov_ot1_wd;
-  logic alert_test_recov_ot2_wd;
-  logic alert_test_recov_ot3_wd;
-  logic alert_test_recov_ot4_wd;
-  logic alert_test_recov_ot5_wd;
+  logic alert_test_recov_alert_wd;
+  logic alert_test_fatal_alert_wd;
   logic cfg_regwen_we;
   logic cfg_regwen_qs;
   logic cfg_regwen_wd;
-  logic ack_mode_we;
-  logic [1:0] ack_mode_val_0_qs;
-  logic [1:0] ack_mode_val_0_wd;
-  logic [1:0] ack_mode_val_1_qs;
-  logic [1:0] ack_mode_val_1_wd;
-  logic [1:0] ack_mode_val_2_qs;
-  logic [1:0] ack_mode_val_2_wd;
-  logic [1:0] ack_mode_val_3_qs;
-  logic [1:0] ack_mode_val_3_wd;
-  logic [1:0] ack_mode_val_4_qs;
-  logic [1:0] ack_mode_val_4_wd;
-  logic [1:0] ack_mode_val_5_qs;
-  logic [1:0] ack_mode_val_5_wd;
-  logic [1:0] ack_mode_val_6_qs;
-  logic [1:0] ack_mode_val_6_wd;
-  logic [1:0] ack_mode_val_7_qs;
-  logic [1:0] ack_mode_val_7_wd;
-  logic [1:0] ack_mode_val_8_qs;
-  logic [1:0] ack_mode_val_8_wd;
-  logic [1:0] ack_mode_val_9_qs;
-  logic [1:0] ack_mode_val_9_wd;
-  logic [1:0] ack_mode_val_10_qs;
-  logic [1:0] ack_mode_val_10_wd;
-  logic [1:0] ack_mode_val_11_qs;
-  logic [1:0] ack_mode_val_11_wd;
-  logic [1:0] ack_mode_val_12_qs;
-  logic [1:0] ack_mode_val_12_wd;
   logic alert_trig_we;
   logic alert_trig_val_0_qs;
   logic alert_trig_val_0_wd;
@@ -179,217 +141,104 @@
   logic alert_trig_val_11_wd;
   logic alert_trig_val_12_qs;
   logic alert_trig_val_12_wd;
-  logic alert_state_we;
-  logic alert_state_val_0_qs;
-  logic alert_state_val_0_wd;
-  logic alert_state_val_1_qs;
-  logic alert_state_val_1_wd;
-  logic alert_state_val_2_qs;
-  logic alert_state_val_2_wd;
-  logic alert_state_val_3_qs;
-  logic alert_state_val_3_wd;
-  logic alert_state_val_4_qs;
-  logic alert_state_val_4_wd;
-  logic alert_state_val_5_qs;
-  logic alert_state_val_5_wd;
-  logic alert_state_val_6_qs;
-  logic alert_state_val_6_wd;
-  logic alert_state_val_7_qs;
-  logic alert_state_val_7_wd;
-  logic alert_state_val_8_qs;
-  logic alert_state_val_8_wd;
-  logic alert_state_val_9_qs;
-  logic alert_state_val_9_wd;
-  logic alert_state_val_10_qs;
-  logic alert_state_val_10_wd;
-  logic alert_state_val_11_qs;
-  logic alert_state_val_11_wd;
-  logic alert_state_val_12_qs;
-  logic alert_state_val_12_wd;
+  logic fatal_alert_en_we;
+  logic fatal_alert_en_val_0_qs;
+  logic fatal_alert_en_val_0_wd;
+  logic fatal_alert_en_val_1_qs;
+  logic fatal_alert_en_val_1_wd;
+  logic fatal_alert_en_val_2_qs;
+  logic fatal_alert_en_val_2_wd;
+  logic fatal_alert_en_val_3_qs;
+  logic fatal_alert_en_val_3_wd;
+  logic fatal_alert_en_val_4_qs;
+  logic fatal_alert_en_val_4_wd;
+  logic fatal_alert_en_val_5_qs;
+  logic fatal_alert_en_val_5_wd;
+  logic fatal_alert_en_val_6_qs;
+  logic fatal_alert_en_val_6_wd;
+  logic fatal_alert_en_val_7_qs;
+  logic fatal_alert_en_val_7_wd;
+  logic fatal_alert_en_val_8_qs;
+  logic fatal_alert_en_val_8_wd;
+  logic fatal_alert_en_val_9_qs;
+  logic fatal_alert_en_val_9_wd;
+  logic fatal_alert_en_val_10_qs;
+  logic fatal_alert_en_val_10_wd;
+  logic fatal_alert_en_val_11_qs;
+  logic fatal_alert_en_val_11_wd;
+  logic fatal_alert_en_val_12_qs;
+  logic fatal_alert_en_val_12_wd;
+  logic recov_alert_we;
+  logic recov_alert_val_0_qs;
+  logic recov_alert_val_0_wd;
+  logic recov_alert_val_1_qs;
+  logic recov_alert_val_1_wd;
+  logic recov_alert_val_2_qs;
+  logic recov_alert_val_2_wd;
+  logic recov_alert_val_3_qs;
+  logic recov_alert_val_3_wd;
+  logic recov_alert_val_4_qs;
+  logic recov_alert_val_4_wd;
+  logic recov_alert_val_5_qs;
+  logic recov_alert_val_5_wd;
+  logic recov_alert_val_6_qs;
+  logic recov_alert_val_6_wd;
+  logic recov_alert_val_7_qs;
+  logic recov_alert_val_7_wd;
+  logic recov_alert_val_8_qs;
+  logic recov_alert_val_8_wd;
+  logic recov_alert_val_9_qs;
+  logic recov_alert_val_9_wd;
+  logic recov_alert_val_10_qs;
+  logic recov_alert_val_10_wd;
+  logic recov_alert_val_11_qs;
+  logic recov_alert_val_11_wd;
+  logic recov_alert_val_12_qs;
+  logic recov_alert_val_12_wd;
+  logic fatal_alert_val_0_qs;
+  logic fatal_alert_val_1_qs;
+  logic fatal_alert_val_2_qs;
+  logic fatal_alert_val_3_qs;
+  logic fatal_alert_val_4_qs;
+  logic fatal_alert_val_5_qs;
+  logic fatal_alert_val_6_qs;
+  logic fatal_alert_val_7_qs;
+  logic fatal_alert_val_8_qs;
+  logic fatal_alert_val_9_qs;
+  logic fatal_alert_val_10_qs;
+  logic fatal_alert_val_11_qs;
+  logic fatal_alert_val_12_qs;
+  logic fatal_alert_val_13_qs;
   logic status_ast_init_done_qs;
   logic [1:0] status_io_pok_qs;
 
   // Register instances
   // R[alert_test]: V(True)
-  //   F[recov_as]: 0:0
+  //   F[recov_alert]: 0:0
   prim_subreg_ext #(
     .DW    (1)
-  ) u_alert_test_recov_as (
+  ) u_alert_test_recov_alert (
     .re     (1'b0),
     .we     (alert_test_we),
-    .wd     (alert_test_recov_as_wd),
+    .wd     (alert_test_recov_alert_wd),
     .d      ('0),
     .qre    (),
-    .qe     (reg2hw.alert_test.recov_as.qe),
-    .q      (reg2hw.alert_test.recov_as.q),
+    .qe     (reg2hw.alert_test.recov_alert.qe),
+    .q      (reg2hw.alert_test.recov_alert.q),
     .qs     ()
   );
 
-  //   F[recov_cg]: 1:1
+  //   F[fatal_alert]: 1:1
   prim_subreg_ext #(
     .DW    (1)
-  ) u_alert_test_recov_cg (
+  ) u_alert_test_fatal_alert (
     .re     (1'b0),
     .we     (alert_test_we),
-    .wd     (alert_test_recov_cg_wd),
+    .wd     (alert_test_fatal_alert_wd),
     .d      ('0),
     .qre    (),
-    .qe     (reg2hw.alert_test.recov_cg.qe),
-    .q      (reg2hw.alert_test.recov_cg.q),
-    .qs     ()
-  );
-
-  //   F[recov_gd]: 2:2
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_gd (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_gd_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_gd.qe),
-    .q      (reg2hw.alert_test.recov_gd.q),
-    .qs     ()
-  );
-
-  //   F[recov_ts_hi]: 3:3
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ts_hi (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ts_hi_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ts_hi.qe),
-    .q      (reg2hw.alert_test.recov_ts_hi.q),
-    .qs     ()
-  );
-
-  //   F[recov_ts_lo]: 4:4
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ts_lo (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ts_lo_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ts_lo.qe),
-    .q      (reg2hw.alert_test.recov_ts_lo.q),
-    .qs     ()
-  );
-
-  //   F[recov_fla]: 5:5
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_fla (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_fla_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_fla.qe),
-    .q      (reg2hw.alert_test.recov_fla.q),
-    .qs     ()
-  );
-
-  //   F[recov_otp]: 6:6
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_otp (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_otp_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_otp.qe),
-    .q      (reg2hw.alert_test.recov_otp.q),
-    .qs     ()
-  );
-
-  //   F[recov_ot0]: 7:7
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ot0 (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ot0_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ot0.qe),
-    .q      (reg2hw.alert_test.recov_ot0.q),
-    .qs     ()
-  );
-
-  //   F[recov_ot1]: 8:8
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ot1 (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ot1_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ot1.qe),
-    .q      (reg2hw.alert_test.recov_ot1.q),
-    .qs     ()
-  );
-
-  //   F[recov_ot2]: 9:9
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ot2 (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ot2_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ot2.qe),
-    .q      (reg2hw.alert_test.recov_ot2.q),
-    .qs     ()
-  );
-
-  //   F[recov_ot3]: 10:10
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ot3 (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ot3_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ot3.qe),
-    .q      (reg2hw.alert_test.recov_ot3.q),
-    .qs     ()
-  );
-
-  //   F[recov_ot4]: 11:11
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ot4 (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ot4_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ot4.qe),
-    .q      (reg2hw.alert_test.recov_ot4.q),
-    .qs     ()
-  );
-
-  //   F[recov_ot5]: 12:12
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_alert_test_recov_ot5 (
-    .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_recov_ot5_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.alert_test.recov_ot5.qe),
-    .q      (reg2hw.alert_test.recov_ot5.q),
+    .qe     (reg2hw.alert_test.fatal_alert.qe),
+    .q      (reg2hw.alert_test.fatal_alert.q),
     .qs     ()
   );
 
@@ -420,334 +269,6 @@
   );
 
 
-  // Subregister 0 of Multireg ack_mode
-  // R[ack_mode]: V(False)
-  //   F[val_0]: 1:0
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_0 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_0_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[0].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_0_qs)
-  );
-
-  //   F[val_1]: 3:2
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_1 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_1_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[1].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_1_qs)
-  );
-
-  //   F[val_2]: 5:4
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_2 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_2_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[2].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_2_qs)
-  );
-
-  //   F[val_3]: 7:6
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_3 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_3_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[3].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_3_qs)
-  );
-
-  //   F[val_4]: 9:8
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_4 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_4_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[4].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_4_qs)
-  );
-
-  //   F[val_5]: 11:10
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_5 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_5_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[5].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_5_qs)
-  );
-
-  //   F[val_6]: 13:12
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_6 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_6_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[6].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_6_qs)
-  );
-
-  //   F[val_7]: 15:14
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_7 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_7_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[7].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_7_qs)
-  );
-
-  //   F[val_8]: 17:16
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_8 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_8_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[8].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_8_qs)
-  );
-
-  //   F[val_9]: 19:18
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_9 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_9_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[9].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_9_qs)
-  );
-
-  //   F[val_10]: 21:20
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_10 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_10_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[10].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_10_qs)
-  );
-
-  //   F[val_11]: 23:22
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_11 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_11_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[11].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_11_qs)
-  );
-
-  //   F[val_12]: 25:24
-  prim_subreg #(
-    .DW      (2),
-    .SwAccess(prim_subreg_pkg::SwAccessRW),
-    .RESVAL  (2'h0)
-  ) u_ack_mode_val_12 (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (ack_mode_we & cfg_regwen_qs),
-    .wd     (ack_mode_val_12_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.ack_mode[12].q),
-
-    // to register interface (read)
-    .qs     (ack_mode_val_12_qs)
-  );
-
-
   // Subregister 0 of Multireg alert_trig
   // R[alert_trig]: V(False)
   //   F[val_0]: 0:0
@@ -1076,31 +597,359 @@
   );
 
 
-  // Subregister 0 of Multireg alert_state
-  // R[alert_state]: V(False)
+  // Subregister 0 of Multireg fatal_alert_en
+  // R[fatal_alert_en]: V(False)
+  //   F[val_0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[0].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_0_qs)
+  );
+
+  //   F[val_1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[1].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_1_qs)
+  );
+
+  //   F[val_2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[2].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_2_qs)
+  );
+
+  //   F[val_3]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[3].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_3_qs)
+  );
+
+  //   F[val_4]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[4].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_4_qs)
+  );
+
+  //   F[val_5]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_5_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[5].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_5_qs)
+  );
+
+  //   F[val_6]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_6_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[6].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_6_qs)
+  );
+
+  //   F[val_7]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_7_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[7].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_7_qs)
+  );
+
+  //   F[val_8]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[8].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_8_qs)
+  );
+
+  //   F[val_9]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_9 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_9_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[9].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_9_qs)
+  );
+
+  //   F[val_10]: 10:10
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_10 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_10_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[10].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_10_qs)
+  );
+
+  //   F[val_11]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_11_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[11].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_11_qs)
+  );
+
+  //   F[val_12]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_en_val_12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (fatal_alert_en_we & cfg_regwen_qs),
+    .wd     (fatal_alert_en_val_12_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert_en[12].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_en_val_12_qs)
+  );
+
+
+  // Subregister 0 of Multireg recov_alert
+  // R[recov_alert]: V(False)
   //   F[val_0]: 0:0
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_0 (
+  ) u_recov_alert_val_0 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_0_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_0_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[0].de),
-    .d      (hw2reg.alert_state[0].d),
+    .de     (hw2reg.recov_alert[0].de),
+    .d      (hw2reg.recov_alert[0].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[0].qe),
-    .q      (reg2hw.alert_state[0].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[0].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_0_qs)
+    .qs     (recov_alert_val_0_qs)
   );
 
   //   F[val_1]: 1:1
@@ -1108,24 +957,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_1 (
+  ) u_recov_alert_val_1 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_1_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_1_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[1].de),
-    .d      (hw2reg.alert_state[1].d),
+    .de     (hw2reg.recov_alert[1].de),
+    .d      (hw2reg.recov_alert[1].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[1].qe),
-    .q      (reg2hw.alert_state[1].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[1].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_1_qs)
+    .qs     (recov_alert_val_1_qs)
   );
 
   //   F[val_2]: 2:2
@@ -1133,24 +982,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_2 (
+  ) u_recov_alert_val_2 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_2_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_2_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[2].de),
-    .d      (hw2reg.alert_state[2].d),
+    .de     (hw2reg.recov_alert[2].de),
+    .d      (hw2reg.recov_alert[2].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[2].qe),
-    .q      (reg2hw.alert_state[2].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[2].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_2_qs)
+    .qs     (recov_alert_val_2_qs)
   );
 
   //   F[val_3]: 3:3
@@ -1158,24 +1007,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_3 (
+  ) u_recov_alert_val_3 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_3_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_3_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[3].de),
-    .d      (hw2reg.alert_state[3].d),
+    .de     (hw2reg.recov_alert[3].de),
+    .d      (hw2reg.recov_alert[3].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[3].qe),
-    .q      (reg2hw.alert_state[3].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[3].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_3_qs)
+    .qs     (recov_alert_val_3_qs)
   );
 
   //   F[val_4]: 4:4
@@ -1183,24 +1032,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_4 (
+  ) u_recov_alert_val_4 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_4_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_4_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[4].de),
-    .d      (hw2reg.alert_state[4].d),
+    .de     (hw2reg.recov_alert[4].de),
+    .d      (hw2reg.recov_alert[4].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[4].qe),
-    .q      (reg2hw.alert_state[4].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[4].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_4_qs)
+    .qs     (recov_alert_val_4_qs)
   );
 
   //   F[val_5]: 5:5
@@ -1208,24 +1057,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_5 (
+  ) u_recov_alert_val_5 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_5_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_5_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[5].de),
-    .d      (hw2reg.alert_state[5].d),
+    .de     (hw2reg.recov_alert[5].de),
+    .d      (hw2reg.recov_alert[5].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[5].qe),
-    .q      (reg2hw.alert_state[5].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[5].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_5_qs)
+    .qs     (recov_alert_val_5_qs)
   );
 
   //   F[val_6]: 6:6
@@ -1233,24 +1082,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_6 (
+  ) u_recov_alert_val_6 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_6_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_6_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[6].de),
-    .d      (hw2reg.alert_state[6].d),
+    .de     (hw2reg.recov_alert[6].de),
+    .d      (hw2reg.recov_alert[6].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[6].qe),
-    .q      (reg2hw.alert_state[6].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[6].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_6_qs)
+    .qs     (recov_alert_val_6_qs)
   );
 
   //   F[val_7]: 7:7
@@ -1258,24 +1107,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_7 (
+  ) u_recov_alert_val_7 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_7_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_7_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[7].de),
-    .d      (hw2reg.alert_state[7].d),
+    .de     (hw2reg.recov_alert[7].de),
+    .d      (hw2reg.recov_alert[7].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[7].qe),
-    .q      (reg2hw.alert_state[7].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[7].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_7_qs)
+    .qs     (recov_alert_val_7_qs)
   );
 
   //   F[val_8]: 8:8
@@ -1283,24 +1132,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_8 (
+  ) u_recov_alert_val_8 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_8_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_8_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[8].de),
-    .d      (hw2reg.alert_state[8].d),
+    .de     (hw2reg.recov_alert[8].de),
+    .d      (hw2reg.recov_alert[8].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[8].qe),
-    .q      (reg2hw.alert_state[8].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[8].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_8_qs)
+    .qs     (recov_alert_val_8_qs)
   );
 
   //   F[val_9]: 9:9
@@ -1308,24 +1157,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_9 (
+  ) u_recov_alert_val_9 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_9_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_9_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[9].de),
-    .d      (hw2reg.alert_state[9].d),
+    .de     (hw2reg.recov_alert[9].de),
+    .d      (hw2reg.recov_alert[9].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[9].qe),
-    .q      (reg2hw.alert_state[9].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[9].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_9_qs)
+    .qs     (recov_alert_val_9_qs)
   );
 
   //   F[val_10]: 10:10
@@ -1333,24 +1182,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_10 (
+  ) u_recov_alert_val_10 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_10_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_10_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[10].de),
-    .d      (hw2reg.alert_state[10].d),
+    .de     (hw2reg.recov_alert[10].de),
+    .d      (hw2reg.recov_alert[10].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[10].qe),
-    .q      (reg2hw.alert_state[10].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[10].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_10_qs)
+    .qs     (recov_alert_val_10_qs)
   );
 
   //   F[val_11]: 11:11
@@ -1358,24 +1207,24 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_11 (
+  ) u_recov_alert_val_11 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_11_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_11_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[11].de),
-    .d      (hw2reg.alert_state[11].d),
+    .de     (hw2reg.recov_alert[11].de),
+    .d      (hw2reg.recov_alert[11].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[11].qe),
-    .q      (reg2hw.alert_state[11].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[11].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_11_qs)
+    .qs     (recov_alert_val_11_qs)
   );
 
   //   F[val_12]: 12:12
@@ -1383,24 +1232,377 @@
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
     .RESVAL  (1'h0)
-  ) u_alert_state_val_12 (
+  ) u_recov_alert_val_12 (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (alert_state_we),
-    .wd     (alert_state_val_12_wd),
+    .we     (recov_alert_we),
+    .wd     (recov_alert_val_12_wd),
 
     // from internal hardware
-    .de     (hw2reg.alert_state[12].de),
-    .d      (hw2reg.alert_state[12].d),
+    .de     (hw2reg.recov_alert[12].de),
+    .d      (hw2reg.recov_alert[12].d),
 
     // to internal hardware
-    .qe     (reg2hw.alert_state[12].qe),
-    .q      (reg2hw.alert_state[12].q),
+    .qe     (),
+    .q      (reg2hw.recov_alert[12].q),
 
     // to register interface (read)
-    .qs     (alert_state_val_12_qs)
+    .qs     (recov_alert_val_12_qs)
+  );
+
+
+  // Subregister 0 of Multireg fatal_alert
+  // R[fatal_alert]: V(False)
+  //   F[val_0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[0].de),
+    .d      (hw2reg.fatal_alert[0].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[0].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_0_qs)
+  );
+
+  //   F[val_1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[1].de),
+    .d      (hw2reg.fatal_alert[1].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[1].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_1_qs)
+  );
+
+  //   F[val_2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[2].de),
+    .d      (hw2reg.fatal_alert[2].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[2].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_2_qs)
+  );
+
+  //   F[val_3]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[3].de),
+    .d      (hw2reg.fatal_alert[3].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[3].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_3_qs)
+  );
+
+  //   F[val_4]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[4].de),
+    .d      (hw2reg.fatal_alert[4].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[4].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_4_qs)
+  );
+
+  //   F[val_5]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[5].de),
+    .d      (hw2reg.fatal_alert[5].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[5].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_5_qs)
+  );
+
+  //   F[val_6]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[6].de),
+    .d      (hw2reg.fatal_alert[6].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[6].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_6_qs)
+  );
+
+  //   F[val_7]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[7].de),
+    .d      (hw2reg.fatal_alert[7].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[7].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_7_qs)
+  );
+
+  //   F[val_8]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[8].de),
+    .d      (hw2reg.fatal_alert[8].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[8].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_8_qs)
+  );
+
+  //   F[val_9]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_9 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[9].de),
+    .d      (hw2reg.fatal_alert[9].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[9].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_9_qs)
+  );
+
+  //   F[val_10]: 10:10
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_10 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[10].de),
+    .d      (hw2reg.fatal_alert[10].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[10].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_10_qs)
+  );
+
+  //   F[val_11]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[11].de),
+    .d      (hw2reg.fatal_alert[11].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[11].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_11_qs)
+  );
+
+  //   F[val_12]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[12].de),
+    .d      (hw2reg.fatal_alert[12].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[12].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_12_qs)
+  );
+
+  //   F[val_13]: 13:13
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRO),
+    .RESVAL  (1'h0)
+  ) u_fatal_alert_val_13 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (1'b0),
+    .wd     ('0),
+
+    // from internal hardware
+    .de     (hw2reg.fatal_alert[13].de),
+    .d      (hw2reg.fatal_alert[13].d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.fatal_alert[13].q),
+
+    // to register interface (read)
+    .qs     (fatal_alert_val_13_qs)
   );
 
 
@@ -1457,15 +1659,16 @@
 
 
 
-  logic [5:0] addr_hit;
+  logic [6:0] addr_hit;
   always_comb begin
     addr_hit = '0;
     addr_hit[0] = (reg_addr == SENSOR_CTRL_ALERT_TEST_OFFSET);
     addr_hit[1] = (reg_addr == SENSOR_CTRL_CFG_REGWEN_OFFSET);
-    addr_hit[2] = (reg_addr == SENSOR_CTRL_ACK_MODE_OFFSET);
-    addr_hit[3] = (reg_addr == SENSOR_CTRL_ALERT_TRIG_OFFSET);
-    addr_hit[4] = (reg_addr == SENSOR_CTRL_ALERT_STATE_OFFSET);
-    addr_hit[5] = (reg_addr == SENSOR_CTRL_STATUS_OFFSET);
+    addr_hit[2] = (reg_addr == SENSOR_CTRL_ALERT_TRIG_OFFSET);
+    addr_hit[3] = (reg_addr == SENSOR_CTRL_FATAL_ALERT_EN_OFFSET);
+    addr_hit[4] = (reg_addr == SENSOR_CTRL_RECOV_ALERT_OFFSET);
+    addr_hit[5] = (reg_addr == SENSOR_CTRL_FATAL_ALERT_OFFSET);
+    addr_hit[6] = (reg_addr == SENSOR_CTRL_STATUS_OFFSET);
   end
 
   assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -1478,66 +1681,18 @@
                (addr_hit[2] & (|(SENSOR_CTRL_PERMIT[2] & ~reg_be))) |
                (addr_hit[3] & (|(SENSOR_CTRL_PERMIT[3] & ~reg_be))) |
                (addr_hit[4] & (|(SENSOR_CTRL_PERMIT[4] & ~reg_be))) |
-               (addr_hit[5] & (|(SENSOR_CTRL_PERMIT[5] & ~reg_be)))));
+               (addr_hit[5] & (|(SENSOR_CTRL_PERMIT[5] & ~reg_be))) |
+               (addr_hit[6] & (|(SENSOR_CTRL_PERMIT[6] & ~reg_be)))));
   end
   assign alert_test_we = addr_hit[0] & reg_we & !reg_error;
 
-  assign alert_test_recov_as_wd = reg_wdata[0];
+  assign alert_test_recov_alert_wd = reg_wdata[0];
 
-  assign alert_test_recov_cg_wd = reg_wdata[1];
-
-  assign alert_test_recov_gd_wd = reg_wdata[2];
-
-  assign alert_test_recov_ts_hi_wd = reg_wdata[3];
-
-  assign alert_test_recov_ts_lo_wd = reg_wdata[4];
-
-  assign alert_test_recov_fla_wd = reg_wdata[5];
-
-  assign alert_test_recov_otp_wd = reg_wdata[6];
-
-  assign alert_test_recov_ot0_wd = reg_wdata[7];
-
-  assign alert_test_recov_ot1_wd = reg_wdata[8];
-
-  assign alert_test_recov_ot2_wd = reg_wdata[9];
-
-  assign alert_test_recov_ot3_wd = reg_wdata[10];
-
-  assign alert_test_recov_ot4_wd = reg_wdata[11];
-
-  assign alert_test_recov_ot5_wd = reg_wdata[12];
+  assign alert_test_fatal_alert_wd = reg_wdata[1];
   assign cfg_regwen_we = addr_hit[1] & reg_we & !reg_error;
 
   assign cfg_regwen_wd = reg_wdata[0];
-  assign ack_mode_we = addr_hit[2] & reg_we & !reg_error;
-
-  assign ack_mode_val_0_wd = reg_wdata[1:0];
-
-  assign ack_mode_val_1_wd = reg_wdata[3:2];
-
-  assign ack_mode_val_2_wd = reg_wdata[5:4];
-
-  assign ack_mode_val_3_wd = reg_wdata[7:6];
-
-  assign ack_mode_val_4_wd = reg_wdata[9:8];
-
-  assign ack_mode_val_5_wd = reg_wdata[11:10];
-
-  assign ack_mode_val_6_wd = reg_wdata[13:12];
-
-  assign ack_mode_val_7_wd = reg_wdata[15:14];
-
-  assign ack_mode_val_8_wd = reg_wdata[17:16];
-
-  assign ack_mode_val_9_wd = reg_wdata[19:18];
-
-  assign ack_mode_val_10_wd = reg_wdata[21:20];
-
-  assign ack_mode_val_11_wd = reg_wdata[23:22];
-
-  assign ack_mode_val_12_wd = reg_wdata[25:24];
-  assign alert_trig_we = addr_hit[3] & reg_we & !reg_error;
+  assign alert_trig_we = addr_hit[2] & reg_we & !reg_error;
 
   assign alert_trig_val_0_wd = reg_wdata[0];
 
@@ -1564,33 +1719,60 @@
   assign alert_trig_val_11_wd = reg_wdata[11];
 
   assign alert_trig_val_12_wd = reg_wdata[12];
-  assign alert_state_we = addr_hit[4] & reg_we & !reg_error;
+  assign fatal_alert_en_we = addr_hit[3] & reg_we & !reg_error;
 
-  assign alert_state_val_0_wd = reg_wdata[0];
+  assign fatal_alert_en_val_0_wd = reg_wdata[0];
 
-  assign alert_state_val_1_wd = reg_wdata[1];
+  assign fatal_alert_en_val_1_wd = reg_wdata[1];
 
-  assign alert_state_val_2_wd = reg_wdata[2];
+  assign fatal_alert_en_val_2_wd = reg_wdata[2];
 
-  assign alert_state_val_3_wd = reg_wdata[3];
+  assign fatal_alert_en_val_3_wd = reg_wdata[3];
 
-  assign alert_state_val_4_wd = reg_wdata[4];
+  assign fatal_alert_en_val_4_wd = reg_wdata[4];
 
-  assign alert_state_val_5_wd = reg_wdata[5];
+  assign fatal_alert_en_val_5_wd = reg_wdata[5];
 
-  assign alert_state_val_6_wd = reg_wdata[6];
+  assign fatal_alert_en_val_6_wd = reg_wdata[6];
 
-  assign alert_state_val_7_wd = reg_wdata[7];
+  assign fatal_alert_en_val_7_wd = reg_wdata[7];
 
-  assign alert_state_val_8_wd = reg_wdata[8];
+  assign fatal_alert_en_val_8_wd = reg_wdata[8];
 
-  assign alert_state_val_9_wd = reg_wdata[9];
+  assign fatal_alert_en_val_9_wd = reg_wdata[9];
 
-  assign alert_state_val_10_wd = reg_wdata[10];
+  assign fatal_alert_en_val_10_wd = reg_wdata[10];
 
-  assign alert_state_val_11_wd = reg_wdata[11];
+  assign fatal_alert_en_val_11_wd = reg_wdata[11];
 
-  assign alert_state_val_12_wd = reg_wdata[12];
+  assign fatal_alert_en_val_12_wd = reg_wdata[12];
+  assign recov_alert_we = addr_hit[4] & reg_we & !reg_error;
+
+  assign recov_alert_val_0_wd = reg_wdata[0];
+
+  assign recov_alert_val_1_wd = reg_wdata[1];
+
+  assign recov_alert_val_2_wd = reg_wdata[2];
+
+  assign recov_alert_val_3_wd = reg_wdata[3];
+
+  assign recov_alert_val_4_wd = reg_wdata[4];
+
+  assign recov_alert_val_5_wd = reg_wdata[5];
+
+  assign recov_alert_val_6_wd = reg_wdata[6];
+
+  assign recov_alert_val_7_wd = reg_wdata[7];
+
+  assign recov_alert_val_8_wd = reg_wdata[8];
+
+  assign recov_alert_val_9_wd = reg_wdata[9];
+
+  assign recov_alert_val_10_wd = reg_wdata[10];
+
+  assign recov_alert_val_11_wd = reg_wdata[11];
+
+  assign recov_alert_val_12_wd = reg_wdata[12];
 
   // Read data return
   always_comb begin
@@ -1599,17 +1781,6 @@
       addr_hit[0]: begin
         reg_rdata_next[0] = '0;
         reg_rdata_next[1] = '0;
-        reg_rdata_next[2] = '0;
-        reg_rdata_next[3] = '0;
-        reg_rdata_next[4] = '0;
-        reg_rdata_next[5] = '0;
-        reg_rdata_next[6] = '0;
-        reg_rdata_next[7] = '0;
-        reg_rdata_next[8] = '0;
-        reg_rdata_next[9] = '0;
-        reg_rdata_next[10] = '0;
-        reg_rdata_next[11] = '0;
-        reg_rdata_next[12] = '0;
       end
 
       addr_hit[1]: begin
@@ -1617,22 +1788,6 @@
       end
 
       addr_hit[2]: begin
-        reg_rdata_next[1:0] = ack_mode_val_0_qs;
-        reg_rdata_next[3:2] = ack_mode_val_1_qs;
-        reg_rdata_next[5:4] = ack_mode_val_2_qs;
-        reg_rdata_next[7:6] = ack_mode_val_3_qs;
-        reg_rdata_next[9:8] = ack_mode_val_4_qs;
-        reg_rdata_next[11:10] = ack_mode_val_5_qs;
-        reg_rdata_next[13:12] = ack_mode_val_6_qs;
-        reg_rdata_next[15:14] = ack_mode_val_7_qs;
-        reg_rdata_next[17:16] = ack_mode_val_8_qs;
-        reg_rdata_next[19:18] = ack_mode_val_9_qs;
-        reg_rdata_next[21:20] = ack_mode_val_10_qs;
-        reg_rdata_next[23:22] = ack_mode_val_11_qs;
-        reg_rdata_next[25:24] = ack_mode_val_12_qs;
-      end
-
-      addr_hit[3]: begin
         reg_rdata_next[0] = alert_trig_val_0_qs;
         reg_rdata_next[1] = alert_trig_val_1_qs;
         reg_rdata_next[2] = alert_trig_val_2_qs;
@@ -1648,23 +1803,56 @@
         reg_rdata_next[12] = alert_trig_val_12_qs;
       end
 
+      addr_hit[3]: begin
+        reg_rdata_next[0] = fatal_alert_en_val_0_qs;
+        reg_rdata_next[1] = fatal_alert_en_val_1_qs;
+        reg_rdata_next[2] = fatal_alert_en_val_2_qs;
+        reg_rdata_next[3] = fatal_alert_en_val_3_qs;
+        reg_rdata_next[4] = fatal_alert_en_val_4_qs;
+        reg_rdata_next[5] = fatal_alert_en_val_5_qs;
+        reg_rdata_next[6] = fatal_alert_en_val_6_qs;
+        reg_rdata_next[7] = fatal_alert_en_val_7_qs;
+        reg_rdata_next[8] = fatal_alert_en_val_8_qs;
+        reg_rdata_next[9] = fatal_alert_en_val_9_qs;
+        reg_rdata_next[10] = fatal_alert_en_val_10_qs;
+        reg_rdata_next[11] = fatal_alert_en_val_11_qs;
+        reg_rdata_next[12] = fatal_alert_en_val_12_qs;
+      end
+
       addr_hit[4]: begin
-        reg_rdata_next[0] = alert_state_val_0_qs;
-        reg_rdata_next[1] = alert_state_val_1_qs;
-        reg_rdata_next[2] = alert_state_val_2_qs;
-        reg_rdata_next[3] = alert_state_val_3_qs;
-        reg_rdata_next[4] = alert_state_val_4_qs;
-        reg_rdata_next[5] = alert_state_val_5_qs;
-        reg_rdata_next[6] = alert_state_val_6_qs;
-        reg_rdata_next[7] = alert_state_val_7_qs;
-        reg_rdata_next[8] = alert_state_val_8_qs;
-        reg_rdata_next[9] = alert_state_val_9_qs;
-        reg_rdata_next[10] = alert_state_val_10_qs;
-        reg_rdata_next[11] = alert_state_val_11_qs;
-        reg_rdata_next[12] = alert_state_val_12_qs;
+        reg_rdata_next[0] = recov_alert_val_0_qs;
+        reg_rdata_next[1] = recov_alert_val_1_qs;
+        reg_rdata_next[2] = recov_alert_val_2_qs;
+        reg_rdata_next[3] = recov_alert_val_3_qs;
+        reg_rdata_next[4] = recov_alert_val_4_qs;
+        reg_rdata_next[5] = recov_alert_val_5_qs;
+        reg_rdata_next[6] = recov_alert_val_6_qs;
+        reg_rdata_next[7] = recov_alert_val_7_qs;
+        reg_rdata_next[8] = recov_alert_val_8_qs;
+        reg_rdata_next[9] = recov_alert_val_9_qs;
+        reg_rdata_next[10] = recov_alert_val_10_qs;
+        reg_rdata_next[11] = recov_alert_val_11_qs;
+        reg_rdata_next[12] = recov_alert_val_12_qs;
       end
 
       addr_hit[5]: begin
+        reg_rdata_next[0] = fatal_alert_val_0_qs;
+        reg_rdata_next[1] = fatal_alert_val_1_qs;
+        reg_rdata_next[2] = fatal_alert_val_2_qs;
+        reg_rdata_next[3] = fatal_alert_val_3_qs;
+        reg_rdata_next[4] = fatal_alert_val_4_qs;
+        reg_rdata_next[5] = fatal_alert_val_5_qs;
+        reg_rdata_next[6] = fatal_alert_val_6_qs;
+        reg_rdata_next[7] = fatal_alert_val_7_qs;
+        reg_rdata_next[8] = fatal_alert_val_8_qs;
+        reg_rdata_next[9] = fatal_alert_val_9_qs;
+        reg_rdata_next[10] = fatal_alert_val_10_qs;
+        reg_rdata_next[11] = fatal_alert_val_11_qs;
+        reg_rdata_next[12] = fatal_alert_val_12_qs;
+        reg_rdata_next[13] = fatal_alert_val_13_qs;
+      end
+
+      addr_hit[6]: begin
         reg_rdata_next[0] = status_ast_init_done_qs;
         reg_rdata_next[2:1] = status_io_pok_qs;
       end
diff --git a/hw/top_englishbreakfast/data/top_englishbreakfast.hjson b/hw/top_englishbreakfast/data/top_englishbreakfast.hjson
index 8501309..35c5c7a 100644
--- a/hw/top_englishbreakfast/data/top_englishbreakfast.hjson
+++ b/hw/top_englishbreakfast/data/top_englishbreakfast.hjson
@@ -278,15 +278,6 @@
       base_addr: "0x40470000",
       attr: "templated",
     },
-    { name: "sensor_ctrl_aon",
-      type: "sensor_ctrl",
-      clock_srcs: {clk_i: "io_div4"},
-      clock_group: "secure",
-      reset_connections: {rst_ni: "sys_io_div4"},
-      domain: ["Aon"],
-      base_addr: "0x40490000",
-      attr: "reggen_top",
-    },
     { name: "sram_ctrl_ret_aon",
       type: "sram_ctrl",
       clock_srcs: {clk_i: "io_div4", clk_otp_i: "io_div4"},
@@ -632,10 +623,6 @@
         # 'otp_ctrl.otp_ast_pwr_seq_h'   : '',
         # 'otp_ctrl.otp_alert'           : 'otp_alert',
         'rstmgr_aon.por_n'             : 'por_n'
-        'sensor_ctrl_aon.ast_alert'    : 'sensor_ctrl_ast_alert',
-        'sensor_ctrl_aon.ast_status'   : 'sensor_ctrl_ast_status',
-        'sensor_ctrl_aon.ast2pinmux'   : '',
-        # 'sensor_ctrl_aon.ast_init_done': 'ast_init_done',
         'usbdev.usb_ref_val'           : '',
         'usbdev.usb_ref_pulse'         : '',
     },
@@ -834,7 +821,6 @@
       { instance: "gpio",            port: '',      connection: 'muxed' , pad: ''             , desc: ''},
       { instance: "uart0",           port: '',      connection: 'muxed' , pad: ''             , desc: ''},
       { instance: "flash_ctrl",      port: '',      connection: 'muxed' , pad: ''             , desc: ''},
-      { instance: "sensor_ctrl_aon", port: '',      connection: 'muxed' , pad: ''             , desc: ''},
     ],
 
     // Number of wakeup detectors to instantiate, and bitwidth for the wakeup counters.
diff --git a/hw/top_englishbreakfast/data/xbar_peri.hjson b/hw/top_englishbreakfast/data/xbar_peri.hjson
index e8f96f9..4cc54e4 100644
--- a/hw/top_englishbreakfast/data/xbar_peri.hjson
+++ b/hw/top_englishbreakfast/data/xbar_peri.hjson
@@ -81,12 +81,6 @@
       reset:     "rst_peri_ni",
       pipeline:  "false"
     },
-    { name:      "sensor_ctrl_aon",
-      type:      "device",
-      clock:     "clk_peri_i",
-      reset:     "rst_peri_ni",
-      pipeline:  "false",
-    },
     { name:      "sram_ctrl_ret_aon.regs",
       type:      "device",
       clock:     "clk_peri_i",
@@ -105,7 +99,7 @@
       "uart0",
       "gpio", "spi_device", "spi_host0", "rv_timer", "usbdev",
       "pwrmgr_aon", "rstmgr_aon", "clkmgr_aon", "pinmux_aon",
-      "lc_ctrl", "sensor_ctrl_aon",
+      "lc_ctrl",
       "sram_ctrl_ret_aon.ram", "sram_ctrl_ret_aon.regs",
     ],
   },
diff --git a/hw/top_englishbreakfast/rtl/chip_englishbreakfast_verilator.sv b/hw/top_englishbreakfast/rtl/chip_englishbreakfast_verilator.sv
index 8f3e8a1..c5043a3 100644
--- a/hw/top_englishbreakfast/rtl/chip_englishbreakfast_verilator.sv
+++ b/hw/top_englishbreakfast/rtl/chip_englishbreakfast_verilator.sv
@@ -170,9 +170,6 @@
     .clk_main_jitter_en_o         (                  ),
     .pwrmgr_ast_req_o             (                  ),
     .pwrmgr_ast_rsp_i             ( ast_base_pwr     ),
-    .sensor_ctrl_ast_alert_req_i  ( ast_base_alerts  ),
-    .sensor_ctrl_ast_alert_rsp_o  (                  ),
-    .sensor_ctrl_ast_status_i     ( ast_base_status  ),
     .usbdev_usb_ref_val_o         (                  ),
     .usbdev_usb_ref_pulse_o       (                  ),
     .ast_edn_req_i                ( '0               ),
diff --git a/sw/device/lib/dif/dif_alert_handler_unittest.cc b/sw/device/lib/dif/dif_alert_handler_unittest.cc
index b2a5f4b..0578760 100644
--- a/sw/device/lib/dif/dif_alert_handler_unittest.cc
+++ b/sw/device/lib/dif/dif_alert_handler_unittest.cc
@@ -59,7 +59,7 @@
 }
 
 INSTANTIATE_TEST_SUITE_P(InitTestSignalCounts, InitTest,
-                         testing::Values(1, 2, 12, 16, 24, 32, 64,
+                         testing::Values(1, 2, 12, 16, 24, 32, 48,
                                          ALERT_HANDLER_PARAM_N_ALERTS));
 
 class ConfigTest : public AlertTest {
diff --git a/util/topgen/templates/chiplevel.sv.tpl b/util/topgen/templates/chiplevel.sv.tpl
index 998091f..bf8453e 100644
--- a/util/topgen/templates/chiplevel.sv.tpl
+++ b/util/topgen/templates/chiplevel.sv.tpl
@@ -1099,9 +1099,6 @@
     .rsts_ast_o                   (                  ),
     .pwrmgr_ast_req_o             (                  ),
     .pwrmgr_ast_rsp_i             ( ast_base_pwr     ),
-    .sensor_ctrl_ast_alert_req_i  ( ast_base_alerts  ),
-    .sensor_ctrl_ast_alert_rsp_o  (                  ),
-    .sensor_ctrl_ast_status_i     ( ast_base_status  ),
     .usbdev_usb_ref_val_o         (                  ),
     .usbdev_usb_ref_pulse_o       (                  ),
     .ast_edn_req_i                ( '0               ),
@@ -1118,6 +1115,9 @@
     .otp_ctrl_otp_ast_pwr_seq_o   (                  ),
     .otp_ctrl_otp_ast_pwr_seq_h_i ( '0               ),
     .otp_alert_o                  (                  ),
+    .sensor_ctrl_ast_alert_req_i  ( ast_base_alerts  ),
+    .sensor_ctrl_ast_alert_rsp_o  (                  ),
+    .sensor_ctrl_ast_status_i     ( ast_base_status  ),
     .es_rng_req_o                 (                  ),
     .es_rng_rsp_i                 ( '0               ),
     .es_rng_fips_o                (                  ),