[entropy_src/rtl] add fatal alert

ERR_CODE is RO and can be tested with a register.
Re-ran top level to make updates to interconnections.
Re-ran the reg script.
Re-ran top level again.

Signed-off-by: Mark Branstad <mark.branstad@wdc.com>
diff --git a/hw/ip/entropy_src/data/entropy_src.hjson b/hw/ip/entropy_src/data/entropy_src.hjson
index 20fdf1f..a85e067 100644
--- a/hw/ip/entropy_src/data/entropy_src.hjson
+++ b/hw/ip/entropy_src/data/entropy_src.hjson
@@ -18,8 +18,8 @@
       desc: "Asserted when entropy source bits are available."}
     { name: "es_health_test_failed"
       desc: "Asserted when the alert count has been met."}
-    { name: "es_fifo_err"
-      desc: "Asserted when a FIFO error occurs."}
+    { name: "es_fatal_err"
+      desc: "Asserted when a FIFO error occurs, or if an illegal state machine state is reached."}
   ],
   inter_signal_list: [
     { struct:  "entropy_src_hw_if",
@@ -49,9 +49,11 @@
     }
   ],
   alert_list: [
-    { name: "recov_alert_count_met",
-      desc: '''This alert is triggered upon the alert health test threshold criteria not met.
-            '''
+    { name: "recov_alert",
+      desc: "This alert is triggered upon the alert health test threshold criteria not met."
+    }
+    { name: "fatal_alert",
+      desc: "This alert triggers if an illegal state machine state is reached."
     }
   ],
 
@@ -913,7 +915,7 @@
     {
       name: "ERR_CODE",
       desc: "Hardware detection of error conditions status register",
-      swaccess: "rw",
+      swaccess: "ro",
       hwaccess: "hwo",
       fields: [
         { bits: "0",
@@ -943,6 +945,24 @@
                 This bit will stay set until firmware clears it.
                 '''
         }
+        { bits: "20",
+          name: "ES_ACK_SM_ERR",
+          desc: '''
+                This bit will be set to one when an illegal state has been detected for the
+                ES ack stage state machine. This error will signal a fatal alert, and also
+                an interrupt if enabled.
+                This bit will stay set until firmware clears it.
+                '''
+        }
+        { bits: "21",
+          name: "ES_MAIN_SM_ERR",
+          desc: '''
+                This bit will be set to one when an illegal state has been detected for the
+                ES main stage state machine. This error will signal a fatal alert, and also
+                an interrupt if enabled.
+                This bit will stay set until firmware clears it.
+                '''
+        }
         { bits: "28",
           name: "FIFO_WRITE_ERR",
           desc: '''
@@ -972,5 +992,26 @@
         }
       ]
     },
+    { name: "ERR_CODE_TEST",
+      desc: "Test error conditions register",
+      swaccess: "rw",
+      hwaccess: "hro",
+      hwqe: "true",
+      regwen: "REGWEN",
+      fields: [
+        {
+            bits: "4:0",
+            name: "ERR_CODE_TEST",
+            desc: '''
+                  Setting this field will set the bit number for which an error
+                  will be forced in the hardware. This bit number is that same one
+                  found in the !!ERR_CODE register. The action of writing this
+                  register will force an error pulse. The sole purpose of this
+                  register is to test that any error properly propagates to either
+                  an interrupt or an alert.
+                  '''
+        },
+      ]
+    },
   ]
 }
diff --git a/hw/ip/entropy_src/dv/env/entropy_src_env_pkg.sv b/hw/ip/entropy_src/dv/env/entropy_src_env_pkg.sv
index a8c4ba7..5962e9e 100644
--- a/hw/ip/entropy_src/dv/env/entropy_src_env_pkg.sv
+++ b/hw/ip/entropy_src/dv/env/entropy_src_env_pkg.sv
@@ -31,8 +31,8 @@
                                                  32'h9124836c,
                                                  32'hb5a7efd9,
                                                  32'h124836cb};
-  parameter string                LIST_OF_ALERTS[] = {"recov_alert_count_met"};
-  parameter uint                  NUM_ALERTS = 1;
+  parameter string                LIST_OF_ALERTS[] = {"recov_alert","fatal_alert"};
+  parameter uint                  NUM_ALERTS = 2;
 
   // types
   typedef enum int {
diff --git a/hw/ip/entropy_src/dv/tb/tb.sv b/hw/ip/entropy_src/dv/tb/tb.sv
index 8bd3a0a..cb1ca60 100644
--- a/hw/ip/entropy_src/dv/tb/tb.sv
+++ b/hw/ip/entropy_src/dv/tb/tb.sv
@@ -16,7 +16,7 @@
   wire clk, rst_n;
   wire devmode, efuse_es_sw_reg_en;
   wire [NUM_MAX_INTERRUPTS-1:0] interrupts;
-  wire intr_entropy_valid, intr_health_test_failed, intr_fifo_err;
+  wire intr_entropy_valid, intr_health_test_failed, intr_fatal_err;
 
   // interfaces
   clk_rst_if clk_rst_if(.clk(clk), .rst_n(rst_n));
@@ -57,12 +57,12 @@
 
     .intr_es_entropy_valid_o      (intr_entropy_valid),
     .intr_es_health_test_failed_o (intr_health_test_failed),
-    .intr_es_fifo_err_o           (intr_fifo_err)
+    .intr_es_fatal_err_o           (intr_fatal_err)
   );
 
   assign interrupts[EntropyValid]     = intr_entropy_valid;
   assign interrupts[HealthTestFailed] = intr_health_test_failed;
-  assign interrupts[FifoErr]          = intr_fifo_err;
+  assign interrupts[FifoErr]          = intr_fatal_err;
 
   initial begin
     // drive clk and rst_n from clk_if
diff --git a/hw/ip/entropy_src/rtl/entropy_src.sv b/hw/ip/entropy_src/rtl/entropy_src.sv
index 82f1bfe..362fced 100644
--- a/hw/ip/entropy_src/rtl/entropy_src.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src.sv
@@ -7,8 +7,11 @@
 `include "prim_assert.sv"
 
 
-module entropy_src import entropy_src_pkg::*; #(
-  parameter logic AlertAsyncOn = 1,
+module entropy_src
+  import entropy_src_pkg::*;
+  import entropy_src_reg_pkg::*;
+#(
+  parameter logic [NumAlerts-1:0] AlertAsyncOn = {NumAlerts{1'b1}},
   parameter int EsFifoDepth = 2
 ) (
   input logic clk_i,
@@ -34,13 +37,13 @@
   input  entropy_src_xht_rsp_t entropy_src_xht_i,
 
   // Alerts
-  input  prim_alert_pkg::alert_rx_t alert_rx_i,
-  output prim_alert_pkg::alert_tx_t alert_tx_o,
+  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,
 
   // Interrupts
   output logic    intr_es_entropy_valid_o,
   output logic    intr_es_health_test_failed_o,
-  output logic    intr_es_fifo_err_o
+  output logic    intr_es_fatal_err_o
 );
 
   import entropy_src_reg_pkg::*;
@@ -48,8 +51,8 @@
   entropy_src_reg2hw_t reg2hw;
   entropy_src_hw2reg_t hw2reg;
 
-  logic recov_alert_event;
-  logic alert_test;
+  logic [NumAlerts-1:0] alert_test;
+  logic [NumAlerts-1:0] alert;
 
   entropy_src_reg_top u_reg (
     .clk_i,
@@ -81,27 +84,33 @@
     .entropy_src_rng_o,
     .entropy_src_rng_i,
 
-    .recov_alert_event_o(recov_alert_event),
-    .alert_test_o(alert_test),
+    .recov_alert_o(alert[0]),
+    .fatal_alert_o(alert[1]),
+
+    .recov_alert_test_o(alert_test[0]),
+    .fatal_alert_test_o(alert_test[1]),
 
     .intr_es_entropy_valid_o,
     .intr_es_health_test_failed_o,
-    .intr_es_fifo_err_o
+    .intr_es_fatal_err_o
   );
 
-   prim_alert_sender #(
-     .AsyncOn(AlertAsyncOn),
-     .IsFatal(0)
-   ) u_alert_sender_i (
-     .clk_i         ( clk_i      ),
-     .rst_ni        ( rst_ni     ),
-     .alert_test_i  ( alert_test ),
-     .alert_req_i   ( recov_alert_event),
-     .alert_ack_o   (            ),
-     .alert_state_o (            ),
-     .alert_rx_i    ( alert_rx_i ),
-     .alert_tx_o    ( alert_tx_o )
-   );
+
+  for (genvar i = 0; i < NumAlerts; i++) begin : gen_alert_tx
+    prim_alert_sender #(
+      .AsyncOn(AlertAsyncOn[i]),
+      .IsFatal(i)
+    ) u_prim_alert_sender (
+      .clk_i,
+      .rst_ni,
+      .alert_test_i  ( alert_test[i] ),
+      .alert_req_i   ( alert[i]      ),
+      .alert_ack_o   (               ),
+      .alert_state_o (               ),
+      .alert_rx_i    ( alert_rx_i[i] ),
+      .alert_tx_o    ( alert_tx_o[i] )
+    );
+  end
 
   // Outputs should have a known value after reset
   `ASSERT_KNOWN(TlDValidKnownO_A, tl_o.d_valid)
@@ -130,6 +139,6 @@
   // Interrupts
   `ASSERT_KNOWN(IntrEsEntropyValidKnownO_A, intr_es_entropy_valid_o)
   `ASSERT_KNOWN(IntrEsHealthTestFailedKnownO_A, intr_es_health_test_failed_o)
-  `ASSERT_KNOWN(IntrEsFifoErrKnownO_A, intr_es_fifo_err_o)
+  `ASSERT_KNOWN(IntrEsFifoErrKnownO_A, intr_es_fatal_err_o)
 
 endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_ack_sm.sv b/hw/ip/entropy_src/rtl/entropy_src_ack_sm.sv
index 620b491..5c43698 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_ack_sm.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_ack_sm.sv
@@ -12,29 +12,36 @@
   input logic                req_i,
   output logic               ack_o,
   input logic                fifo_not_empty_i,
-  output logic               fifo_pop_o
+  output logic               fifo_pop_o,
+  output logic               ack_sm_err_o
 );
 
-  // Encoding generated with ./sparse-fsm-encode.py -d 3 -m 3 -n 6 -s 3584999330
-  // Hamming distance histogram:
-  //
-  // 0: --
-  // 1: --
-  // 2: --
-  // 3: |||||||||||||||||||| (66.67%)
-  // 4: |||||||||| (33.33%)
-  // 5: --
-  // 6: --
-  //
-  // Minimum Hamming distance: 3
-  // Maximum Hamming distance: 4
-  //
+// Encoding generated with:
+// $ ./util/design/sparse-fsm-encode.py -d 3 -m 4 -n 6 \
+//      -s 1236774883 --language=sv
+//
+// Hamming distance histogram:
+//
+//  0: --
+//  1: --
+//  2: --
+//  3: |||||||||||||||||||| (66.67%)
+//  4: ||||| (16.67%)
+//  5: --
+//  6: ||||| (16.67%)
+//
+// Minimum Hamming distance: 3
+// Maximum Hamming distance: 6
+// Minimum Hamming weight: 1
+// Maximum Hamming weight: 4
+//
 
   localparam int StateWidth = 6;
   typedef enum logic [StateWidth-1:0] {
-    Idle      = 6'b010110, // idle
-    AckImmed  = 6'b111111, // ack the request immediately
-    AckWait   = 6'b111000  // wait until the fifo has an entry
+    Idle      = 6'b010100, // idle
+    AckImmed  = 6'b101100, // ack the request immediately
+    AckWait   = 6'b000010, // wait until the fifo has an entry
+    Error     = 6'b101011  // illegal state reached and hang
   } state_e;
 
   state_e state_d, state_q;
@@ -60,6 +67,7 @@
     state_d = state_q;
     ack_o = 1'b0;
     fifo_pop_o = 1'b0;
+    ack_sm_err_o = 1'b0;
     unique case (state_q)
       Idle: begin
         if (req_i) begin
@@ -82,7 +90,10 @@
           state_d = Idle;
         end
       end
-      default: state_d = Idle;
+      Error: begin
+        ack_sm_err_o = 1'b1;
+      end
+      default: state_d = Error;
     endcase
   end
 
diff --git a/hw/ip/entropy_src/rtl/entropy_src_core.sv b/hw/ip/entropy_src/rtl/entropy_src_core.sv
index 114c49b..26d13d2 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_core.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_core.sv
@@ -30,12 +30,14 @@
   output entropy_src_xht_req_t entropy_src_xht_o,
   input  entropy_src_xht_rsp_t entropy_src_xht_i,
 
-  output logic           recov_alert_event_o,
-  output logic           alert_test_o,
+  output logic           recov_alert_test_o,
+  output logic           fatal_alert_test_o,
+  output logic           recov_alert_o,
+  output logic           fatal_alert_o,
 
   output logic           intr_es_entropy_valid_o,
   output logic           intr_es_health_test_failed_o,
-  output logic           intr_es_fifo_err_o
+  output logic           intr_es_fatal_err_o
 );
 
   import entropy_src_reg_pkg::*;
@@ -72,7 +74,7 @@
   logic       sw_es_rd_pulse;
   logic       event_es_entropy_valid;
   logic       event_es_health_test_failed;
-  logic       event_es_fifo_err;
+  logic       event_es_fatal_err;
   logic [15:0] es_rate;
   logic        es_rate_entropy_pulse;
   logic        es_rng_src_valid;
@@ -261,6 +263,17 @@
   logic                     es_hw_if_req;
   logic                     es_hw_if_ack;
   logic                     es_hw_if_fifo_pop;
+  logic                     sfifo_esrng_err_sum;
+  logic                     sfifo_precon_err_sum;
+  logic                     sfifo_esfinal_err_sum;
+  logic                     es_ack_sm_err_sum;
+  logic                     es_ack_sm_err;
+  logic                     es_main_sm_err_sum;
+  logic                     es_main_sm_err;
+  logic                     fifo_write_err_sum;
+  logic                     fifo_read_err_sum;
+  logic                     fifo_status_err_sum;
+  logic [30:0]              err_code_test_bit;
 
   // flops
   logic [15:0] es_rate_cntr_q, es_rate_cntr_d;
@@ -351,17 +364,17 @@
 
   prim_intr_hw #(
     .Width(1)
-  ) u_intr_hw_es_fifo_err (
+  ) u_intr_hw_es_fatal_err (
     .clk_i                  (clk_i),
     .rst_ni                 (rst_ni),
-    .event_intr_i           (event_es_fifo_err),
-    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.es_fifo_err.q),
-    .reg2hw_intr_test_q_i   (reg2hw.intr_test.es_fifo_err.q),
-    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.es_fifo_err.qe),
-    .reg2hw_intr_state_q_i  (reg2hw.intr_state.es_fifo_err.q),
-    .hw2reg_intr_state_de_o (hw2reg.intr_state.es_fifo_err.de),
-    .hw2reg_intr_state_d_o  (hw2reg.intr_state.es_fifo_err.d),
-    .intr_o                 (intr_es_fifo_err_o)
+    .event_intr_i           (event_es_fatal_err),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.es_fatal_err.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.es_fatal_err.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.es_fatal_err.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.es_fatal_err.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.es_fatal_err.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.es_fatal_err.d),
+    .intr_o                 (intr_es_fatal_err_o)
   );
 
   //--------------------------------------------
@@ -416,40 +429,84 @@
 
 
   // set the interrupt sources
-  assign event_es_fifo_err = es_enable && (
-         (|sfifo_esrng_err) ||
-         (|sfifo_precon_err) ||
-         (|sfifo_esfinal_err));
+  assign event_es_fatal_err = es_enable && (
+         sfifo_esrng_err_sum ||
+         sfifo_precon_err_sum ||
+         sfifo_esfinal_err_sum ||
+         es_ack_sm_err_sum ||
+         es_main_sm_err_sum);
+
+  // set fifo errors that are single instances of source
+  assign sfifo_esrng_err_sum = (|sfifo_esrng_err) ||
+         err_code_test_bit[0];
+  assign sfifo_precon_err_sum = (|sfifo_precon_err) ||
+         err_code_test_bit[1];
+  assign sfifo_esfinal_err_sum = (|sfifo_esfinal_err) ||
+         err_code_test_bit[2];
+  assign es_ack_sm_err_sum = es_ack_sm_err ||
+         err_code_test_bit[20];
+  assign es_main_sm_err_sum = es_main_sm_err ||
+         err_code_test_bit[21];
+  assign fifo_write_err_sum =
+         sfifo_esrng_err[2] ||
+         sfifo_precon_err[2] ||
+         sfifo_esfinal_err[2] ||
+         err_code_test_bit[28];
+  assign fifo_read_err_sum =
+         sfifo_esrng_err[1] ||
+         sfifo_precon_err[1] ||
+         sfifo_esfinal_err[1] ||
+         err_code_test_bit[29];
+  assign fifo_status_err_sum =
+         sfifo_esrng_err[0] ||
+         sfifo_precon_err[0] ||
+         sfifo_esfinal_err[0] ||
+         err_code_test_bit[30];
 
   // set the err code source bits
   assign hw2reg.err_code.sfifo_esrng_err.d = 1'b1;
-  assign hw2reg.err_code.sfifo_esrng_err.de =  es_enable && (|sfifo_esrng_err);
+  assign hw2reg.err_code.sfifo_esrng_err.de =  es_enable && sfifo_esrng_err_sum;
 
   assign hw2reg.err_code.sfifo_precon_err.d = 1'b1;
-  assign hw2reg.err_code.sfifo_precon_err.de =  es_enable && (|sfifo_precon_err);
+  assign hw2reg.err_code.sfifo_precon_err.de =  es_enable && sfifo_precon_err_sum;
 
   assign hw2reg.err_code.sfifo_esfinal_err.d = 1'b1;
-  assign hw2reg.err_code.sfifo_esfinal_err.de =  es_enable && (|sfifo_esfinal_err);
+  assign hw2reg.err_code.sfifo_esfinal_err.de =  es_enable && sfifo_esfinal_err_sum;
+
+  assign hw2reg.err_code.es_ack_sm_err.d = 1'b1;
+  assign hw2reg.err_code.es_ack_sm_err.de = es_enable && es_ack_sm_err_sum;
+
+  assign hw2reg.err_code.es_main_sm_err.d = 1'b1;
+  assign hw2reg.err_code.es_main_sm_err.de = es_enable && es_main_sm_err_sum;
 
 
  // set the err code type bits
   assign hw2reg.err_code.fifo_write_err.d = 1'b1;
-  assign hw2reg.err_code.fifo_write_err.de = es_enable && (
-         sfifo_esrng_err[2] ||
-         sfifo_precon_err[2] ||
-         sfifo_esfinal_err[2]);
+  assign hw2reg.err_code.fifo_write_err.de = es_enable && fifo_write_err_sum;
 
   assign hw2reg.err_code.fifo_read_err.d = 1'b1;
-  assign hw2reg.err_code.fifo_read_err.de = es_enable && (
-         sfifo_esrng_err[1] ||
-         sfifo_precon_err[1] ||
-         sfifo_esfinal_err[1]);
+  assign hw2reg.err_code.fifo_read_err.de = es_enable && fifo_read_err_sum;
 
   assign hw2reg.err_code.fifo_state_err.d = 1'b1;
-  assign hw2reg.err_code.fifo_state_err.de = es_enable && (
-         sfifo_esrng_err[0] ||
-         sfifo_precon_err[0] ||
-         sfifo_esfinal_err[0]);
+  assign hw2reg.err_code.fifo_state_err.de = es_enable && fifo_status_err_sum;
+
+  // Error forcing
+  for (genvar i = 0; i < 31; i = i+1) begin : gen_err_code_test_bit
+    assign err_code_test_bit[i] = (reg2hw.err_code_test.q == i) && reg2hw.err_code_test.qe;
+  end : gen_err_code_test_bit
+
+  // alert - send all interrupt sources to the alert for the fatal case
+  assign fatal_alert_o = event_es_fatal_err;
+
+  // alert test
+  assign recov_alert_test_o = {
+    reg2hw.alert_test.recov_alert.q &&
+    reg2hw.alert_test.recov_alert.qe
+  };
+  assign fatal_alert_test_o = {
+    reg2hw.alert_test.fatal_alert.q &&
+    reg2hw.alert_test.fatal_alert.qe
+  };
 
 
   // set the debug status reg
@@ -1101,10 +1158,7 @@
   assign alert_threshold = reg2hw.alert_threshold.q;
 
   assign recov_alert_event = (any_fail_count >= alert_threshold) && (alert_threshold != '0);
-  assign recov_alert_event_o = recov_alert_event;
-
-  // alert test
-  assign alert_test_o = reg2hw.alert_test.qe && reg2hw.alert_test.q;
+  assign recov_alert_o = recov_alert_event;
 
 
   // repcnt fail counter
@@ -1407,7 +1461,8 @@
     .main_stage_rdy_i   (pfifo_cond_not_empty),
     .bypass_stage_rdy_i (pfifo_bypass_not_empty),
     .main_stage_pop_o   (main_stage_pop),
-    .bypass_stage_pop_o (bypass_stage_pop)
+    .bypass_stage_pop_o (bypass_stage_pop),
+    .main_sm_err_o      (es_main_sm_err)
   );
 
 
@@ -1462,7 +1517,8 @@
     .req_i            (es_hw_if_req),
     .ack_o            (es_hw_if_ack),
     .fifo_not_empty_i (sfifo_esfinal_not_empty && !es_route_to_sw),
-    .fifo_pop_o       (es_hw_if_fifo_pop)
+    .fifo_pop_o       (es_hw_if_fifo_pop),
+    .ack_sm_err_o     (es_ack_sm_err)
   );
 
   //--------------------------------------------
@@ -1499,6 +1555,8 @@
   //--------------------------------------------
 
   assign hw2reg.debug_status.diag.d  =
+         (|err_code_test_bit[19:3]) ||
+         (|err_code_test_bit[27:22]) ||
          reg2hw.regwen.q &&
          (&reg2hw.entropy_data.q) &&
          (&reg2hw.fw_ov_rd_data.q);
diff --git a/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv b/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv
index a944777..394b54a 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv
@@ -20,34 +20,41 @@
   input logic                main_stage_rdy_i,
   input logic                bypass_stage_rdy_i,
   output logic               main_stage_pop_o,
-  output logic               bypass_stage_pop_o
+  output logic               bypass_stage_pop_o,
+  output logic               main_sm_err_o
 );
 
-  // Encoding generated with ./sparse-fsm-encode.py -d 3 -m 6 -n 8 -s 3348095039
-  // Hamming distance histogram:
-  //
-  // 0: --
-  // 1: --
-  // 2: --
-  // 3: |||||| (13.33%)
-  // 4: |||||||||||||||| (33.33%)
-  // 5: |||||||||||||||||||| (40.00%)
-  // 6: |||||| (13.33%)
-  // 7: --
-  // 8: --
-  //
-  // Minimum Hamming distance: 3
-  // Maximum Hamming distance: 6
-  //
+// Encoding generated with:
+// $ ./util/design/sparse-fsm-encode.py -d 3 -m 7 -n 8 \
+//      -s 373118154 --language=sv
+//
+// Hamming distance histogram:
+//
+//  0: --
+//  1: --
+//  2: --
+//  3: |||||||||||||||||||| (42.86%)
+//  4: ||||||||||||||| (33.33%)
+//  5: |||| (9.52%)
+//  6: |||| (9.52%)
+//  7: || (4.76%)
+//  8: --
+//
+// Minimum Hamming distance: 3
+// Maximum Hamming distance: 7
+// Minimum Hamming weight: 2
+// Maximum Hamming weight: 6
+//
 
   localparam int StateWidth = 8;
   typedef enum logic [StateWidth-1:0] {
-    Idle              = 8'b00011111, // idle
-    HealthTestDone    = 8'b01111010, // wait for health test done pulse
-    PostHealthTestChk = 8'b11111001, // wait for post health test packer not empty state
-    FlowModeChk       = 8'b10110100, // determine what mode the flow is in
-    BypassMode        = 8'b00100011, // in bypass mode
-    NormalMode        = 8'b11001000  // in normal mode
+    Idle              = 8'b01100010, // idle
+    HealthTestDone    = 8'b00011101, // wait for health test done pulse
+    PostHealthTestChk = 8'b01001100, // wait for post health test packer not empty state
+    FlowModeChk       = 8'b01110111, // determine what mode the flow is in
+    BypassMode        = 8'b11011001, // in bypass mode
+    NormalMode        = 8'b00000111, // in normal mode
+    Error             = 8'b01000001  // illegal state reached and hang
   } state_e;
 
   state_e state_d, state_q;
@@ -74,6 +81,7 @@
     rst_alert_cntr_o = 1'b0;
     main_stage_pop_o = 1'b0;
     bypass_stage_pop_o = 1'b0;
+    main_sm_err_o = 1'b0;
     unique case (state_q)
       Idle: begin
         if (enable_i) begin
@@ -115,7 +123,10 @@
           state_d = Idle;
         end
       end
-      default: state_d = Idle;
+      Error: begin
+        main_sm_err_o = 1'b1;
+      end
+      default: state_d = Error;
     endcase
   end
 
diff --git a/hw/ip/entropy_src/rtl/entropy_src_reg_pkg.sv b/hw/ip/entropy_src/rtl/entropy_src_reg_pkg.sv
index 042c932..f1b6082 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_reg_pkg.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_reg_pkg.sv
@@ -8,7 +8,7 @@
 
   // Param list
   parameter int EsFifoDepth = 32;
-  parameter int NumAlerts = 1;
+  parameter int NumAlerts = 2;
 
   // Address width within the block
   parameter int BlockAw = 8;
@@ -25,7 +25,7 @@
     } es_health_test_failed;
     struct packed {
       logic        q;
-    } es_fifo_err;
+    } es_fatal_err;
   } entropy_src_reg2hw_intr_state_reg_t;
 
   typedef struct packed {
@@ -37,7 +37,7 @@
     } es_health_test_failed;
     struct packed {
       logic        q;
-    } es_fifo_err;
+    } es_fatal_err;
   } entropy_src_reg2hw_intr_enable_reg_t;
 
   typedef struct packed {
@@ -52,12 +52,18 @@
     struct packed {
       logic        q;
       logic        qe;
-    } es_fifo_err;
+    } es_fatal_err;
   } entropy_src_reg2hw_intr_test_reg_t;
 
   typedef struct packed {
-    logic        q;
-    logic        qe;
+    struct packed {
+      logic        q;
+      logic        qe;
+    } recov_alert;
+    struct packed {
+      logic        q;
+      logic        qe;
+    } fatal_alert;
   } entropy_src_reg2hw_alert_test_reg_t;
 
   typedef struct packed {
@@ -230,6 +236,11 @@
     logic [3:0]  q;
   } entropy_src_reg2hw_seed_reg_t;
 
+  typedef struct packed {
+    logic [4:0]  q;
+    logic        qe;
+  } entropy_src_reg2hw_err_code_test_reg_t;
+
 
   typedef struct packed {
     struct packed {
@@ -243,7 +254,7 @@
     struct packed {
       logic        d;
       logic        de;
-    } es_fifo_err;
+    } es_fatal_err;
   } entropy_src_hw2reg_intr_state_reg_t;
 
   typedef struct packed {
@@ -420,6 +431,14 @@
     struct packed {
       logic        d;
       logic        de;
+    } es_ack_sm_err;
+    struct packed {
+      logic        d;
+      logic        de;
+    } es_main_sm_err;
+    struct packed {
+      logic        d;
+      logic        de;
     } fifo_write_err;
     struct packed {
       logic        d;
@@ -436,60 +455,61 @@
   // Register to internal design logic //
   ///////////////////////////////////////
   typedef struct packed {
-    entropy_src_reg2hw_intr_state_reg_t intr_state; // [449:447]
-    entropy_src_reg2hw_intr_enable_reg_t intr_enable; // [446:444]
-    entropy_src_reg2hw_intr_test_reg_t intr_test; // [443:438]
-    entropy_src_reg2hw_alert_test_reg_t alert_test; // [437:436]
-    entropy_src_reg2hw_regwen_reg_t regwen; // [435:435]
-    entropy_src_reg2hw_conf_reg_t conf; // [434:423]
-    entropy_src_reg2hw_rate_reg_t rate; // [422:407]
-    entropy_src_reg2hw_entropy_control_reg_t entropy_control; // [406:405]
-    entropy_src_reg2hw_entropy_data_reg_t entropy_data; // [404:372]
-    entropy_src_reg2hw_health_test_windows_reg_t health_test_windows; // [371:340]
-    entropy_src_reg2hw_repcnt_thresholds_reg_t repcnt_thresholds; // [339:308]
-    entropy_src_reg2hw_adaptp_hi_thresholds_reg_t adaptp_hi_thresholds; // [307:276]
-    entropy_src_reg2hw_adaptp_lo_thresholds_reg_t adaptp_lo_thresholds; // [275:244]
-    entropy_src_reg2hw_bucket_thresholds_reg_t bucket_thresholds; // [243:212]
-    entropy_src_reg2hw_markov_hi_thresholds_reg_t markov_hi_thresholds; // [211:180]
-    entropy_src_reg2hw_markov_lo_thresholds_reg_t markov_lo_thresholds; // [179:148]
-    entropy_src_reg2hw_extht_hi_thresholds_reg_t extht_hi_thresholds; // [147:116]
-    entropy_src_reg2hw_extht_lo_thresholds_reg_t extht_lo_thresholds; // [115:84]
-    entropy_src_reg2hw_alert_threshold_reg_t alert_threshold; // [83:80]
-    entropy_src_reg2hw_fw_ov_control_reg_t fw_ov_control; // [79:77]
-    entropy_src_reg2hw_fw_ov_rd_data_reg_t fw_ov_rd_data; // [76:44]
-    entropy_src_reg2hw_fw_ov_wr_data_reg_t fw_ov_wr_data; // [43:11]
-    entropy_src_reg2hw_pre_cond_fifo_depth_reg_t pre_cond_fifo_depth; // [10:4]
-    entropy_src_reg2hw_seed_reg_t seed; // [3:0]
+    entropy_src_reg2hw_intr_state_reg_t intr_state; // [457:455]
+    entropy_src_reg2hw_intr_enable_reg_t intr_enable; // [454:452]
+    entropy_src_reg2hw_intr_test_reg_t intr_test; // [451:446]
+    entropy_src_reg2hw_alert_test_reg_t alert_test; // [445:442]
+    entropy_src_reg2hw_regwen_reg_t regwen; // [441:441]
+    entropy_src_reg2hw_conf_reg_t conf; // [440:429]
+    entropy_src_reg2hw_rate_reg_t rate; // [428:413]
+    entropy_src_reg2hw_entropy_control_reg_t entropy_control; // [412:411]
+    entropy_src_reg2hw_entropy_data_reg_t entropy_data; // [410:378]
+    entropy_src_reg2hw_health_test_windows_reg_t health_test_windows; // [377:346]
+    entropy_src_reg2hw_repcnt_thresholds_reg_t repcnt_thresholds; // [345:314]
+    entropy_src_reg2hw_adaptp_hi_thresholds_reg_t adaptp_hi_thresholds; // [313:282]
+    entropy_src_reg2hw_adaptp_lo_thresholds_reg_t adaptp_lo_thresholds; // [281:250]
+    entropy_src_reg2hw_bucket_thresholds_reg_t bucket_thresholds; // [249:218]
+    entropy_src_reg2hw_markov_hi_thresholds_reg_t markov_hi_thresholds; // [217:186]
+    entropy_src_reg2hw_markov_lo_thresholds_reg_t markov_lo_thresholds; // [185:154]
+    entropy_src_reg2hw_extht_hi_thresholds_reg_t extht_hi_thresholds; // [153:122]
+    entropy_src_reg2hw_extht_lo_thresholds_reg_t extht_lo_thresholds; // [121:90]
+    entropy_src_reg2hw_alert_threshold_reg_t alert_threshold; // [89:86]
+    entropy_src_reg2hw_fw_ov_control_reg_t fw_ov_control; // [85:83]
+    entropy_src_reg2hw_fw_ov_rd_data_reg_t fw_ov_rd_data; // [82:50]
+    entropy_src_reg2hw_fw_ov_wr_data_reg_t fw_ov_wr_data; // [49:17]
+    entropy_src_reg2hw_pre_cond_fifo_depth_reg_t pre_cond_fifo_depth; // [16:10]
+    entropy_src_reg2hw_seed_reg_t seed; // [9:6]
+    entropy_src_reg2hw_err_code_test_reg_t err_code_test; // [5:0]
   } entropy_src_reg2hw_t;
 
   ///////////////////////////////////////
   // Internal design logic to register //
   ///////////////////////////////////////
   typedef struct packed {
-    entropy_src_hw2reg_intr_state_reg_t intr_state; // [639:634]
-    entropy_src_hw2reg_entropy_data_reg_t entropy_data; // [633:602]
-    entropy_src_hw2reg_repcnt_hi_watermarks_reg_t repcnt_hi_watermarks; // [601:570]
-    entropy_src_hw2reg_adaptp_hi_watermarks_reg_t adaptp_hi_watermarks; // [569:538]
-    entropy_src_hw2reg_adaptp_lo_watermarks_reg_t adaptp_lo_watermarks; // [537:506]
-    entropy_src_hw2reg_extht_hi_watermarks_reg_t extht_hi_watermarks; // [505:474]
-    entropy_src_hw2reg_extht_lo_watermarks_reg_t extht_lo_watermarks; // [473:442]
-    entropy_src_hw2reg_bucket_hi_watermarks_reg_t bucket_hi_watermarks; // [441:410]
-    entropy_src_hw2reg_markov_hi_watermarks_reg_t markov_hi_watermarks; // [409:378]
-    entropy_src_hw2reg_markov_lo_watermarks_reg_t markov_lo_watermarks; // [377:346]
-    entropy_src_hw2reg_repcnt_total_fails_reg_t repcnt_total_fails; // [345:314]
-    entropy_src_hw2reg_adaptp_hi_total_fails_reg_t adaptp_hi_total_fails; // [313:282]
-    entropy_src_hw2reg_adaptp_lo_total_fails_reg_t adaptp_lo_total_fails; // [281:250]
-    entropy_src_hw2reg_bucket_total_fails_reg_t bucket_total_fails; // [249:218]
-    entropy_src_hw2reg_markov_hi_total_fails_reg_t markov_hi_total_fails; // [217:186]
-    entropy_src_hw2reg_markov_lo_total_fails_reg_t markov_lo_total_fails; // [185:154]
-    entropy_src_hw2reg_extht_hi_total_fails_reg_t extht_hi_total_fails; // [153:122]
-    entropy_src_hw2reg_extht_lo_total_fails_reg_t extht_lo_total_fails; // [121:90]
-    entropy_src_hw2reg_alert_fail_counts_reg_t alert_fail_counts; // [89:62]
-    entropy_src_hw2reg_extht_fail_counts_reg_t extht_fail_counts; // [61:54]
-    entropy_src_hw2reg_fw_ov_rd_data_reg_t fw_ov_rd_data; // [53:22]
-    entropy_src_hw2reg_fw_ov_fifo_sts_reg_t fw_ov_fifo_sts; // [21:15]
-    entropy_src_hw2reg_debug_status_reg_t debug_status; // [14:12]
-    entropy_src_hw2reg_err_code_reg_t err_code; // [11:0]
+    entropy_src_hw2reg_intr_state_reg_t intr_state; // [643:638]
+    entropy_src_hw2reg_entropy_data_reg_t entropy_data; // [637:606]
+    entropy_src_hw2reg_repcnt_hi_watermarks_reg_t repcnt_hi_watermarks; // [605:574]
+    entropy_src_hw2reg_adaptp_hi_watermarks_reg_t adaptp_hi_watermarks; // [573:542]
+    entropy_src_hw2reg_adaptp_lo_watermarks_reg_t adaptp_lo_watermarks; // [541:510]
+    entropy_src_hw2reg_extht_hi_watermarks_reg_t extht_hi_watermarks; // [509:478]
+    entropy_src_hw2reg_extht_lo_watermarks_reg_t extht_lo_watermarks; // [477:446]
+    entropy_src_hw2reg_bucket_hi_watermarks_reg_t bucket_hi_watermarks; // [445:414]
+    entropy_src_hw2reg_markov_hi_watermarks_reg_t markov_hi_watermarks; // [413:382]
+    entropy_src_hw2reg_markov_lo_watermarks_reg_t markov_lo_watermarks; // [381:350]
+    entropy_src_hw2reg_repcnt_total_fails_reg_t repcnt_total_fails; // [349:318]
+    entropy_src_hw2reg_adaptp_hi_total_fails_reg_t adaptp_hi_total_fails; // [317:286]
+    entropy_src_hw2reg_adaptp_lo_total_fails_reg_t adaptp_lo_total_fails; // [285:254]
+    entropy_src_hw2reg_bucket_total_fails_reg_t bucket_total_fails; // [253:222]
+    entropy_src_hw2reg_markov_hi_total_fails_reg_t markov_hi_total_fails; // [221:190]
+    entropy_src_hw2reg_markov_lo_total_fails_reg_t markov_lo_total_fails; // [189:158]
+    entropy_src_hw2reg_extht_hi_total_fails_reg_t extht_hi_total_fails; // [157:126]
+    entropy_src_hw2reg_extht_lo_total_fails_reg_t extht_lo_total_fails; // [125:94]
+    entropy_src_hw2reg_alert_fail_counts_reg_t alert_fail_counts; // [93:66]
+    entropy_src_hw2reg_extht_fail_counts_reg_t extht_fail_counts; // [65:58]
+    entropy_src_hw2reg_fw_ov_rd_data_reg_t fw_ov_rd_data; // [57:26]
+    entropy_src_hw2reg_fw_ov_fifo_sts_reg_t fw_ov_fifo_sts; // [25:19]
+    entropy_src_hw2reg_debug_status_reg_t debug_status; // [18:16]
+    entropy_src_hw2reg_err_code_reg_t err_code; // [15:0]
   } entropy_src_hw2reg_t;
 
   // Register Address
@@ -539,14 +559,16 @@
   parameter logic [BlockAw-1:0] ENTROPY_SRC_DEBUG_STATUS_OFFSET = 8'h ac;
   parameter logic [BlockAw-1:0] ENTROPY_SRC_SEED_OFFSET = 8'h b0;
   parameter logic [BlockAw-1:0] ENTROPY_SRC_ERR_CODE_OFFSET = 8'h b4;
+  parameter logic [BlockAw-1:0] ENTROPY_SRC_ERR_CODE_TEST_OFFSET = 8'h b8;
 
   // Reset values for hwext registers and their fields
   parameter logic [2:0] ENTROPY_SRC_INTR_TEST_RESVAL = 3'h 0;
   parameter logic [0:0] ENTROPY_SRC_INTR_TEST_ES_ENTROPY_VALID_RESVAL = 1'h 0;
   parameter logic [0:0] ENTROPY_SRC_INTR_TEST_ES_HEALTH_TEST_FAILED_RESVAL = 1'h 0;
-  parameter logic [0:0] ENTROPY_SRC_INTR_TEST_ES_FIFO_ERR_RESVAL = 1'h 0;
-  parameter logic [0:0] ENTROPY_SRC_ALERT_TEST_RESVAL = 1'h 0;
-  parameter logic [0:0] ENTROPY_SRC_ALERT_TEST_RECOV_ALERT_COUNT_MET_RESVAL = 1'h 0;
+  parameter logic [0:0] ENTROPY_SRC_INTR_TEST_ES_FATAL_ERR_RESVAL = 1'h 0;
+  parameter logic [1:0] ENTROPY_SRC_ALERT_TEST_RESVAL = 2'h 0;
+  parameter logic [0:0] ENTROPY_SRC_ALERT_TEST_RECOV_ALERT_RESVAL = 1'h 0;
+  parameter logic [0:0] ENTROPY_SRC_ALERT_TEST_FATAL_ALERT_RESVAL = 1'h 0;
   parameter logic [31:0] ENTROPY_SRC_ENTROPY_DATA_RESVAL = 32'h 0;
   parameter logic [31:0] ENTROPY_SRC_REPCNT_HI_WATERMARKS_RESVAL = 32'h 0;
   parameter logic [31:0] ENTROPY_SRC_ADAPTP_HI_WATERMARKS_RESVAL = 32'h 0;
@@ -618,11 +640,12 @@
     ENTROPY_SRC_PRE_COND_FIFO_DEPTH,
     ENTROPY_SRC_DEBUG_STATUS,
     ENTROPY_SRC_SEED,
-    ENTROPY_SRC_ERR_CODE
+    ENTROPY_SRC_ERR_CODE,
+    ENTROPY_SRC_ERR_CODE_TEST
   } entropy_src_id_e;
 
   // Register width information to check illegal writes
-  parameter logic [3:0] ENTROPY_SRC_PERMIT [46] = '{
+  parameter logic [3:0] ENTROPY_SRC_PERMIT [47] = '{
     4'b 0001, // index[ 0] ENTROPY_SRC_INTR_STATE
     4'b 0001, // index[ 1] ENTROPY_SRC_INTR_ENABLE
     4'b 0001, // index[ 2] ENTROPY_SRC_INTR_TEST
@@ -668,7 +691,8 @@
     4'b 0001, // index[42] ENTROPY_SRC_PRE_COND_FIFO_DEPTH
     4'b 1111, // index[43] ENTROPY_SRC_DEBUG_STATUS
     4'b 0001, // index[44] ENTROPY_SRC_SEED
-    4'b 1111  // index[45] ENTROPY_SRC_ERR_CODE
+    4'b 1111, // index[45] ENTROPY_SRC_ERR_CODE
+    4'b 0001  // index[46] ENTROPY_SRC_ERR_CODE_TEST
   };
 endpackage
 
diff --git a/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv b/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
index 94c041f..6d97ead 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
@@ -77,26 +77,28 @@
   logic intr_state_es_health_test_failed_qs;
   logic intr_state_es_health_test_failed_wd;
   logic intr_state_es_health_test_failed_we;
-  logic intr_state_es_fifo_err_qs;
-  logic intr_state_es_fifo_err_wd;
-  logic intr_state_es_fifo_err_we;
+  logic intr_state_es_fatal_err_qs;
+  logic intr_state_es_fatal_err_wd;
+  logic intr_state_es_fatal_err_we;
   logic intr_enable_es_entropy_valid_qs;
   logic intr_enable_es_entropy_valid_wd;
   logic intr_enable_es_entropy_valid_we;
   logic intr_enable_es_health_test_failed_qs;
   logic intr_enable_es_health_test_failed_wd;
   logic intr_enable_es_health_test_failed_we;
-  logic intr_enable_es_fifo_err_qs;
-  logic intr_enable_es_fifo_err_wd;
-  logic intr_enable_es_fifo_err_we;
+  logic intr_enable_es_fatal_err_qs;
+  logic intr_enable_es_fatal_err_wd;
+  logic intr_enable_es_fatal_err_we;
   logic intr_test_es_entropy_valid_wd;
   logic intr_test_es_entropy_valid_we;
   logic intr_test_es_health_test_failed_wd;
   logic intr_test_es_health_test_failed_we;
-  logic intr_test_es_fifo_err_wd;
-  logic intr_test_es_fifo_err_we;
-  logic alert_test_wd;
-  logic alert_test_we;
+  logic intr_test_es_fatal_err_wd;
+  logic intr_test_es_fatal_err_we;
+  logic alert_test_recov_alert_wd;
+  logic alert_test_recov_alert_we;
+  logic alert_test_fatal_alert_wd;
+  logic alert_test_fatal_alert_we;
   logic regwen_qs;
   logic regwen_wd;
   logic regwen_we;
@@ -293,23 +295,16 @@
   logic [3:0] seed_wd;
   logic seed_we;
   logic err_code_sfifo_esrng_err_qs;
-  logic err_code_sfifo_esrng_err_wd;
-  logic err_code_sfifo_esrng_err_we;
   logic err_code_sfifo_precon_err_qs;
-  logic err_code_sfifo_precon_err_wd;
-  logic err_code_sfifo_precon_err_we;
   logic err_code_sfifo_esfinal_err_qs;
-  logic err_code_sfifo_esfinal_err_wd;
-  logic err_code_sfifo_esfinal_err_we;
+  logic err_code_es_ack_sm_err_qs;
+  logic err_code_es_main_sm_err_qs;
   logic err_code_fifo_write_err_qs;
-  logic err_code_fifo_write_err_wd;
-  logic err_code_fifo_write_err_we;
   logic err_code_fifo_read_err_qs;
-  logic err_code_fifo_read_err_wd;
-  logic err_code_fifo_read_err_we;
   logic err_code_fifo_state_err_qs;
-  logic err_code_fifo_state_err_wd;
-  logic err_code_fifo_state_err_we;
+  logic [4:0] err_code_test_qs;
+  logic [4:0] err_code_test_wd;
+  logic err_code_test_we;
 
   // Register instances
   // R[intr_state]: V(False)
@@ -366,29 +361,29 @@
   );
 
 
-  //   F[es_fifo_err]: 2:2
+  //   F[es_fatal_err]: 2:2
   prim_subreg #(
     .DW      (1),
     .SWACCESS("W1C"),
     .RESVAL  (1'h0)
-  ) u_intr_state_es_fifo_err (
+  ) u_intr_state_es_fatal_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface
-    .we     (intr_state_es_fifo_err_we),
-    .wd     (intr_state_es_fifo_err_wd),
+    .we     (intr_state_es_fatal_err_we),
+    .wd     (intr_state_es_fatal_err_wd),
 
     // from internal hardware
-    .de     (hw2reg.intr_state.es_fifo_err.de),
-    .d      (hw2reg.intr_state.es_fifo_err.d ),
+    .de     (hw2reg.intr_state.es_fatal_err.de),
+    .d      (hw2reg.intr_state.es_fatal_err.d ),
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.intr_state.es_fifo_err.q ),
+    .q      (reg2hw.intr_state.es_fatal_err.q ),
 
     // to register interface (read)
-    .qs     (intr_state_es_fifo_err_qs)
+    .qs     (intr_state_es_fatal_err_qs)
   );
 
 
@@ -446,18 +441,18 @@
   );
 
 
-  //   F[es_fifo_err]: 2:2
+  //   F[es_fatal_err]: 2:2
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
     .RESVAL  (1'h0)
-  ) u_intr_enable_es_fifo_err (
+  ) u_intr_enable_es_fatal_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface
-    .we     (intr_enable_es_fifo_err_we),
-    .wd     (intr_enable_es_fifo_err_wd),
+    .we     (intr_enable_es_fatal_err_we),
+    .wd     (intr_enable_es_fatal_err_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -465,10 +460,10 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.intr_enable.es_fifo_err.q ),
+    .q      (reg2hw.intr_enable.es_fatal_err.q ),
 
     // to register interface (read)
-    .qs     (intr_enable_es_fifo_err_qs)
+    .qs     (intr_enable_es_fatal_err_qs)
   );
 
 
@@ -504,33 +499,49 @@
   );
 
 
-  //   F[es_fifo_err]: 2:2
+  //   F[es_fatal_err]: 2:2
   prim_subreg_ext #(
     .DW    (1)
-  ) u_intr_test_es_fifo_err (
+  ) u_intr_test_es_fatal_err (
     .re     (1'b0),
-    .we     (intr_test_es_fifo_err_we),
-    .wd     (intr_test_es_fifo_err_wd),
+    .we     (intr_test_es_fatal_err_we),
+    .wd     (intr_test_es_fatal_err_wd),
     .d      ('0),
     .qre    (),
-    .qe     (reg2hw.intr_test.es_fifo_err.qe),
-    .q      (reg2hw.intr_test.es_fifo_err.q ),
+    .qe     (reg2hw.intr_test.es_fatal_err.qe),
+    .q      (reg2hw.intr_test.es_fatal_err.q ),
     .qs     ()
   );
 
 
   // R[alert_test]: V(True)
 
+  //   F[recov_alert]: 0:0
   prim_subreg_ext #(
     .DW    (1)
-  ) u_alert_test (
+  ) u_alert_test_recov_alert (
     .re     (1'b0),
-    .we     (alert_test_we),
-    .wd     (alert_test_wd),
+    .we     (alert_test_recov_alert_we),
+    .wd     (alert_test_recov_alert_wd),
     .d      ('0),
     .qre    (),
-    .qe     (reg2hw.alert_test.qe),
-    .q      (reg2hw.alert_test.q ),
+    .qe     (reg2hw.alert_test.recov_alert.qe),
+    .q      (reg2hw.alert_test.recov_alert.q ),
+    .qs     ()
+  );
+
+
+  //   F[fatal_alert]: 1:1
+  prim_subreg_ext #(
+    .DW    (1)
+  ) u_alert_test_fatal_alert (
+    .re     (1'b0),
+    .we     (alert_test_fatal_alert_we),
+    .wd     (alert_test_fatal_alert_wd),
+    .d      ('0),
+    .qre    (),
+    .qe     (reg2hw.alert_test.fatal_alert.qe),
+    .q      (reg2hw.alert_test.fatal_alert.q ),
     .qs     ()
   );
 
@@ -2193,15 +2204,14 @@
   //   F[sfifo_esrng_err]: 0:0
   prim_subreg #(
     .DW      (1),
-    .SWACCESS("RW"),
+    .SWACCESS("RO"),
     .RESVAL  (1'h0)
   ) u_err_code_sfifo_esrng_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (err_code_sfifo_esrng_err_we),
-    .wd     (err_code_sfifo_esrng_err_wd),
+    .we     (1'b0),
+    .wd     ('0  ),
 
     // from internal hardware
     .de     (hw2reg.err_code.sfifo_esrng_err.de),
@@ -2219,15 +2229,14 @@
   //   F[sfifo_precon_err]: 1:1
   prim_subreg #(
     .DW      (1),
-    .SWACCESS("RW"),
+    .SWACCESS("RO"),
     .RESVAL  (1'h0)
   ) u_err_code_sfifo_precon_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (err_code_sfifo_precon_err_we),
-    .wd     (err_code_sfifo_precon_err_wd),
+    .we     (1'b0),
+    .wd     ('0  ),
 
     // from internal hardware
     .de     (hw2reg.err_code.sfifo_precon_err.de),
@@ -2245,15 +2254,14 @@
   //   F[sfifo_esfinal_err]: 2:2
   prim_subreg #(
     .DW      (1),
-    .SWACCESS("RW"),
+    .SWACCESS("RO"),
     .RESVAL  (1'h0)
   ) u_err_code_sfifo_esfinal_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (err_code_sfifo_esfinal_err_we),
-    .wd     (err_code_sfifo_esfinal_err_wd),
+    .we     (1'b0),
+    .wd     ('0  ),
 
     // from internal hardware
     .de     (hw2reg.err_code.sfifo_esfinal_err.de),
@@ -2268,18 +2276,67 @@
   );
 
 
+  //   F[es_ack_sm_err]: 20:20
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_err_code_es_ack_sm_err (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.err_code.es_ack_sm_err.de),
+    .d      (hw2reg.err_code.es_ack_sm_err.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (err_code_es_ack_sm_err_qs)
+  );
+
+
+  //   F[es_main_sm_err]: 21:21
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_err_code_es_main_sm_err (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.err_code.es_main_sm_err.de),
+    .d      (hw2reg.err_code.es_main_sm_err.d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (err_code_es_main_sm_err_qs)
+  );
+
+
   //   F[fifo_write_err]: 28:28
   prim_subreg #(
     .DW      (1),
-    .SWACCESS("RW"),
+    .SWACCESS("RO"),
     .RESVAL  (1'h0)
   ) u_err_code_fifo_write_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (err_code_fifo_write_err_we),
-    .wd     (err_code_fifo_write_err_wd),
+    .we     (1'b0),
+    .wd     ('0  ),
 
     // from internal hardware
     .de     (hw2reg.err_code.fifo_write_err.de),
@@ -2297,15 +2354,14 @@
   //   F[fifo_read_err]: 29:29
   prim_subreg #(
     .DW      (1),
-    .SWACCESS("RW"),
+    .SWACCESS("RO"),
     .RESVAL  (1'h0)
   ) u_err_code_fifo_read_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (err_code_fifo_read_err_we),
-    .wd     (err_code_fifo_read_err_wd),
+    .we     (1'b0),
+    .wd     ('0  ),
 
     // from internal hardware
     .de     (hw2reg.err_code.fifo_read_err.de),
@@ -2323,15 +2379,14 @@
   //   F[fifo_state_err]: 30:30
   prim_subreg #(
     .DW      (1),
-    .SWACCESS("RW"),
+    .SWACCESS("RO"),
     .RESVAL  (1'h0)
   ) u_err_code_fifo_state_err (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (err_code_fifo_state_err_we),
-    .wd     (err_code_fifo_state_err_wd),
+    .we     (1'b0),
+    .wd     ('0  ),
 
     // from internal hardware
     .de     (hw2reg.err_code.fifo_state_err.de),
@@ -2346,9 +2401,36 @@
   );
 
 
+  // R[err_code_test]: V(False)
+
+  prim_subreg #(
+    .DW      (5),
+    .SWACCESS("RW"),
+    .RESVAL  (5'h0)
+  ) u_err_code_test (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (err_code_test_we & regwen_qs),
+    .wd     (err_code_test_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (reg2hw.err_code_test.qe),
+    .q      (reg2hw.err_code_test.q ),
+
+    // to register interface (read)
+    .qs     (err_code_test_qs)
+  );
 
 
-  logic [45:0] addr_hit;
+
+
+  logic [46:0] addr_hit;
   always_comb begin
     addr_hit = '0;
     addr_hit[ 0] = (reg_addr == ENTROPY_SRC_INTR_STATE_OFFSET);
@@ -2397,6 +2479,7 @@
     addr_hit[43] = (reg_addr == ENTROPY_SRC_DEBUG_STATUS_OFFSET);
     addr_hit[44] = (reg_addr == ENTROPY_SRC_SEED_OFFSET);
     addr_hit[45] = (reg_addr == ENTROPY_SRC_ERR_CODE_OFFSET);
+    addr_hit[46] = (reg_addr == ENTROPY_SRC_ERR_CODE_TEST_OFFSET);
   end
 
   assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -2450,6 +2533,7 @@
     if (addr_hit[43] && reg_we && (ENTROPY_SRC_PERMIT[43] != (ENTROPY_SRC_PERMIT[43] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[44] && reg_we && (ENTROPY_SRC_PERMIT[44] != (ENTROPY_SRC_PERMIT[44] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[45] && reg_we && (ENTROPY_SRC_PERMIT[45] != (ENTROPY_SRC_PERMIT[45] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[46] && reg_we && (ENTROPY_SRC_PERMIT[46] != (ENTROPY_SRC_PERMIT[46] & reg_be))) wr_err = 1'b1 ;
   end
 
   assign intr_state_es_entropy_valid_we = addr_hit[0] & reg_we & ~wr_err;
@@ -2458,8 +2542,8 @@
   assign intr_state_es_health_test_failed_we = addr_hit[0] & reg_we & ~wr_err;
   assign intr_state_es_health_test_failed_wd = reg_wdata[1];
 
-  assign intr_state_es_fifo_err_we = addr_hit[0] & reg_we & ~wr_err;
-  assign intr_state_es_fifo_err_wd = reg_wdata[2];
+  assign intr_state_es_fatal_err_we = addr_hit[0] & reg_we & ~wr_err;
+  assign intr_state_es_fatal_err_wd = reg_wdata[2];
 
   assign intr_enable_es_entropy_valid_we = addr_hit[1] & reg_we & ~wr_err;
   assign intr_enable_es_entropy_valid_wd = reg_wdata[0];
@@ -2467,8 +2551,8 @@
   assign intr_enable_es_health_test_failed_we = addr_hit[1] & reg_we & ~wr_err;
   assign intr_enable_es_health_test_failed_wd = reg_wdata[1];
 
-  assign intr_enable_es_fifo_err_we = addr_hit[1] & reg_we & ~wr_err;
-  assign intr_enable_es_fifo_err_wd = reg_wdata[2];
+  assign intr_enable_es_fatal_err_we = addr_hit[1] & reg_we & ~wr_err;
+  assign intr_enable_es_fatal_err_wd = reg_wdata[2];
 
   assign intr_test_es_entropy_valid_we = addr_hit[2] & reg_we & ~wr_err;
   assign intr_test_es_entropy_valid_wd = reg_wdata[0];
@@ -2476,11 +2560,14 @@
   assign intr_test_es_health_test_failed_we = addr_hit[2] & reg_we & ~wr_err;
   assign intr_test_es_health_test_failed_wd = reg_wdata[1];
 
-  assign intr_test_es_fifo_err_we = addr_hit[2] & reg_we & ~wr_err;
-  assign intr_test_es_fifo_err_wd = reg_wdata[2];
+  assign intr_test_es_fatal_err_we = addr_hit[2] & reg_we & ~wr_err;
+  assign intr_test_es_fatal_err_wd = reg_wdata[2];
 
-  assign alert_test_we = addr_hit[3] & reg_we & ~wr_err;
-  assign alert_test_wd = reg_wdata[0];
+  assign alert_test_recov_alert_we = addr_hit[3] & reg_we & ~wr_err;
+  assign alert_test_recov_alert_wd = reg_wdata[0];
+
+  assign alert_test_fatal_alert_we = addr_hit[3] & reg_we & ~wr_err;
+  assign alert_test_fatal_alert_wd = reg_wdata[1];
 
   assign regwen_we = addr_hit[4] & reg_we & ~wr_err;
   assign regwen_wd = reg_wdata[0];
@@ -2678,23 +2765,16 @@
   assign seed_we = addr_hit[44] & reg_we & ~wr_err;
   assign seed_wd = reg_wdata[3:0];
 
-  assign err_code_sfifo_esrng_err_we = addr_hit[45] & reg_we & ~wr_err;
-  assign err_code_sfifo_esrng_err_wd = reg_wdata[0];
 
-  assign err_code_sfifo_precon_err_we = addr_hit[45] & reg_we & ~wr_err;
-  assign err_code_sfifo_precon_err_wd = reg_wdata[1];
 
-  assign err_code_sfifo_esfinal_err_we = addr_hit[45] & reg_we & ~wr_err;
-  assign err_code_sfifo_esfinal_err_wd = reg_wdata[2];
 
-  assign err_code_fifo_write_err_we = addr_hit[45] & reg_we & ~wr_err;
-  assign err_code_fifo_write_err_wd = reg_wdata[28];
 
-  assign err_code_fifo_read_err_we = addr_hit[45] & reg_we & ~wr_err;
-  assign err_code_fifo_read_err_wd = reg_wdata[29];
 
-  assign err_code_fifo_state_err_we = addr_hit[45] & reg_we & ~wr_err;
-  assign err_code_fifo_state_err_wd = reg_wdata[30];
+
+
+
+  assign err_code_test_we = addr_hit[46] & reg_we & ~wr_err;
+  assign err_code_test_wd = reg_wdata[4:0];
 
   // Read data return
   always_comb begin
@@ -2703,13 +2783,13 @@
       addr_hit[0]: begin
         reg_rdata_next[0] = intr_state_es_entropy_valid_qs;
         reg_rdata_next[1] = intr_state_es_health_test_failed_qs;
-        reg_rdata_next[2] = intr_state_es_fifo_err_qs;
+        reg_rdata_next[2] = intr_state_es_fatal_err_qs;
       end
 
       addr_hit[1]: begin
         reg_rdata_next[0] = intr_enable_es_entropy_valid_qs;
         reg_rdata_next[1] = intr_enable_es_health_test_failed_qs;
-        reg_rdata_next[2] = intr_enable_es_fifo_err_qs;
+        reg_rdata_next[2] = intr_enable_es_fatal_err_qs;
       end
 
       addr_hit[2]: begin
@@ -2720,6 +2800,7 @@
 
       addr_hit[3]: begin
         reg_rdata_next[0] = '0;
+        reg_rdata_next[1] = '0;
       end
 
       addr_hit[4]: begin
@@ -2929,11 +3010,17 @@
         reg_rdata_next[0] = err_code_sfifo_esrng_err_qs;
         reg_rdata_next[1] = err_code_sfifo_precon_err_qs;
         reg_rdata_next[2] = err_code_sfifo_esfinal_err_qs;
+        reg_rdata_next[20] = err_code_es_ack_sm_err_qs;
+        reg_rdata_next[21] = err_code_es_main_sm_err_qs;
         reg_rdata_next[28] = err_code_fifo_write_err_qs;
         reg_rdata_next[29] = err_code_fifo_read_err_qs;
         reg_rdata_next[30] = err_code_fifo_state_err_qs;
       end
 
+      addr_hit[46]: begin
+        reg_rdata_next[4:0] = err_code_test_qs;
+      end
+
       default: begin
         reg_rdata_next = '1;
       end
diff --git a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
index b230507..14703d7 100644
--- a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
+++ b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
@@ -6459,7 +6459,7 @@
           type: interrupt
         }
         {
-          name: es_fifo_err
+          name: es_fatal_err
           width: 1
           bits: "2"
           bitinfo:
@@ -6474,7 +6474,7 @@
       alert_list:
       [
         {
-          name: recov_alert_count_met
+          name: recov_alert
           width: 1
           bits: "0"
           bitinfo:
@@ -6486,6 +6486,19 @@
           type: alert
           async: 1
         }
+        {
+          name: fatal_alert
+          width: 1
+          bits: "1"
+          bitinfo:
+          [
+            2
+            1
+            1
+          ]
+          type: alert
+          async: 1
+        }
       ]
       wakeup_list: []
       reset_request_list: []
@@ -11162,7 +11175,7 @@
       module_name: entropy_src
     }
     {
-      name: entropy_src_es_fifo_err
+      name: entropy_src_es_fatal_err
       width: 1
       bits: "2"
       bitinfo:
@@ -11430,7 +11443,7 @@
       module_name: lc_ctrl
     }
     {
-      name: entropy_src_recov_alert_count_met
+      name: entropy_src_recov_alert
       width: 1
       bits: "0"
       bitinfo:
@@ -11444,6 +11457,20 @@
       module_name: entropy_src
     }
     {
+      name: entropy_src_fatal_alert
+      width: 1
+      bits: "1"
+      bitinfo:
+      [
+        2
+        1
+        1
+      ]
+      type: alert
+      async: 1
+      module_name: entropy_src
+    }
+    {
       name: csrng_fatal_alert
       width: 1
       bits: "0"
diff --git a/hw/top_earlgrey/dv/autogen/tb__alert_handler_connect.sv b/hw/top_earlgrey/dv/autogen/tb__alert_handler_connect.sv
index 2ecf2cd..621bf91 100644
--- a/hw/top_earlgrey/dv/autogen/tb__alert_handler_connect.sv
+++ b/hw/top_earlgrey/dv/autogen/tb__alert_handler_connect.sv
@@ -22,9 +22,10 @@
 assign alert_if[15].alert_tx = `CHIP_HIER.u_lc_ctrl.alert_tx_o[0];
 assign alert_if[16].alert_tx = `CHIP_HIER.u_lc_ctrl.alert_tx_o[1];
 assign alert_if[17].alert_tx = `CHIP_HIER.u_entropy_src.alert_tx_o[0];
-assign alert_if[18].alert_tx = `CHIP_HIER.u_csrng.alert_tx_o[0];
-assign alert_if[19].alert_tx = `CHIP_HIER.u_sram_ctrl_main.alert_tx_o[0];
-assign alert_if[20].alert_tx = `CHIP_HIER.u_sram_ctrl_ret_aon.alert_tx_o[0];
-assign alert_if[21].alert_tx = `CHIP_HIER.u_flash_ctrl.alert_tx_o[0];
-assign alert_if[22].alert_tx = `CHIP_HIER.u_flash_ctrl.alert_tx_o[1];
-assign alert_if[23].alert_tx = `CHIP_HIER.u_flash_ctrl.alert_tx_o[2];
+assign alert_if[18].alert_tx = `CHIP_HIER.u_entropy_src.alert_tx_o[1];
+assign alert_if[19].alert_tx = `CHIP_HIER.u_csrng.alert_tx_o[0];
+assign alert_if[20].alert_tx = `CHIP_HIER.u_sram_ctrl_main.alert_tx_o[0];
+assign alert_if[21].alert_tx = `CHIP_HIER.u_sram_ctrl_ret_aon.alert_tx_o[0];
+assign alert_if[22].alert_tx = `CHIP_HIER.u_flash_ctrl.alert_tx_o[0];
+assign alert_if[23].alert_tx = `CHIP_HIER.u_flash_ctrl.alert_tx_o[1];
+assign alert_if[24].alert_tx = `CHIP_HIER.u_flash_ctrl.alert_tx_o[2];
diff --git a/hw/top_earlgrey/dv/env/autogen/alert_handler_env_pkg__params.sv b/hw/top_earlgrey/dv/env/autogen/alert_handler_env_pkg__params.sv
index c66641a..10d9659 100644
--- a/hw/top_earlgrey/dv/env/autogen/alert_handler_env_pkg__params.sv
+++ b/hw/top_earlgrey/dv/env/autogen/alert_handler_env_pkg__params.sv
@@ -22,7 +22,8 @@
   "otp_ctrl_fatal_check_error",
   "lc_ctrl_fatal_prog_error",
   "lc_ctrl_fatal_state_error",
-  "entropy_src_recov_alert_count_met",
+  "entropy_src_recov_alert",
+  "entropy_src_fatal_alert",
   "csrng_fatal_alert",
   "sram_ctrl_main_fatal_parity_error",
   "sram_ctrl_ret_aon_fatal_parity_error",
@@ -31,4 +32,4 @@
   "flash_ctrl_recov_ecc_err"
 };
 
-parameter uint NUM_ALERTS = 24;
+parameter uint NUM_ALERTS = 25;
diff --git a/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson b/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson
index 7e71e54..07aa720 100644
--- a/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson
+++ b/hw/top_earlgrey/ip/alert_handler/data/autogen/alert_handler.hjson
@@ -46,7 +46,7 @@
     { name: "NAlerts",
       desc: "Number of peripheral inputs",
       type: "int",
-      default: "24",
+      default: "25",
       local: "true"
     },
     { name: "EscCntDw",
@@ -64,7 +64,7 @@
     { name: "AsyncOn",
       desc: "Number of peripheral outputs",
       type: "logic [NAlerts-1:0]",
-      default: "24'b111011100001100000001111",
+      default: "25'b1110111100001100000001111",
       local: "true"
     },
     { name: "N_CLASSES",
diff --git a/hw/top_earlgrey/ip/alert_handler/dv/alert_handler_env_pkg__params.sv b/hw/top_earlgrey/ip/alert_handler/dv/alert_handler_env_pkg__params.sv
index 2dfb5b7..9078ec7 100644
--- a/hw/top_earlgrey/ip/alert_handler/dv/alert_handler_env_pkg__params.sv
+++ b/hw/top_earlgrey/ip/alert_handler/dv/alert_handler_env_pkg__params.sv
@@ -10,5 +10,5 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 
-parameter uint NUM_ALERTS = 24;
-parameter bit [NUM_ALERTS-1:0] ASYNC_ON = 24'b111011100001100000001111;
+parameter uint NUM_ALERTS = 25;
+parameter bit [NUM_ALERTS-1:0] ASYNC_ON = 25'b1110111100001100000001111;
diff --git a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
index be2025f..c27c6ad 100644
--- a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
@@ -7,10 +7,10 @@
 package alert_handler_reg_pkg;
 
   // Param list
-  parameter int NAlerts = 24;
+  parameter int NAlerts = 25;
   parameter int EscCntDw = 32;
   parameter int AccuCntDw = 16;
-  parameter logic [NAlerts-1:0] AsyncOn = 24'b111011100001100000001111;
+  parameter logic [NAlerts-1:0] AsyncOn = 25'b1110111100001100000001111;
   parameter int N_CLASSES = 4;
   parameter int N_ESC_SEV = 4;
   parameter int N_PHASES = 4;
@@ -457,14 +457,14 @@
   // Register to internal design logic //
   ///////////////////////////////////////
   typedef struct packed {
-    alert_handler_reg2hw_intr_state_reg_t intr_state; // [920:917]
-    alert_handler_reg2hw_intr_enable_reg_t intr_enable; // [916:913]
-    alert_handler_reg2hw_intr_test_reg_t intr_test; // [912:905]
-    alert_handler_reg2hw_regwen_reg_t regwen; // [904:904]
-    alert_handler_reg2hw_ping_timeout_cyc_reg_t ping_timeout_cyc; // [903:880]
-    alert_handler_reg2hw_alert_en_mreg_t [23:0] alert_en; // [879:856]
-    alert_handler_reg2hw_alert_class_mreg_t [23:0] alert_class; // [855:808]
-    alert_handler_reg2hw_alert_cause_mreg_t [23:0] alert_cause; // [807:784]
+    alert_handler_reg2hw_intr_state_reg_t intr_state; // [924:921]
+    alert_handler_reg2hw_intr_enable_reg_t intr_enable; // [920:917]
+    alert_handler_reg2hw_intr_test_reg_t intr_test; // [916:909]
+    alert_handler_reg2hw_regwen_reg_t regwen; // [908:908]
+    alert_handler_reg2hw_ping_timeout_cyc_reg_t ping_timeout_cyc; // [907:884]
+    alert_handler_reg2hw_alert_en_mreg_t [24:0] alert_en; // [883:859]
+    alert_handler_reg2hw_alert_class_mreg_t [24:0] alert_class; // [858:809]
+    alert_handler_reg2hw_alert_cause_mreg_t [24:0] alert_cause; // [808:784]
     alert_handler_reg2hw_loc_alert_en_mreg_t [3:0] loc_alert_en; // [783:780]
     alert_handler_reg2hw_loc_alert_class_mreg_t [3:0] loc_alert_class; // [779:772]
     alert_handler_reg2hw_loc_alert_cause_mreg_t [3:0] loc_alert_cause; // [771:768]
@@ -506,8 +506,8 @@
   // Internal design logic to register //
   ///////////////////////////////////////
   typedef struct packed {
-    alert_handler_hw2reg_intr_state_reg_t intr_state; // [275:268]
-    alert_handler_hw2reg_alert_cause_mreg_t [23:0] alert_cause; // [267:220]
+    alert_handler_hw2reg_intr_state_reg_t intr_state; // [277:270]
+    alert_handler_hw2reg_alert_cause_mreg_t [24:0] alert_cause; // [269:220]
     alert_handler_hw2reg_loc_alert_cause_mreg_t [3:0] loc_alert_cause; // [219:212]
     alert_handler_hw2reg_classa_regwen_reg_t classa_regwen; // [211:210]
     alert_handler_hw2reg_classa_accum_cnt_reg_t classa_accum_cnt; // [209:194]
@@ -679,10 +679,10 @@
     4'b 0001, // index[ 2] ALERT_HANDLER_INTR_TEST
     4'b 0001, // index[ 3] ALERT_HANDLER_REGWEN
     4'b 0111, // index[ 4] ALERT_HANDLER_PING_TIMEOUT_CYC
-    4'b 0111, // index[ 5] ALERT_HANDLER_ALERT_EN
+    4'b 1111, // index[ 5] ALERT_HANDLER_ALERT_EN
     4'b 1111, // index[ 6] ALERT_HANDLER_ALERT_CLASS_0
-    4'b 0011, // index[ 7] ALERT_HANDLER_ALERT_CLASS_1
-    4'b 0111, // index[ 8] ALERT_HANDLER_ALERT_CAUSE
+    4'b 0111, // index[ 7] ALERT_HANDLER_ALERT_CLASS_1
+    4'b 1111, // index[ 8] ALERT_HANDLER_ALERT_CAUSE
     4'b 0001, // index[ 9] ALERT_HANDLER_LOC_ALERT_EN
     4'b 0001, // index[10] ALERT_HANDLER_LOC_ALERT_CLASS
     4'b 0001, // index[11] ALERT_HANDLER_LOC_ALERT_CAUSE
diff --git a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
index 2826e40..751a776 100644
--- a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
+++ b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
@@ -181,6 +181,9 @@
   logic alert_en_en_a_23_qs;
   logic alert_en_en_a_23_wd;
   logic alert_en_en_a_23_we;
+  logic alert_en_en_a_24_qs;
+  logic alert_en_en_a_24_wd;
+  logic alert_en_en_a_24_we;
   logic [1:0] alert_class_0_class_a_0_qs;
   logic [1:0] alert_class_0_class_a_0_wd;
   logic alert_class_0_class_a_0_we;
@@ -253,6 +256,9 @@
   logic [1:0] alert_class_1_class_a_23_qs;
   logic [1:0] alert_class_1_class_a_23_wd;
   logic alert_class_1_class_a_23_we;
+  logic [1:0] alert_class_1_class_a_24_qs;
+  logic [1:0] alert_class_1_class_a_24_wd;
+  logic alert_class_1_class_a_24_we;
   logic alert_cause_a_0_qs;
   logic alert_cause_a_0_wd;
   logic alert_cause_a_0_we;
@@ -325,6 +331,9 @@
   logic alert_cause_a_23_qs;
   logic alert_cause_a_23_wd;
   logic alert_cause_a_23_we;
+  logic alert_cause_a_24_qs;
+  logic alert_cause_a_24_wd;
+  logic alert_cause_a_24_we;
   logic loc_alert_en_en_la_0_qs;
   logic loc_alert_en_en_la_0_wd;
   logic loc_alert_en_en_la_0_we;
@@ -1555,6 +1564,32 @@
   );
 
 
+  // F[en_a_24]: 24:24
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_alert_en_en_a_24 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (alert_en_en_a_24_we & regwen_qs),
+    .wd     (alert_en_en_a_24_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.alert_en[24].q ),
+
+    // to register interface (read)
+    .qs     (alert_en_en_a_24_qs)
+  );
+
+
 
 
   // Subregister 0 of Multireg alert_class
@@ -2187,6 +2222,32 @@
   );
 
 
+  // F[class_a_24]: 17:16
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_alert_class_1_class_a_24 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (alert_class_1_class_a_24_we & regwen_qs),
+    .wd     (alert_class_1_class_a_24_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.alert_class[24].q ),
+
+    // to register interface (read)
+    .qs     (alert_class_1_class_a_24_qs)
+  );
+
+
 
 
   // Subregister 0 of Multireg alert_cause
@@ -2816,6 +2877,32 @@
   );
 
 
+  // F[a_24]: 24:24
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W1C"),
+    .RESVAL  (1'h0)
+  ) u_alert_cause_a_24 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (alert_cause_a_24_we),
+    .wd     (alert_cause_a_24_wd),
+
+    // from internal hardware
+    .de     (hw2reg.alert_cause[24].de),
+    .d      (hw2reg.alert_cause[24].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.alert_cause[24].q ),
+
+    // to register interface (read)
+    .qs     (alert_cause_a_24_qs)
+  );
+
+
 
 
   // Subregister 0 of Multireg loc_alert_en
@@ -5492,6 +5579,9 @@
   assign alert_en_en_a_23_we = addr_hit[5] & reg_we & ~wr_err;
   assign alert_en_en_a_23_wd = reg_wdata[23];
 
+  assign alert_en_en_a_24_we = addr_hit[5] & reg_we & ~wr_err;
+  assign alert_en_en_a_24_wd = reg_wdata[24];
+
   assign alert_class_0_class_a_0_we = addr_hit[6] & reg_we & ~wr_err;
   assign alert_class_0_class_a_0_wd = reg_wdata[1:0];
 
@@ -5564,6 +5654,9 @@
   assign alert_class_1_class_a_23_we = addr_hit[7] & reg_we & ~wr_err;
   assign alert_class_1_class_a_23_wd = reg_wdata[15:14];
 
+  assign alert_class_1_class_a_24_we = addr_hit[7] & reg_we & ~wr_err;
+  assign alert_class_1_class_a_24_wd = reg_wdata[17:16];
+
   assign alert_cause_a_0_we = addr_hit[8] & reg_we & ~wr_err;
   assign alert_cause_a_0_wd = reg_wdata[0];
 
@@ -5636,6 +5729,9 @@
   assign alert_cause_a_23_we = addr_hit[8] & reg_we & ~wr_err;
   assign alert_cause_a_23_wd = reg_wdata[23];
 
+  assign alert_cause_a_24_we = addr_hit[8] & reg_we & ~wr_err;
+  assign alert_cause_a_24_wd = reg_wdata[24];
+
   assign loc_alert_en_en_la_0_we = addr_hit[9] & reg_we & ~wr_err;
   assign loc_alert_en_en_la_0_wd = reg_wdata[0];
 
@@ -5970,6 +6066,7 @@
         reg_rdata_next[21] = alert_en_en_a_21_qs;
         reg_rdata_next[22] = alert_en_en_a_22_qs;
         reg_rdata_next[23] = alert_en_en_a_23_qs;
+        reg_rdata_next[24] = alert_en_en_a_24_qs;
       end
 
       addr_hit[6]: begin
@@ -6000,6 +6097,7 @@
         reg_rdata_next[11:10] = alert_class_1_class_a_21_qs;
         reg_rdata_next[13:12] = alert_class_1_class_a_22_qs;
         reg_rdata_next[15:14] = alert_class_1_class_a_23_qs;
+        reg_rdata_next[17:16] = alert_class_1_class_a_24_qs;
       end
 
       addr_hit[8]: begin
@@ -6027,6 +6125,7 @@
         reg_rdata_next[21] = alert_cause_a_21_qs;
         reg_rdata_next[22] = alert_cause_a_22_qs;
         reg_rdata_next[23] = alert_cause_a_23_qs;
+        reg_rdata_next[24] = alert_cause_a_24_qs;
       end
 
       addr_hit[9]: begin
diff --git a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
index c5d5148..1329d52 100644
--- a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
+++ b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
@@ -370,7 +370,7 @@
   logic intr_csrng_cs_fatal_err;
   logic intr_entropy_src_es_entropy_valid;
   logic intr_entropy_src_es_health_test_failed;
-  logic intr_entropy_src_es_fifo_err;
+  logic intr_entropy_src_es_fatal_err;
   logic intr_edn0_edn_cmd_req_done;
   logic intr_edn0_edn_fifo_err;
   logic intr_edn1_edn_cmd_req_done;
@@ -1915,11 +1915,12 @@
       // Interrupt
       .intr_es_entropy_valid_o      (intr_entropy_src_es_entropy_valid),
       .intr_es_health_test_failed_o (intr_entropy_src_es_health_test_failed),
-      .intr_es_fifo_err_o           (intr_entropy_src_es_fifo_err),
+      .intr_es_fatal_err_o          (intr_entropy_src_es_fatal_err),
 
-      // [20]: recov_alert_count_met
-      .alert_tx_o  ( alert_tx[20:20] ),
-      .alert_rx_i  ( alert_rx[20:20] ),
+      // [20]: recov_alert
+      // [21]: fatal_alert
+      .alert_tx_o  ( alert_tx[21:20] ),
+      .alert_rx_i  ( alert_rx[21:20] ),
 
       // Inter-module signals
       .entropy_src_hw_if_i(csrng_entropy_src_hw_if_req),
@@ -1981,9 +1982,9 @@
     .InstrExec(SramCtrlMainInstrExec)
   ) u_sram_ctrl_main (
 
-      // [21]: fatal_parity_error
-      .alert_tx_o  ( alert_tx[21:21] ),
-      .alert_rx_i  ( alert_rx[21:21] ),
+      // [22]: fatal_parity_error
+      .alert_tx_o  ( alert_tx[22:22] ),
+      .alert_rx_i  ( alert_rx[22:22] ),
 
       // Inter-module signals
       .sram_otp_key_o(otp_ctrl_sram_otp_key_req[0]),
@@ -2011,10 +2012,10 @@
       // Interrupt
       .intr_done_o (intr_otbn_done),
 
-      // [22]: fatal
-      // [23]: recov
-      .alert_tx_o  ( alert_tx[23:22] ),
-      .alert_rx_i  ( alert_rx[23:22] ),
+      // [23]: fatal
+      // [24]: recov
+      .alert_tx_o  ( alert_tx[24:23] ),
+      .alert_rx_i  ( alert_rx[24:23] ),
 
       // Inter-module signals
       .idle_o(clkmgr_aon_idle[3]),
@@ -2028,7 +2029,7 @@
 
   // interrupt assignments
   assign intr_vector = {
-      intr_entropy_src_es_fifo_err, // ID 139
+      intr_entropy_src_es_fatal_err, // ID 139
       intr_entropy_src_es_health_test_failed, // ID 138
       intr_entropy_src_es_entropy_valid, // ID 137
       intr_aon_timer_aon_wdog_timer_bark, // ID 136
diff --git a/hw/top_earlgrey/sw/autogen/top_earlgrey.c b/hw/top_earlgrey/sw/autogen/top_earlgrey.c
index e0f692c..f0e28ef 100644
--- a/hw/top_earlgrey/sw/autogen/top_earlgrey.c
+++ b/hw/top_earlgrey/sw/autogen/top_earlgrey.c
@@ -182,7 +182,7 @@
   [kTopEarlgreyPlicIrqIdAonTimerAonWdogTimerBark] = kTopEarlgreyPlicPeripheralAonTimerAon,
   [kTopEarlgreyPlicIrqIdEntropySrcEsEntropyValid] = kTopEarlgreyPlicPeripheralEntropySrc,
   [kTopEarlgreyPlicIrqIdEntropySrcEsHealthTestFailed] = kTopEarlgreyPlicPeripheralEntropySrc,
-  [kTopEarlgreyPlicIrqIdEntropySrcEsFifoErr] = kTopEarlgreyPlicPeripheralEntropySrc,
+  [kTopEarlgreyPlicIrqIdEntropySrcEsFatalErr] = kTopEarlgreyPlicPeripheralEntropySrc,
 };
 
 
@@ -193,7 +193,7 @@
  * `top_earlgrey_alert_peripheral_t`.
  */
 const top_earlgrey_alert_peripheral_t
-    top_earlgrey_alert_for_peripheral[24] = {
+    top_earlgrey_alert_for_peripheral[25] = {
   [kTopEarlgreyAlertIdAesRecovCtrlUpdateErr] = kTopEarlgreyAlertPeripheralAes,
   [kTopEarlgreyAlertIdAesFatalFault] = kTopEarlgreyAlertPeripheralAes,
   [kTopEarlgreyAlertIdOtbnFatal] = kTopEarlgreyAlertPeripheralOtbn,
@@ -211,7 +211,8 @@
   [kTopEarlgreyAlertIdOtpCtrlFatalCheckError] = kTopEarlgreyAlertPeripheralOtpCtrl,
   [kTopEarlgreyAlertIdLcCtrlFatalProgError] = kTopEarlgreyAlertPeripheralLcCtrl,
   [kTopEarlgreyAlertIdLcCtrlFatalStateError] = kTopEarlgreyAlertPeripheralLcCtrl,
-  [kTopEarlgreyAlertIdEntropySrcRecovAlertCountMet] = kTopEarlgreyAlertPeripheralEntropySrc,
+  [kTopEarlgreyAlertIdEntropySrcRecovAlert] = kTopEarlgreyAlertPeripheralEntropySrc,
+  [kTopEarlgreyAlertIdEntropySrcFatalAlert] = kTopEarlgreyAlertPeripheralEntropySrc,
   [kTopEarlgreyAlertIdCsrngFatalAlert] = kTopEarlgreyAlertPeripheralCsrng,
   [kTopEarlgreyAlertIdSramCtrlMainFatalParityError] = kTopEarlgreyAlertPeripheralSramCtrlMain,
   [kTopEarlgreyAlertIdSramCtrlRetAonFatalParityError] = kTopEarlgreyAlertPeripheralSramCtrlRetAon,
diff --git a/hw/top_earlgrey/sw/autogen/top_earlgrey.h b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
index 72a9b0e..618fc93 100644
--- a/hw/top_earlgrey/sw/autogen/top_earlgrey.h
+++ b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
@@ -927,7 +927,7 @@
   kTopEarlgreyPlicIrqIdAonTimerAonWdogTimerBark = 167, /**< aon_timer_aon_wdog_timer_bark */
   kTopEarlgreyPlicIrqIdEntropySrcEsEntropyValid = 168, /**< entropy_src_es_entropy_valid */
   kTopEarlgreyPlicIrqIdEntropySrcEsHealthTestFailed = 169, /**< entropy_src_es_health_test_failed */
-  kTopEarlgreyPlicIrqIdEntropySrcEsFifoErr = 170, /**< entropy_src_es_fifo_err */
+  kTopEarlgreyPlicIrqIdEntropySrcEsFatalErr = 170, /**< entropy_src_es_fatal_err */
   kTopEarlgreyPlicIrqIdLast = 170, /**< \internal The Last Valid Interrupt ID. */
 } top_earlgrey_plic_irq_id_t;
 
@@ -996,14 +996,15 @@
   kTopEarlgreyAlertIdOtpCtrlFatalCheckError = 14, /**< otp_ctrl_fatal_check_error */
   kTopEarlgreyAlertIdLcCtrlFatalProgError = 15, /**< lc_ctrl_fatal_prog_error */
   kTopEarlgreyAlertIdLcCtrlFatalStateError = 16, /**< lc_ctrl_fatal_state_error */
-  kTopEarlgreyAlertIdEntropySrcRecovAlertCountMet = 17, /**< entropy_src_recov_alert_count_met */
-  kTopEarlgreyAlertIdCsrngFatalAlert = 18, /**< csrng_fatal_alert */
-  kTopEarlgreyAlertIdSramCtrlMainFatalParityError = 19, /**< sram_ctrl_main_fatal_parity_error */
-  kTopEarlgreyAlertIdSramCtrlRetAonFatalParityError = 20, /**< sram_ctrl_ret_aon_fatal_parity_error */
-  kTopEarlgreyAlertIdFlashCtrlRecovErr = 21, /**< flash_ctrl_recov_err */
-  kTopEarlgreyAlertIdFlashCtrlRecovMpErr = 22, /**< flash_ctrl_recov_mp_err */
-  kTopEarlgreyAlertIdFlashCtrlRecovEccErr = 23, /**< flash_ctrl_recov_ecc_err */
-  kTopEarlgreyAlertIdLast = 23, /**< \internal The Last Valid Alert ID. */
+  kTopEarlgreyAlertIdEntropySrcRecovAlert = 17, /**< entropy_src_recov_alert */
+  kTopEarlgreyAlertIdEntropySrcFatalAlert = 18, /**< entropy_src_fatal_alert */
+  kTopEarlgreyAlertIdCsrngFatalAlert = 19, /**< csrng_fatal_alert */
+  kTopEarlgreyAlertIdSramCtrlMainFatalParityError = 20, /**< sram_ctrl_main_fatal_parity_error */
+  kTopEarlgreyAlertIdSramCtrlRetAonFatalParityError = 21, /**< sram_ctrl_ret_aon_fatal_parity_error */
+  kTopEarlgreyAlertIdFlashCtrlRecovErr = 22, /**< flash_ctrl_recov_err */
+  kTopEarlgreyAlertIdFlashCtrlRecovMpErr = 23, /**< flash_ctrl_recov_mp_err */
+  kTopEarlgreyAlertIdFlashCtrlRecovEccErr = 24, /**< flash_ctrl_recov_ecc_err */
+  kTopEarlgreyAlertIdLast = 24, /**< \internal The Last Valid Alert ID. */
 } top_earlgrey_alert_id_t;
 
 /**
@@ -1013,7 +1014,7 @@
  * `top_earlgrey_alert_peripheral_t`.
  */
 extern const top_earlgrey_alert_peripheral_t
-    top_earlgrey_alert_for_peripheral[24];
+    top_earlgrey_alert_for_peripheral[25];
 
 #define PINMUX_MIO_PERIPH_INSEL_IDX_OFFSET 2