[entropy_src/rtl] review round2 changes

Signed-off-by: Mark Branstad <mark.branstad@wdc.com>
diff --git a/hw/ip/entropy_src/rtl/entropy_src.sv b/hw/ip/entropy_src/rtl/entropy_src.sv
index 1269dd1..c731016 100755
--- a/hw/ip/entropy_src/rtl/entropy_src.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src.sv
@@ -6,7 +6,7 @@
 
 
 module entropy_src import entropy_src_pkg::*; #(
-  parameter int unsigned EsFifoDepth = 16
+  parameter int unsigned EsFifoDepth = 2
 ) (
   input  clk_i,
   input  rst_ni,
@@ -26,10 +26,13 @@
   output entropy_src_rng_req_t entropy_src_rng_o,
   input  entropy_src_rng_rsp_t entropy_src_rng_i,
 
+  // Alerts
+  input  prim_alert_pkg::alert_rx_t alert_rx_i,
+  output prim_alert_pkg::alert_tx_t alert_tx_o,
+
   // Interrupts
   output logic    es_entropy_valid_o,
-  output logic    es_rct_failed_o,
-  output logic    es_apt_failed_o,
+  output logic    es_health_test_failed_o,
   output logic    es_fifo_err_o
 );
 
@@ -38,6 +41,8 @@
   entropy_src_reg2hw_t reg2hw;
   entropy_src_hw2reg_t hw2reg;
 
+  logic alert_event;
+
   entropy_src_reg_top u_reg (
     .clk_i,
     .rst_ni,
@@ -65,10 +70,24 @@
     .entropy_src_rng_o,
     .entropy_src_rng_i,
 
+    .alert_event_o(alert_event),
+
     .es_entropy_valid_o,
-    .es_rct_failed_o,
-    .es_apt_failed_o,
+    .es_health_test_failed_o,
     .es_fifo_err_o
   );
 
+   prim_alert_sender #(
+     .AsyncOn(1'b0) // TODO: does this need to be AsyncOn
+   ) u_alert_sender_i (
+     .clk_i      ( clk_i      ),
+     .rst_ni     ( rst_ni     ),
+     .alert_i    ( alert_event ),
+     .alert_rx_i ( alert_rx_i ),
+     .alert_tx_o ( alert_tx_o )
+   );
+
+  // Outputs should have a known value after reset
+  `ASSERT_KNOWN(AlertTxKnown, alert_tx_o)
+
 endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_adaptp_ht.sv b/hw/ip/entropy_src/rtl/entropy_src_adaptp_ht.sv
new file mode 100755
index 0000000..e89c17d
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_adaptp_ht.sv
@@ -0,0 +1,83 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src adaptive proportion health test module
+//
+
+module entropy_src_adaptp_ht #(
+  parameter int unsigned RegWidth = 16,
+  parameter int unsigned RngBusWidth = 4
+) (
+  input                  clk_i,
+  input                  rst_ni,
+
+   // ins req interface
+  input logic [RngBusWidth-1:0] entropy_bit_i,
+  input logic                   entropy_bit_vld_i,
+  input logic                   clear_i,
+  input logic                   active_i,
+  input logic [RegWidth-1:0]    thresh_hi_i,
+  input logic [RegWidth-1:0]    thresh_lo_i,
+  input logic [RegWidth-1:0]    window_i,
+  output logic [RegWidth-1:0]   test_cnt_o,
+  output logic                  test_done_pulse_o,
+  output logic                  test_fail_hi_pulse_o,
+  output logic                  test_fail_lo_pulse_o
+);
+
+  // signals
+  logic [RegWidth-1:0] column_cnt;
+  logic        window_cntr_wrap;
+
+  // flops
+  logic [RegWidth-1:0] window_cntr_q, window_cntr_d;
+  logic [RegWidth-1:0] test_cnt_q, test_cnt_d;
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      window_cntr_q    <= '0;
+      test_cnt_q       <= '0;
+    end else begin
+      window_cntr_q    <= window_cntr_d;
+      test_cnt_q       <= test_cnt_d;
+    end
+
+
+  // Adaptive Proportion Test
+  //
+  // Test operation
+  //  This is an approved modification of the NIST Adaptive Proportion test in that
+  //  instead of counting the first sampled value (1'b1 or 1'b0), it will count
+  //  only the 1's on all four bit streams and accumulate for the during of the
+  //  window size (W) of the test.
+
+
+  // Number of ones per column
+  assign column_cnt = entropy_bit_i[3]+entropy_bit_i[2]+entropy_bit_i[1]+entropy_bit_i[0];
+
+  // Window wrap condition
+  assign window_cntr_wrap = (window_cntr_q == window_i);
+
+  // Window counter
+  assign window_cntr_d =
+         clear_i ? '0 :
+         window_cntr_wrap ? '0  :
+         entropy_bit_vld_i ? (window_cntr_q+1) :
+         window_cntr_q;
+
+  // Test event counter
+  assign test_cnt_d =
+         (!active_i || clear_i) ? '0 :
+         window_cntr_wrap ? '0 :
+         entropy_bit_vld_i ? (test_cnt_q+column_cnt) :
+         test_cnt_q;
+
+  // the pulses will be only one clock in length
+  assign test_fail_hi_pulse_o = active_i && window_cntr_wrap && (test_cnt_q > thresh_hi_i);
+  assign test_fail_lo_pulse_o = active_i && window_cntr_wrap && (test_cnt_q < thresh_lo_i);
+  assign test_done_pulse_o = window_cntr_wrap;
+  assign test_cnt_o = test_cnt_q;
+
+
+endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_align_sm.sv b/hw/ip/entropy_src/rtl/entropy_src_align_sm.sv
deleted file mode 100755
index 0a93d4f..0000000
--- a/hw/ip/entropy_src/rtl/entropy_src_align_sm.sv
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-// Description: entropy_src byte allignment of entropy bits state machine module
-//
-
-module entropy_src_align_sm (
-  input                  clk_i,
-  input                  rst_ni,
-
-   // ins req interface
-  input logic            es_enable_i,
-  input logic            es_health_fail_i,
-  input logic            upstr_fifo_vld_i,
-  input logic            dwstr_fifo_not_full_i,
-  output logic           dwstr_fifo_push_o,
-  output logic           es_load_byte0_o,
-  output logic           es_load_byte1_o,
-  output logic           es_load_byte2_o,
-  output logic           es_load_byte3_o,
-  input logic            other_dwstr_fifo_empty_i,
-  output logic           dwstr_fifo_swap_o,
-  output logic           dwstr_fifo_clr_o
-);
-
-
-  typedef enum logic [3:0] {
-                            IDLE  = 4'h0,
-                            BYTE0 = 4'h1,
-                            BYTE1 = 4'h2,
-                            BYTE2 = 4'h3,
-                            BYTE3 = 4'h4,
-                            PUSH  = 4'h5,
-                            FCHK  = 4'h6,
-                            SWAP  = 4'h7,
-                            BAIL  = 4'h8
-                            } state_e;
-
-  state_e state_q, state_d;
-
-
-  always_ff @(posedge clk_i or negedge rst_ni)
-    if (!rst_ni) begin
-      state_q    <= IDLE;
-    end else begin
-      state_q    <= state_d;
-    end
-
-
-  always_comb begin
-    state_d = state_q;
-    dwstr_fifo_push_o = 1'b0;
-    es_load_byte0_o = 1'b0;
-    es_load_byte1_o = 1'b0;
-    es_load_byte2_o = 1'b0;
-    es_load_byte3_o = 1'b0;
-    dwstr_fifo_clr_o = 1'b0;
-    dwstr_fifo_swap_o = 1'b0;
-    unique case (state_q)
-//    case (state_q)
-      IDLE: begin
-        if (es_enable_i) begin
-          state_d = BYTE0;
-        end
-      end
-      BYTE0: begin
-        if (es_health_fail_i) begin
-          state_d = BAIL;
-        end else if (upstr_fifo_vld_i) begin
-          es_load_byte0_o = 1'b1;
-          state_d = BYTE1;
-        end else begin
-          state_d = BYTE0;
-        end
-      end
-      BYTE1: begin
-        if (es_health_fail_i) begin
-          state_d = BAIL;
-        end else if (upstr_fifo_vld_i) begin
-          es_load_byte1_o = 1'b1;
-          state_d = BYTE2;
-        end else begin
-          state_d = BYTE1;
-        end
-      end
-      BYTE2: begin
-        if (es_health_fail_i) begin
-          state_d = BAIL;
-        end else if (upstr_fifo_vld_i) begin
-          es_load_byte2_o = 1'b1;
-          state_d = BYTE3;
-        end else begin
-          state_d = BYTE2;
-        end
-      end
-      BYTE3: begin
-        if (es_health_fail_i) begin
-          state_d = BAIL;
-        end else if (upstr_fifo_vld_i) begin
-          es_load_byte3_o = 1'b1;
-          state_d = PUSH;
-        end else begin
-          state_d = BYTE3;
-        end
-      end
-      PUSH: begin
-        if (es_health_fail_i) begin
-          state_d = BAIL;
-        end else if (dwstr_fifo_not_full_i) begin
-          dwstr_fifo_push_o = 1'b1;
-          state_d = FCHK;
-        end else begin
-          state_d = PUSH;
-        end
-      end
-      FCHK: begin
-        if (!dwstr_fifo_not_full_i) begin
-          state_d = SWAP;
-        end else begin
-          state_d = IDLE;
-        end
-      end
-      SWAP: begin
-        if (other_dwstr_fifo_empty_i) begin
-          dwstr_fifo_swap_o = 1'b1;
-          state_d = IDLE;
-        end else begin
-          state_d = SWAP;
-        end
-      end
-      BAIL: begin
-        dwstr_fifo_clr_o = 1'b1;
-        state_d = IDLE;
-      end
-      default: state_d = IDLE;
-    endcase
-  end
-
-endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_bucket_ht.sv b/hw/ip/entropy_src/rtl/entropy_src_bucket_ht.sv
new file mode 100755
index 0000000..bb29249
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_bucket_ht.sv
@@ -0,0 +1,100 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src bucket health test module
+//
+
+module entropy_src_bucket_ht #(
+  parameter int unsigned RegWidth = 16,
+  parameter int unsigned RngBusWidth = 4
+) (
+  input                  clk_i,
+  input                  rst_ni,
+
+   // ins req interface
+  input logic [RngBusWidth-1:0] entropy_bit_i,
+  input logic                   entropy_bit_vld_i,
+  input logic                   clear_i,
+  input logic                   active_i,
+  input logic [RegWidth-1:0]    thresh_i,
+  input logic [RegWidth-1:0]    window_i,
+  output logic [RegWidth-1:0]   test_cnt_o,
+  output logic                  test_done_pulse_o,
+  output logic                  test_fail_pulse_o
+);
+
+  localparam int NUM_BINS = 2**RngBusWidth;
+
+  // signals
+  logic        window_cntr_wrap;
+  logic [NUM_BINS-1:0] bin_incr;
+  logic [NUM_BINS-1:0] bin_cnt_exceeds_thresh;
+
+  // flops
+  logic [RegWidth-1:0] window_cntr_q, window_cntr_d;
+  logic [RegWidth-1:0] test_cnt_q, test_cnt_d;
+  logic [RegWidth-1:0] bin_cntr_q[NUM_BINS], bin_cntr_d[NUM_BINS];
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      window_cntr_q    <= '0;
+      test_cnt_q       <= '0;
+      bin_cntr_q       <= {10'b0,10'b0,10'b0,10'b0,10'b0,10'b0,10'b0,10'b0,
+                           10'b0,10'b0,10'b0,10'b0,10'b0,10'b0,10'b0,10'b0};
+    end else begin
+      window_cntr_q    <= window_cntr_d;
+      test_cnt_q       <= test_cnt_d;
+      bin_cntr_q       <= bin_cntr_d;
+    end
+
+
+  // Bucket Test
+  //
+  // Test operation
+  //  This test will look at 4 bit symbols and increment one of sixteen
+  //  counters, or buckets, to show a histogram of the data stream.
+  //  An error will occur if one of the counters reaches the thresh
+  //  value.
+
+
+  // Analyze the incoming symbols
+
+  genvar i;
+  generate
+    for (i = 0; i < NUM_BINS; i = i + 1) begin  : g_symbol_match
+      // set the bin incrementer if the symbol matches that bin
+      assign bin_incr[i] = entropy_bit_vld_i && (entropy_bit_i == i);
+      // use the bin incrementer to increase the bin total count
+      assign bin_cntr_d[i] = window_cntr_wrap ? '0 :
+             ((active_i && bin_incr[i]) ? (bin_cntr_q[i]+1) : bin_cntr_q[i]);
+      // use the bin incrementer to increase the bin total count
+      assign bin_cnt_exceeds_thresh[i] = (bin_cntr_q[i] > thresh_i);
+    end
+  endgenerate
+
+
+  // Window wrap condition
+  assign window_cntr_wrap = (window_cntr_q == window_i);
+
+  // Window counter
+  assign window_cntr_d =
+         clear_i ? '0 :
+         window_cntr_wrap ? '0  :
+         entropy_bit_vld_i ? (window_cntr_q+1) :
+         window_cntr_q;
+
+  // Test event counter
+  assign test_cnt_d =
+         (!active_i || clear_i) ? '0 :
+         window_cntr_wrap ? '0 :
+         entropy_bit_vld_i && (|bin_cnt_exceeds_thresh) ? (test_cnt_q+1) :
+         test_cnt_q;
+
+  // the pulses will be only one clock in length
+  assign test_fail_pulse_o = active_i && window_cntr_wrap && (test_cnt_q > '0);
+  assign test_done_pulse_o = window_cntr_wrap;
+  assign test_cnt_o = test_cnt_q;
+
+
+endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_cntr_reg.sv b/hw/ip/entropy_src/rtl/entropy_src_cntr_reg.sv
new file mode 100755
index 0000000..4846829
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_cntr_reg.sv
@@ -0,0 +1,40 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src counter register module
+//
+
+module entropy_src_cntr_reg #(
+  parameter int unsigned RegWidth = 16
+) (
+  input logic                   clk_i,
+  input logic                   rst_ni,
+
+   // functional interface
+  input logic                   clear_i,
+  input logic                   active_i,
+  input logic                   event_i,
+  output logic [RegWidth-1:0]   value_o
+);
+
+  // signals
+
+  // flops
+  logic [RegWidth-1:0] event_cntr_q, event_cntr_d;
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      event_cntr_q       <= '0;
+    end else begin
+      event_cntr_q       <= event_cntr_d;
+    end
+
+  // counter will not wrap when full value is reached
+  assign event_cntr_d = (!active_i || clear_i) ? '0 :
+                        (event_i && (~event_cntr_q != '0)) ? event_cntr_q+1 :
+                        event_cntr_q;
+
+  assign  value_o = event_cntr_q;
+
+endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_core.sv b/hw/ip/entropy_src/rtl/entropy_src_core.sv
index 8c8d601..c144bca 100755
--- a/hw/ip/entropy_src/rtl/entropy_src_core.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_core.sv
@@ -6,7 +6,7 @@
 //
 
 module entropy_src_core import entropy_src_pkg::*; #(
-  parameter int unsigned EsFifoDepth = 16
+  parameter int unsigned EsFifoDepth = 2
 ) (
   input                  clk_i,
   input                  rst_ni,
@@ -26,124 +26,213 @@
   output entropy_src_rng_req_t entropy_src_rng_o,
   input  entropy_src_rng_rsp_t entropy_src_rng_i,
 
+  output logic           alert_event_o,
+
   output logic           es_entropy_valid_o,
-  output logic           es_rct_failed_o,
-  output logic           es_apt_failed_o,
+  output logic           es_health_test_failed_o,
   output logic           es_fifo_err_o
 );
 
   import entropy_src_reg_pkg::*;
 
-  localparam int unsigned PostHTDepth = $clog2(EsFifoDepth);
+  localparam int unsigned Clog2EsFifoDepth = $clog2(EsFifoDepth);
+  localparam int unsigned PostHTWidth = 64;
   localparam int unsigned RngBusWidth = 4;
+  localparam int unsigned HalfRegWidth = 16;
+  localparam int unsigned FullRegWidth = 32;
+  localparam int unsigned EigthRegWidth = 4;
+  localparam int unsigned SeedLen = 384;
 
   // signals
   logic [RngBusWidth-1:0] lfsr_value;
   logic [RngBusWidth-1:0] seed_value;
   logic       load_seed;
   logic       es_enable;
-  logic       es_enable_dig;
+  logic       es_enable_lfsr;
   logic       es_enable_rng;
   logic       rng_bit_en;
   logic [1:0] rng_bit_sel;
-  logic       lfsr_enable;
-  logic       esentropy_rd_pls;
+  logic       lfsr_incr;
+  logic       sw_es_rd_pulse;
   logic       event_es_entropy_valid;
-  logic       event_es_apt_failed;
-  logic       event_es_rct_failed;
-//  logic       event_es_rng_bits_err;
+  logic       event_es_health_test_failed;
   logic       event_es_fifo_err;
   logic [15:0] es_rate;
-  logic        es_rate_entropy_valid;
-  logic        es_rate_entropy_valid_en;
-  logic [2:0]  es_fifo_thresh;
-  logic       es_rng_src_ok;
+  logic        es_rate_entropy_pulse;
+  logic        es_rng_src_ok;
+  logic [RngBusWidth-1:0] es_rng_bus;
 
-  logic        sfifo_esdig_push;
-  logic        sfifo_esdig_pop;
-  logic        sfifo_esdig_clr;
-  logic [RngBusWidth-1:0] sfifo_esdig_wdata;
-  logic [RngBusWidth-1:0] sfifo_esdig_rdata;
-  logic [2:0]  sfifo_esdig_depth;
-  logic        sfifo_esdig_not_full;
-  logic        sfifo_esdig_not_empty;
-  logic        sfifo_esdig_err;
+  logic [RngBusWidth-1:0] sfifo_esrng_wdata;
+  logic [RngBusWidth-1:0] sfifo_esrng_rdata;
+  logic                   sfifo_esrng_push;
+  logic                   sfifo_esrng_pop;
+  logic                   sfifo_esrng_clr;
+  logic                   sfifo_esrng_not_empty;
+  logic                   sfifo_esrng_err;
 
-  logic        sfifo_postht_push;
-  logic        sfifo_postht_pop;
-  logic        sfifo_postht_clr;
-  logic [31:0] sfifo_postht_wdata;
-  logic [31:0] sfifo_postht_rdata;
-  logic [PostHTDepth:0] sfifo_postht_depth;
-  logic        sfifo_postht_not_full;
-  logic        sfifo_postht_not_empty;
-  logic        sfifo_postht_err;
-  logic        sfifo_postht_avail;
+  logic [Clog2EsFifoDepth:0] sfifo_esfinal_depth;
+  logic [(1+SeedLen)-1:0] sfifo_esfinal_wdata;
+  logic [(1+SeedLen)-1:0] sfifo_esfinal_rdata;
+  logic                   sfifo_esfinal_push;
+  logic                   sfifo_esfinal_pop;
+  logic                   sfifo_esfinal_clr;
+  logic                   sfifo_esfinal_not_full;
+  logic                   sfifo_esfinal_not_empty;
+  logic                   sfifo_esfinal_err;
+  logic [SeedLen-1:0]     esfinal_data;
+  logic                   esfinal_fips_flag;
 
-  logic        sfifo_essw_push;
-  logic        sfifo_essw_pop;
-  logic        sfifo_essw_clr;
-  logic [31:0] sfifo_essw_wdata;
-  logic [31:0] sfifo_essw_rdata;
-  logic [2:0 ] sfifo_essw_depth;
-  logic        sfifo_essw_not_full;
-  logic        sfifo_essw_not_empty;
-  logic        sfifo_essw_err;
+  logic                   any_active;
+  logic                   any_fail_pulse;
+  logic                   main_stage_pop;
+  logic                   bypass_stage_pop;
+  logic [EigthRegWidth-1:0] any_fail_count;
+  logic [EigthRegWidth-1:0] alert_threshold;
+  logic                     alert_event;
+  logic                     repcnt_active;
+  logic                     adaptp_active;
+  logic                     bucket_active;
+  logic                     markov_active;
+  logic                     alert_cntrs_clr;
+  logic                     health_test_clr;
+  logic                     health_test_done_pulse;
+  logic [RngBusWidth-1:0]   health_test_esbus;
+  logic                     health_test_esbus_vld;
+  logic                     es_route_to_sw;
+  logic                     es_bypass_to_sw;
+  logic                     es_bypass_mode;
+  logic                     rst_bypass_mode;
+  logic                     rst_alert_cntr;
+  logic                     boot_bypass_disable;
+  logic                     fips_compliance;
 
-  logic        sfifo_eshw_push;
-  logic        sfifo_eshw_pop;
-  logic        sfifo_eshw_clr;
-  logic [31:0] sfifo_eshw_wdata;
-  logic [31:0] sfifo_eshw_rdata;
-  logic [2:0]  sfifo_eshw_depth;
-  logic        sfifo_eshw_not_full;
-  logic        sfifo_eshw_not_empty;
-  logic        sfifo_eshw_err;
+  logic [HalfRegWidth-1:0] health_test_fips_window;
+  logic [HalfRegWidth-1:0] health_test_bypass_window;
+  logic [HalfRegWidth-1:0] health_test_window;
+  logic [HalfRegWidth-1:0] repcnt_fips_threshold;
+  logic [HalfRegWidth-1:0] repcnt_bypass_threshold;
+  logic [HalfRegWidth-1:0] repcnt_threshold;
+  logic [HalfRegWidth-1:0] repcnt_event_cnt;
+  logic [HalfRegWidth-1:0] repcnt_event_hwm_fips;
+  logic [HalfRegWidth-1:0] repcnt_event_hwm_bypass;
+  logic [FullRegWidth-1:0] repcnt_total_fails;
+  logic [EigthRegWidth-1:0] repcnt_fail_count;
+  logic                     repcnt_fail_pulse;
 
-//  logic [RngBusWidth-1:0] rng_bits_err;
-  logic [RngBusWidth-1:0] rct_active;
-  logic [15:0] rct_max_cnt;
-  logic [RngBusWidth-1:0] apt_active;
-  logic [15:0] apt_max_cnt;
-  logic [15:0] apt_window;
-  logic [RngBusWidth-1:0] apt_fail_pls;
-  logic [RngBusWidth-1:0] rct_fail_pls;
-  logic [RngBusWidth-1:0] shtests_passing;
-  logic [RngBusWidth-1:0] packer_esbus_wdata;
-  logic [31:0] packer_esbus_rdata;
-  logic        packer_esbus_push;
-  logic        packer_esbus_clr;
-  logic        packer_esbus_valid;
-  logic        packer_esbit_wdata;
-  logic [31:0] packer_esbit_rdata;
-  logic        packer_esbit_push;
-  logic        packer_esbit_clr;
-  logic        packer_esbit_valid;
-  logic        packer_valid;
-  logic        fill_sfifo_essw;
+  logic [HalfRegWidth-1:0] adaptp_hi_fips_threshold;
+  logic [HalfRegWidth-1:0] adaptp_hi_bypass_threshold;
+  logic [HalfRegWidth-1:0] adaptp_hi_threshold;
+  logic [HalfRegWidth-1:0] adaptp_lo_fips_threshold;
+  logic [HalfRegWidth-1:0] adaptp_lo_bypass_threshold;
+  logic [HalfRegWidth-1:0] adaptp_lo_threshold;
+  logic [HalfRegWidth-1:0] adaptp_event_cnt;
+  logic [HalfRegWidth-1:0] adaptp_hi_event_hwm_fips;
+  logic [HalfRegWidth-1:0] adaptp_hi_event_hwm_bypass;
+  logic [HalfRegWidth-1:0] adaptp_lo_event_hwm_fips;
+  logic [HalfRegWidth-1:0] adaptp_lo_event_hwm_bypass;
+  logic [FullRegWidth-1:0] adaptp_hi_total_fails;
+  logic [FullRegWidth-1:0] adaptp_lo_total_fails;
+  logic [EigthRegWidth-1:0] adaptp_hi_fail_count;
+  logic [EigthRegWidth-1:0] adaptp_lo_fail_count;
+  logic                     adaptp_hi_fail_pulse;
+  logic                     adaptp_lo_fail_pulse;
+
+  logic [HalfRegWidth-1:0] bucket_fips_threshold;
+  logic [HalfRegWidth-1:0] bucket_bypass_threshold;
+  logic [HalfRegWidth-1:0] bucket_threshold;
+  logic [HalfRegWidth-1:0] bucket_event_cnt;
+  logic [HalfRegWidth-1:0] bucket_event_hwm_fips;
+  logic [HalfRegWidth-1:0] bucket_event_hwm_bypass;
+  logic [FullRegWidth-1:0] bucket_total_fails;
+  logic [EigthRegWidth-1:0] bucket_fail_count;
+  logic                     bucket_fail_pulse;
+
+  logic [HalfRegWidth-1:0] markov_fips_threshold;
+  logic [HalfRegWidth-1:0] markov_bypass_threshold;
+  logic [HalfRegWidth-1:0] markov_threshold;
+  logic [HalfRegWidth-1:0] markov_event_cnt;
+  logic [HalfRegWidth-1:0] markov_event_hwm_fips;
+  logic [HalfRegWidth-1:0] markov_event_hwm_bypass;
+  logic [FullRegWidth-1:0] markov_total_fails;
+  logic [EigthRegWidth-1:0] markov_fail_count;
+  logic                     markov_fail_pulse;
+
+  logic                     pfifo_esbit_wdata;
+  logic [RngBusWidth-1:0]   pfifo_esbit_rdata;
+  logic                     pfifo_esbit_not_empty;
+  logic                     pfifo_esbit_push;
+  logic                     pfifo_esbit_clr;
+  logic                     pfifo_esbit_pop;
+
+  logic [RngBusWidth-1:0]   pfifo_postht_wdata;
+  logic [PostHTWidth-1:0]   pfifo_postht_rdata;
+  logic                     pfifo_postht_not_empty;
+  logic                     pfifo_postht_push;
+  logic                     pfifo_postht_clr;
+  logic                     pfifo_postht_pop;
+
+  logic [PostHTWidth-1:0]   pfifo_cond_wdata;
+  logic [SeedLen-1:0]       pfifo_cond_rdata;
+  logic                     pfifo_cond_not_empty;
+  logic                     pfifo_cond_push;
+  logic                     pfifo_cond_clr;
+  logic                     pfifo_cond_pop;
+
+  logic [PostHTWidth-1:0]   pfifo_bypass_wdata;
+  logic [SeedLen-1:0]       pfifo_bypass_rdata;
+  logic                     pfifo_bypass_not_empty;
+  logic                     pfifo_bypass_push;
+  logic                     pfifo_bypass_clr;
+  logic                     pfifo_bypass_pop;
+
+  logic [SeedLen-1:0]       pfifo_swread_wdata;
+  logic                     pfifo_swread_not_full;
+  logic [FullRegWidth-1:0]  pfifo_swread_rdata;
+  logic                     pfifo_swread_not_empty;
+  logic                     pfifo_swread_push;
+  logic                     pfifo_swread_clr;
+  logic                     pfifo_swread_pop;
+
+  logic [SeedLen-1:0]       final_es_data;
+
 
   // flops
-  logic        entropy_val_q, entropy_val_d;
   logic [15:0] es_rate_cntr_q, es_rate_cntr_d;
-//  logic        rng_bits_err_q, rng_bits_err_d;
+  logic        lfsr_incr_dly_q, lfsr_incr_dly_d;
+  logic [RngBusWidth-1:0] ht_esbus_dly_q, ht_esbus_dly_d;
+  logic        ht_esbus_vld_dly_q, ht_esbus_vld_dly_d;
+  logic        ht_esbus_vld_dly2_q, ht_esbus_vld_dly2_d;
+  logic        boot_bypass_q, boot_bypass_d;
+  logic        ht_failed_q, ht_failed_d;
 
   always_ff @(posedge clk_i or negedge rst_ni)
     if (!rst_ni) begin
-      entropy_val_q         <= '0;
       es_rate_cntr_q        <= 16'h0001;
-//      rng_bits_err_q        <= '0;
+      lfsr_incr_dly_q       <= '0;
+      boot_bypass_q         <= 1'b1;
+      ht_failed_q           <= '0;
+      ht_esbus_dly_q        <= '0;
+      ht_esbus_vld_dly_q    <= '0;
+      ht_esbus_vld_dly2_q   <= '0;
     end else begin
-      entropy_val_q         <= entropy_val_d;
       es_rate_cntr_q        <= es_rate_cntr_d;
-//      rng_bits_err_q        <= rng_bits_err_d;
+      lfsr_incr_dly_q       <= lfsr_incr_dly_d;
+      boot_bypass_q         <= boot_bypass_d;
+      ht_failed_q           <= ht_failed_d;
+      ht_esbus_dly_q        <= ht_esbus_dly_d;
+      ht_esbus_vld_dly_q    <= ht_esbus_vld_dly_d;
+      ht_esbus_vld_dly2_q   <= ht_esbus_vld_dly2_d;
     end
 
-  assign es_enable = (|reg2hw.es_conf.enable.q);
-  assign es_enable_dig = reg2hw.es_conf.enable.q[0];
-  assign es_enable_rng = reg2hw.es_conf.enable.q[1];
-  assign load_seed = ~es_enable;
+  assign es_enable = (|reg2hw.conf.enable.q);
+  assign es_enable_lfsr = reg2hw.conf.enable.q[1];
+  assign es_enable_rng = reg2hw.conf.enable.q[0];
+  assign load_seed = !es_enable;
 
-  assign entropy_src_rng_o.rng_enable = reg2hw.es_conf.rng_src_en.q;
+  assign entropy_src_rng_o.rng_enable = es_enable_rng;
+
+  assign es_rng_src_ok = entropy_src_rng_i.rng_ok;
+  assign es_rng_bus = entropy_src_rng_i.rng_b;
 
 
   //--------------------------------------------
@@ -151,8 +240,8 @@
   //--------------------------------------------
 
   prim_intr_hw #(.Width(1)) intr_hw_es_entropy_valid (
-    .clk_i,
-    .rst_ni,
+    .clk_i                  (clk_i),
+    .rst_ni                 (rst_ni),
     .event_intr_i           (event_es_entropy_valid),
     .reg2hw_intr_enable_q_i (reg2hw.intr_enable.es_entropy_valid.q),
     .reg2hw_intr_test_q_i   (reg2hw.intr_test.es_entropy_valid.q),
@@ -163,36 +252,22 @@
     .intr_o                 (es_entropy_valid_o)
   );
 
-  prim_intr_hw #(.Width(1)) intr_hw_es_rct_failed (
-    .clk_i,
-    .rst_ni,
-    .event_intr_i           (event_es_rct_failed),
-    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.es_rct_failed.q),
-    .reg2hw_intr_test_q_i   (reg2hw.intr_test.es_rct_failed.q),
-    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.es_rct_failed.qe),
-    .reg2hw_intr_state_q_i  (reg2hw.intr_state.es_rct_failed.q),
-    .hw2reg_intr_state_de_o (hw2reg.intr_state.es_rct_failed.de),
-    .hw2reg_intr_state_d_o  (hw2reg.intr_state.es_rct_failed.d),
-    .intr_o                 (es_rct_failed_o)
+  prim_intr_hw #(.Width(1)) intr_hw_es_health_test_failed (
+    .clk_i                  (clk_i),
+    .rst_ni                 (rst_ni),
+    .event_intr_i           (event_es_health_test_failed),
+    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.es_health_test_failed.q),
+    .reg2hw_intr_test_q_i   (reg2hw.intr_test.es_health_test_failed.q),
+    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.es_health_test_failed.qe),
+    .reg2hw_intr_state_q_i  (reg2hw.intr_state.es_health_test_failed.q),
+    .hw2reg_intr_state_de_o (hw2reg.intr_state.es_health_test_failed.de),
+    .hw2reg_intr_state_d_o  (hw2reg.intr_state.es_health_test_failed.d),
+    .intr_o                 (es_health_test_failed_o)
   );
 
-  prim_intr_hw #(.Width(1)) intr_hw_es_apt_failed (
-    .clk_i,
-    .rst_ni,
-    .event_intr_i           (event_es_apt_failed),
-    .reg2hw_intr_enable_q_i (reg2hw.intr_enable.es_apt_failed.q),
-    .reg2hw_intr_test_q_i   (reg2hw.intr_test.es_apt_failed.q),
-    .reg2hw_intr_test_qe_i  (reg2hw.intr_test.es_apt_failed.qe),
-    .reg2hw_intr_state_q_i  (reg2hw.intr_state.es_apt_failed.q),
-    .hw2reg_intr_state_de_o (hw2reg.intr_state.es_apt_failed.de),
-    .hw2reg_intr_state_d_o  (hw2reg.intr_state.es_apt_failed.d),
-    .intr_o                 (es_apt_failed_o)
-  );
-
-
   prim_intr_hw #(.Width(1)) intr_hw_es_fifo_err (
-    .clk_i,
-    .rst_ni,
+    .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),
@@ -207,7 +282,8 @@
   // lfsr - a version of a entropy source
   //--------------------------------------------
 
-  assign lfsr_enable = es_enable_dig && es_rate_entropy_valid;
+  assign lfsr_incr = es_enable_lfsr && es_rate_entropy_pulse;
+  assign lfsr_incr_dly_d = lfsr_incr;
 
   prim_lfsr #(.LfsrDw(RngBusWidth),
               .EntropyDw(RngBusWidth),
@@ -219,7 +295,7 @@
     .rst_ni         (rst_ni),
     .seed_en_i      (load_seed),
     .seed_i         (seed_value),
-    .lfsr_en_i      (lfsr_enable),
+    .lfsr_en_i      (lfsr_incr_dly_q),
     .entropy_i      ('0),
     .state_o        (lfsr_value)
   );
@@ -227,295 +303,713 @@
   // entropy rate limiter
 
   assign es_rate_cntr_d =
-         ~es_rate_entropy_valid_en ? 16'h0001 :
+         !es_enable ? 16'h0001 :
          (es_rate == '0) ? 16'h0000 :
-         es_rate_entropy_valid ? es_rate :
+         es_rate_entropy_pulse ? es_rate :
          (es_rate_cntr_q - 1);
 
-  assign es_rate_entropy_valid =
-         ~es_rate_entropy_valid_en ? 1'b0 :
+  assign es_rate_entropy_pulse =
+         !es_enable ? 1'b0 :
          (es_rate == '0) ? 1'b0 :
          (es_rate_cntr_q == 16'h0001);
 
-  assign es_rate_entropy_valid_en = (es_enable_rng & es_rng_src_ok) | es_enable_dig;
-
   //--------------------------------------------
   // tlul register settings
   //--------------------------------------------
 
 
   // seed register
-  assign seed_value = reg2hw.es_seed.q;
+  assign seed_value = reg2hw.seed.q;
 
   // es rate register
-  assign es_rate = reg2hw.es_rate.q;
+  assign es_rate = reg2hw.rate.q;
 
   // set the interrupt event when enabled
-  assign event_es_entropy_valid = entropy_val_q;
+  assign event_es_entropy_valid = pfifo_swread_not_empty;
 
   // set the interrupt sources
-  assign event_es_fifo_err =
-         sfifo_esdig_err |
-         sfifo_postht_err |
-         sfifo_essw_err |
-         sfifo_eshw_err;
+  assign event_es_fifo_err = sfifo_esrng_err || sfifo_esfinal_err;
 
   // set the debug status reg
-  assign hw2reg.es_fifo_status.dig_src_depth.d = sfifo_esdig_depth;
-  assign hw2reg.es_fifo_status.hwif_depth.d = sfifo_eshw_depth;
-  assign hw2reg.es_fifo_status.es_depth.d = sfifo_postht_depth;
-
+  assign hw2reg.debug_status.entropy_fifo_depth.d = sfifo_esfinal_depth;
 
   //--------------------------------------------
-  // basic checks for RNG bus input
+  // receive in RNG bus input
   //--------------------------------------------
 
-  assign rng_bit_en = reg2hw.es_conf.rng_bit_en.q;
-  assign rng_bit_sel = reg2hw.es_conf.rng_bit_sel.q;
 
-
-  assign es_rng_src_ok = entropy_src_rng_i.rng_ok;
-
-
-  prim_fifo_sync # (.Width(RngBusWidth),.Pass(0),.Depth(4))
-    u_prim_fifo_sync_esdig (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .clr_i          (sfifo_esdig_clr),
-    .wvalid_i       (sfifo_esdig_push),
-    .wready_o       (sfifo_esdig_not_full),
-    .wdata_i        (sfifo_esdig_wdata),
-    .rvalid_o       (sfifo_esdig_not_empty),
-    .rready_i       (sfifo_esdig_pop),
-    .rdata_o        (sfifo_esdig_rdata),
-    .depth_o        (sfifo_esdig_depth)
+  prim_fifo_sync # (.Width(RngBusWidth),.Pass(0),.Depth(2))
+   u_prim_fifo_sync_esrng (
+    .clk_i      (clk_i),
+    .rst_ni     (rst_ni),
+    .clr_i      (sfifo_esrng_clr),
+    .wvalid_i   (sfifo_esrng_push),
+    .wdata_i    (sfifo_esrng_wdata),
+    .wready_o   (),
+    .rvalid_o   (sfifo_esrng_not_empty),
+    .rdata_o    (sfifo_esrng_rdata),
+    .rready_i   (sfifo_esrng_pop),
+    .depth_o    ()
   );
 
   // fifo controls
-  assign sfifo_esdig_push = es_enable & es_rate_entropy_valid & sfifo_esdig_not_full;
-  assign sfifo_esdig_clr  = ~es_enable;
-  assign sfifo_esdig_wdata = es_enable_dig ? lfsr_value : entropy_src_rng_i.rng_b;
-  assign sfifo_esdig_pop = es_enable & sfifo_esdig_not_empty & sfifo_postht_avail;
+  assign sfifo_esrng_push = es_enable_rng && es_rng_src_ok && es_rate_entropy_pulse;
+  assign sfifo_esrng_clr  = !es_enable;
+  assign sfifo_esrng_wdata = es_rng_bus;
+  assign sfifo_esrng_pop = es_enable && es_rate_entropy_pulse && sfifo_esrng_not_empty;
 
-  // note: allow input lfsr entropy to drop
+  // note: allow input rng raw entropy to drop
 
   // fifo err
-  assign sfifo_esdig_err =
-         (sfifo_esdig_pop & ~sfifo_esdig_not_empty );
+  assign sfifo_esrng_err =
+         (sfifo_esrng_pop && !sfifo_esrng_not_empty );
 
-  // pack esbus before moving to a 32 bit bus
 
-  prim_packer # (.InW(RngBusWidth),.OutW(32))
-    u_prim_packer_esbus (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .valid_i        (packer_esbus_push),
-    .data_i         (packer_esbus_wdata),
-    .mask_i         ({RngBusWidth{1'b1}}),
-    .ready_o        (),
-    .valid_o        (packer_esbus_valid),
-    .data_o         (packer_esbus_rdata),
-    .mask_o         (),
-    .ready_i        (1'b1),
-    .flush_i        (packer_esbus_clr),
-    .flush_done_o   ()
+  // pack esrng bus into signal bit packer
+
+  assign rng_bit_en = reg2hw.conf.rng_bit_en.q;
+  assign rng_bit_sel = reg2hw.conf.rng_bit_sel.q;
+
+  prim_packer_fifo # (.InW(1),.OutW(RngBusWidth))
+    u_prim_packer_fifo_esbit (
+    .clk_i      (clk_i),
+    .rst_ni     (rst_ni),
+    .clr_i      (pfifo_esbit_clr),
+    .wvalid_i   (pfifo_esbit_push),
+    .wdata_i    (pfifo_esbit_wdata),
+    .wready_o   (),
+    .rvalid_o   (pfifo_esbit_not_empty),
+    .rdata_o    (pfifo_esbit_rdata),
+    .rready_i   (pfifo_esbit_pop),
+    .depth_o    ()
   );
 
-  assign packer_esbus_push = ~rng_bit_en & sfifo_esdig_pop;
-  assign packer_esbus_wdata = sfifo_esdig_rdata;
-  assign packer_esbus_clr = ~es_enable;
-
-  // pack esbit before moving to a 32 bit bus
-
-  prim_packer # (.InW(1),.OutW(32))
-    u_prim_packer_esbit (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .valid_i        (packer_esbit_push),
-    .data_i         (packer_esbit_wdata),
-    .mask_i         (1'b1),
-    .ready_o        (),
-    .valid_o        (packer_esbit_valid),
-    .data_o         (packer_esbit_rdata),
-    .mask_o         (),
-    .ready_i        (1'b1),
-    .flush_i        (packer_esbit_clr),
-    .flush_done_o   ()
-  );
-
-  assign packer_esbit_push = rng_bit_en & sfifo_esdig_pop;
-  assign packer_esbit_clr = ~es_enable;
-  assign packer_esbit_wdata =
-         (rng_bit_sel == 2'h0) ? sfifo_esdig_rdata[0] :
-         (rng_bit_sel == 2'h1) ? sfifo_esdig_rdata[1] :
-         (rng_bit_sel == 2'h2) ? sfifo_esdig_rdata[2] :
-         sfifo_esdig_rdata[3];
+  assign pfifo_esbit_push = rng_bit_en && sfifo_esrng_pop && es_rate_entropy_pulse;
+  assign pfifo_esbit_clr = !es_enable;
+  assign pfifo_esbit_pop = es_rate_entropy_pulse && pfifo_esbit_not_empty;
+  assign pfifo_esbit_wdata =
+         (rng_bit_sel == 2'h0) ? sfifo_esrng_rdata[0] :
+         (rng_bit_sel == 2'h1) ? sfifo_esrng_rdata[1] :
+         (rng_bit_sel == 2'h2) ? sfifo_esrng_rdata[2] :
+         sfifo_esrng_rdata[3];
 
 
-  // combine packers
-  assign packer_valid = packer_esbus_valid | packer_esbit_valid;
+  // select source for health testing
 
+  assign health_test_esbus = es_enable_lfsr ? lfsr_value :
+         (es_enable_rng && rng_bit_en) ? pfifo_esbit_rdata :
+         sfifo_esrng_rdata;
 
-  prim_fifo_sync # (.Width(32),.Pass(0),.Depth(EsFifoDepth))
-    u_prim_fifo_sync_postht (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .clr_i          (sfifo_postht_clr),
-    .wvalid_i       (sfifo_postht_push),
-    .wready_o       (sfifo_postht_not_full),
-    .wdata_i        (sfifo_postht_wdata),
-    .rvalid_o       (sfifo_postht_not_empty),
-    .rready_i       (sfifo_postht_pop),
-    .rdata_o        (sfifo_postht_rdata),
-    .depth_o        (sfifo_postht_depth)
-  );
+  assign health_test_esbus_vld = es_enable_lfsr ? es_rate_entropy_pulse :
+         (es_enable_rng && rng_bit_en) ? pfifo_esbit_pop :
+         sfifo_esrng_pop;
 
-  // fifo controls
-  assign sfifo_postht_push = es_enable & packer_valid & (&shtests_passing);
-  assign sfifo_postht_clr  = ~es_enable;
-  assign sfifo_postht_wdata = rng_bit_en ? packer_esbit_rdata : packer_esbus_rdata;
-  assign sfifo_postht_pop = es_enable & sfifo_postht_not_empty &
-         (fill_sfifo_essw | sfifo_eshw_not_full);
+  assign ht_esbus_vld_dly_d = health_test_esbus_vld;
+  assign ht_esbus_dly_d     = health_test_esbus;
+  assign ht_esbus_vld_dly2_d = ht_esbus_vld_dly_q;
 
-  // allow one extra location because of packer
-  assign sfifo_postht_avail = (sfifo_postht_depth < (EsFifoDepth-1));
+  assign repcnt_active = !reg2hw.conf.repcnt_disable.q;
+  assign adaptp_active = !reg2hw.conf.adaptp_disable.q;
+  assign bucket_active = !reg2hw.conf.bucket_disable.q;
+  assign markov_active = !reg2hw.conf.markov_disable.q;
 
-  // fifo err
-  assign sfifo_postht_err =
-         (sfifo_postht_push & ~sfifo_postht_not_full) |
-         (sfifo_postht_pop & ~sfifo_postht_not_empty );
+  assign health_test_clr = reg2hw.conf.health_test_clr.q;
+  assign health_test_fips_window = reg2hw.health_test_windows.fips_window.q;
+  assign health_test_bypass_window = reg2hw.health_test_windows.bypass_window.q;
 
+  assign repcnt_fips_threshold = reg2hw.repcnt_thresholds.fips_repcnt_thresh.q;
+  assign repcnt_bypass_threshold = reg2hw.repcnt_thresholds.bypass_repcnt_thresh.q;
+
+  assign adaptp_hi_fips_threshold = reg2hw.adaptp_hi_thresholds.fips_adaptp_hi_thresh.q;
+  assign adaptp_hi_bypass_threshold = reg2hw.adaptp_hi_thresholds.bypass_adaptp_hi_thresh.q;
+
+  assign adaptp_lo_fips_threshold = reg2hw.adaptp_lo_thresholds.fips_adaptp_lo_thresh.q;
+  assign adaptp_lo_bypass_threshold = reg2hw.adaptp_lo_thresholds.bypass_adaptp_lo_thresh.q;
+
+  assign bucket_fips_threshold = reg2hw.bucket_thresholds.fips_bucket_thresh.q;
+  assign bucket_bypass_threshold = reg2hw.bucket_thresholds.bypass_bucket_thresh.q;
+
+  assign markov_fips_threshold = reg2hw.markov_thresholds.fips_markov_thresh.q;
+  assign markov_bypass_threshold = reg2hw.markov_thresholds.bypass_markov_thresh.q;
+  assign health_test_window = es_bypass_mode ? health_test_bypass_window : health_test_fips_window;
+  assign repcnt_threshold = es_bypass_mode ? repcnt_bypass_threshold : repcnt_fips_threshold;
+  assign adaptp_hi_threshold = es_bypass_mode ? adaptp_hi_bypass_threshold :
+         adaptp_hi_fips_threshold;
+  assign adaptp_lo_threshold = es_bypass_mode ? adaptp_lo_bypass_threshold :
+         adaptp_lo_fips_threshold;
+  assign bucket_threshold = es_bypass_mode ? bucket_bypass_threshold : bucket_fips_threshold;
+  assign markov_threshold = es_bypass_mode ? markov_bypass_threshold : markov_fips_threshold;
+
+  assign event_es_health_test_failed = alert_event;
+
+  assign es_route_to_sw = reg2hw.entropy_control.es_route.q;
+  assign es_bypass_to_sw = reg2hw.entropy_control.es_type.q;
+  assign boot_bypass_disable = reg2hw.conf.boot_bypass_disable.q;
+
+  assign boot_bypass_d =
+         boot_bypass_disable ? 1'b0 :
+         rst_bypass_mode ? 1'b0 :
+         boot_bypass_q;
+
+  assign es_bypass_mode = boot_bypass_q || es_bypass_to_sw;
 
   //--------------------------------------------
-  // health tests
+  // repetitive count test
   //--------------------------------------------
 
-  genvar ta;
-  generate
-    for (ta = 0; ta < RngBusWidth; ta = ta+1) begin : gen_test_act
-      assign rct_active[ta] = rng_bit_en ? ((rng_bit_sel == ta) & reg2hw.es_conf.rct_en.q) :
-                              reg2hw.es_conf.rct_en.q;
-      assign apt_active[ta] = rng_bit_en ? ((rng_bit_sel == ta) & reg2hw.es_conf.apt_en.q) :
-             reg2hw.es_conf.apt_en.q;
-    end
-  endgenerate
-
-  assign rct_max_cnt = reg2hw.es_rct_health.q;
-
-  assign apt_max_cnt = reg2hw.es_apt_health.apt_max.q;
-  assign apt_window  = reg2hw.es_apt_health.apt_win.q;
-
-  genvar sh;
-  generate
-    for (sh = 0; sh < RngBusWidth; sh = sh+1) begin : gen_shtests
-      entropy_src_shtests
-        u_entropy_src_shtests (
+  entropy_src_repcnt_ht # (.RegWidth(HalfRegWidth),.RngBusWidth(RngBusWidth))
+    u_entropy_src_repcnt_ht
+      (
        .clk_i               (clk_i),
        .rst_ni              (rst_ni),
-       .entropy_bit_i       (sfifo_esdig_rdata[sh]),
-       .entropy_bit_vld_i   (sfifo_esdig_pop),
-       .rct_active_i        (rct_active[sh]),
-       .rct_max_cnt_i       (rct_max_cnt),
-       .apt_active_i        (apt_active[sh]),
-       .apt_max_cnt_i       (apt_max_cnt),
-       .apt_window_i        (apt_window),
-       .rct_fail_pls_o      (rct_fail_pls[sh]),
-       .apt_fail_pls_o      (apt_fail_pls[sh]),
-       .shtests_passing_o   (shtests_passing[sh])
-      );
-    end
-  endgenerate
+       .entropy_bit_i       (health_test_esbus),
+       .entropy_bit_vld_i   (health_test_esbus_vld),
+       .clear_i             (health_test_clr),
+       .active_i            (repcnt_active),
+       .thresh_i            (repcnt_threshold),
+       .window_i            (health_test_window),
+       .test_cnt_o          (repcnt_event_cnt),
+       .test_done_pulse_o   (health_test_done_pulse),
+       .test_fail_pulse_o   (repcnt_fail_pulse)
+       );
 
-  assign event_es_rct_failed = |rct_fail_pls;
-  assign event_es_apt_failed = |apt_fail_pls;
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_repcnt_fips
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (repcnt_active),
+       .event_i             (repcnt_fail_pulse && !es_bypass_mode),
+       .value_i             (repcnt_event_cnt),
+       .value_o             (repcnt_event_hwm_fips)
+       );
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_repcnt_bypass
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (repcnt_active),
+       .event_i             (repcnt_fail_pulse && es_bypass_mode),
+       .value_i             (repcnt_event_cnt),
+       .value_o             (repcnt_event_hwm_bypass)
+       );
+
+  entropy_src_cntr_reg # (.RegWidth(FullRegWidth))
+    u_entropy_src_cntr_reg_repcnt
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (repcnt_active),
+       .event_i             (repcnt_fail_pulse),
+       .value_o             (repcnt_total_fails)
+       );
+
+  assign hw2reg.repcnt_hi_watermarks.fips_repcnt_hi_watermark.d = repcnt_event_hwm_fips;
+  assign hw2reg.repcnt_hi_watermarks.bypass_repcnt_hi_watermark.d = repcnt_event_hwm_bypass;
+  assign hw2reg.repcnt_total_fails.d = repcnt_total_fails;
+
+  //--------------------------------------------
+  // adaptive proportion test
+  //--------------------------------------------
+
+  entropy_src_adaptp_ht # (.RegWidth(HalfRegWidth),.RngBusWidth(RngBusWidth))
+    u_entropy_src_adaptp_ht
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .entropy_bit_i       (health_test_esbus),
+       .entropy_bit_vld_i   (health_test_esbus_vld),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .thresh_hi_i         (adaptp_hi_threshold),
+       .thresh_lo_i         (adaptp_lo_threshold),
+       .window_i            (health_test_window),
+       .test_cnt_o          (adaptp_event_cnt),
+       .test_done_pulse_o   (), // NC
+       .test_fail_hi_pulse_o(adaptp_hi_fail_pulse),
+       .test_fail_lo_pulse_o(adaptp_lo_fail_pulse)
+       );
+
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_adaptp_hi_fips
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_hi_fail_pulse && !es_bypass_mode),
+       .value_i             (adaptp_event_cnt),
+       .value_o             (adaptp_hi_event_hwm_fips)
+       );
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_adaptp_hi_bypass
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_hi_fail_pulse && es_bypass_mode),
+       .value_i             (adaptp_event_cnt),
+       .value_o             (adaptp_hi_event_hwm_bypass)
+       );
+
+  entropy_src_cntr_reg # (.RegWidth(FullRegWidth))
+    u_entropy_src_cntr_reg_adaptp_hi
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_hi_fail_pulse),
+       .value_o             (adaptp_hi_total_fails)
+       );
+
+
+  assign hw2reg.adaptp_hi_watermarks.fips_adaptp_hi_watermark.d = adaptp_hi_event_hwm_fips;
+  assign hw2reg.adaptp_hi_watermarks.bypass_adaptp_hi_watermark.d = adaptp_hi_event_hwm_bypass;
+  assign hw2reg.adaptp_hi_total_fails.d = adaptp_hi_total_fails;
+
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(0))
+    u_entropy_src_watermark_reg_adaptp_lo_fips
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_lo_fail_pulse && !es_bypass_mode),
+       .value_i             (adaptp_event_cnt),
+       .value_o             (adaptp_lo_event_hwm_fips)
+       );
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(0))
+    u_entropy_src_watermark_reg_adaptp_lo_bypass
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_lo_fail_pulse && es_bypass_mode),
+       .value_i             (adaptp_event_cnt),
+       .value_o             (adaptp_lo_event_hwm_bypass)
+       );
+
+  entropy_src_cntr_reg # (.RegWidth(FullRegWidth))
+    u_entropy_src_cntr_reg_adaptp_lo
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_lo_fail_pulse),
+       .value_o             (adaptp_lo_total_fails)
+       );
+
+  assign hw2reg.adaptp_lo_watermarks.fips_adaptp_lo_watermark.d = adaptp_lo_event_hwm_fips;
+  assign hw2reg.adaptp_lo_watermarks.bypass_adaptp_lo_watermark.d = adaptp_lo_event_hwm_bypass;
+  assign hw2reg.adaptp_lo_total_fails.d = adaptp_lo_total_fails;
 
 
   //--------------------------------------------
-  // fifos for final distribution
+  // bucket test
   //--------------------------------------------
 
-  assign fill_sfifo_essw = es_enable & sfifo_essw_not_full & efuse_es_sw_reg_en_i;
+  entropy_src_bucket_ht # (.RegWidth(HalfRegWidth),.RngBusWidth(RngBusWidth))
+    u_entropy_src_bucket_ht
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .entropy_bit_i       (health_test_esbus),
+       .entropy_bit_vld_i   (health_test_esbus_vld),
+       .clear_i             (health_test_clr),
+       .active_i            (bucket_active),
+       .thresh_i            (bucket_threshold),
+       .window_i            (health_test_window),
+       .test_cnt_o          (bucket_event_cnt),
+       .test_done_pulse_o     (), // NC
+       .test_fail_pulse_o     (bucket_fail_pulse)
+       );
 
-  // this fifo feeds the sw register interface
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_bucket_fips
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (bucket_active),
+       .event_i             (bucket_fail_pulse && !es_bypass_mode),
+       .value_i             (bucket_event_cnt),
+       .value_o             (bucket_event_hwm_fips)
+       );
 
-  prim_fifo_sync # (.Width(32),.Pass(0),.Depth(4))
-    u_prim_fifo_sync_essw (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .clr_i          (sfifo_essw_clr),
-    .wvalid_i       (sfifo_essw_push),
-    .wready_o       (sfifo_essw_not_full),
-    .wdata_i        (sfifo_essw_wdata),
-    .rvalid_o       (sfifo_essw_not_empty),
-    .rready_i       (sfifo_essw_pop),
-    .rdata_o        (sfifo_essw_rdata),
-    .depth_o        (sfifo_essw_depth)
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_bucket_bypass
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (bucket_active),
+       .event_i             (bucket_fail_pulse && es_bypass_mode),
+       .value_i             (bucket_event_cnt),
+       .value_o             (bucket_event_hwm_bypass)
+       );
+
+  entropy_src_cntr_reg # (.RegWidth(FullRegWidth))
+    u_entropy_src_cntr_reg_bucket
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (bucket_active),
+       .event_i             (bucket_fail_pulse),
+       .value_o             (bucket_total_fails)
+       );
+
+  assign hw2reg.bucket_hi_watermarks.fips_bucket_hi_watermark.d = bucket_event_hwm_fips;
+  assign hw2reg.bucket_hi_watermarks.bypass_bucket_hi_watermark.d = bucket_event_hwm_bypass;
+  assign hw2reg.bucket_total_fails.d = bucket_total_fails;
+
+
+  //--------------------------------------------
+  // Markov test
+  //--------------------------------------------
+
+  entropy_src_markov_ht # (.RegWidth(HalfRegWidth),.RngBusWidth(RngBusWidth))
+    u_entropy_src_markov_ht
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .entropy_bit_i       (health_test_esbus),
+       .entropy_bit_vld_i   (health_test_esbus_vld),
+       .clear_i             (health_test_clr),
+       .active_i            (markov_active),
+       .thresh_i            (markov_threshold),
+       .window_i            (health_test_window),
+       .test_cnt_o          (markov_event_cnt),
+       .test_done_pulse_o   (),// NC
+       .test_fail_pulse_o   (markov_fail_pulse)
+       );
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_markov_fips
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (markov_active),
+       .event_i             (markov_fail_pulse && !es_bypass_mode),
+       .value_i             (markov_event_cnt),
+       .value_o             (markov_event_hwm_fips)
+       );
+
+  entropy_src_watermark_reg # (.RegWidth(HalfRegWidth),.HighWatermark(1))
+    u_entropy_src_watermark_reg_markov_bypass
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (markov_active),
+       .event_i             (markov_fail_pulse && es_bypass_mode),
+       .value_i             (markov_event_cnt),
+       .value_o             (markov_event_hwm_bypass)
+       );
+
+  entropy_src_cntr_reg # (.RegWidth(FullRegWidth))
+    u_entropy_src_cntr_reg_markov
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (health_test_clr),
+       .active_i            (markov_active),
+       .event_i             (markov_fail_pulse),
+       .value_o             (markov_total_fails)
+       );
+
+  assign hw2reg.markov_hi_watermarks.fips_markov_hi_watermark.d = markov_event_hwm_fips;
+  assign hw2reg.markov_hi_watermarks.bypass_markov_hi_watermark.d = markov_event_hwm_bypass;
+  assign hw2reg.markov_total_fails.d = markov_total_fails;
+
+  //--------------------------------------------
+  // summary and alert registers
+  //--------------------------------------------
+
+  assign alert_cntrs_clr = health_test_clr || rst_alert_cntr;
+
+  entropy_src_cntr_reg # (.RegWidth(EigthRegWidth))
+    u_entropy_src_cntr_reg_any_alert_fails
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (alert_cntrs_clr),
+       .active_i            (any_active),
+       .event_i             (any_fail_pulse),
+       .value_o             (any_fail_count)
+       );
+
+  assign any_active = repcnt_active || adaptp_active || bucket_active || markov_active;
+  assign any_fail_pulse = repcnt_fail_pulse || adaptp_hi_fail_pulse || adaptp_lo_fail_pulse ||
+         bucket_fail_pulse || markov_fail_pulse;
+
+
+  assign ht_failed_d = sfifo_esfinal_push ? 1'b0 :
+         (any_fail_pulse && health_test_done_pulse) ? 1'b1 :
+         ht_failed_q;
+
+  assign hw2reg.alert_fail_counts.any_fail_count.d = any_fail_count;
+
+  // signal an alert
+  assign alert_threshold = reg2hw.alert_threshold.q;
+
+  assign alert_event = (any_fail_count >= alert_threshold) && (alert_threshold != '0);
+  assign alert_event_o = alert_event;
+
+
+  entropy_src_cntr_reg # (.RegWidth(EigthRegWidth))
+    u_entropy_src_cntr_reg_repcnt_alert_fails
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (alert_cntrs_clr),
+       .active_i            (repcnt_active),
+       .event_i             (repcnt_fail_pulse),
+       .value_o             (repcnt_fail_count)
+       );
+
+  assign hw2reg.alert_fail_counts.repcnt_fail_count.d = repcnt_fail_count;
+
+  entropy_src_cntr_reg # (.RegWidth(EigthRegWidth))
+    u_entropy_src_cntr_reg_adaptp_alert_hi_fails
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (alert_cntrs_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_hi_fail_pulse),
+       .value_o             (adaptp_hi_fail_count)
+       );
+
+  assign hw2reg.alert_fail_counts.adaptp_hi_fail_count.d = adaptp_hi_fail_count;
+
+  entropy_src_cntr_reg # (.RegWidth(EigthRegWidth))
+    u_entropy_src_cntr_reg_adaptp_alert_lo_fails
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (alert_cntrs_clr),
+       .active_i            (adaptp_active),
+       .event_i             (adaptp_lo_fail_pulse),
+       .value_o             (adaptp_lo_fail_count)
+       );
+
+  assign hw2reg.alert_fail_counts.adaptp_lo_fail_count.d = adaptp_lo_fail_count;
+
+  entropy_src_cntr_reg # (.RegWidth(EigthRegWidth))
+    u_entropy_src_cntr_reg_bucket_alert_fails
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (alert_cntrs_clr),
+       .active_i            (bucket_active),
+       .event_i             (bucket_fail_pulse),
+       .value_o             (bucket_fail_count)
+       );
+
+  assign hw2reg.alert_fail_counts.bucket_fail_count.d = bucket_fail_count;
+
+
+  entropy_src_cntr_reg # (.RegWidth(EigthRegWidth))
+    u_entropy_src_cntr_reg_markov_alert_fails
+      (
+       .clk_i               (clk_i),
+       .rst_ni              (rst_ni),
+       .clear_i             (alert_cntrs_clr),
+       .active_i            (markov_active),
+       .event_i             (markov_fail_pulse),
+       .value_o             (markov_fail_count)
+       );
+
+  assign hw2reg.alert_fail_counts.markov_fail_count.d = markov_fail_count;
+
+  //--------------------------------------------
+  // pack tested entropy into pre-conditioning packer
+  //--------------------------------------------
+
+  prim_packer_fifo # (.InW(RngBusWidth),.OutW(PostHTWidth))
+    u_prim_packer_fifo_postht (
+    .clk_i      (clk_i),
+    .rst_ni     (rst_ni),
+    .clr_i      (pfifo_postht_clr),
+    .wvalid_i   (pfifo_postht_push),
+    .wdata_i    (pfifo_postht_wdata),
+    .wready_o   (),
+    .rvalid_o   (pfifo_postht_not_empty),
+    .rdata_o    (pfifo_postht_rdata),
+    .rready_i   (pfifo_postht_pop),
+    .depth_o    ()
   );
 
-  // fifo controls
-  assign sfifo_essw_push = es_enable & sfifo_postht_pop & fill_sfifo_essw;
-  assign sfifo_essw_clr  = ~es_enable;
-  assign sfifo_essw_wdata = sfifo_postht_rdata;
-  assign sfifo_essw_pop = es_enable & esentropy_rd_pls & efuse_es_sw_reg_en_i;
+  assign pfifo_postht_push = ht_esbus_vld_dly_q;
+  assign pfifo_postht_wdata = ht_esbus_dly_q;
 
-  // fifo err
-  assign sfifo_essw_err =
-         (sfifo_essw_push & ~sfifo_essw_not_full) |
-         (sfifo_essw_pop & ~sfifo_essw_not_empty );
-
-  // set the es entropy to the read reg
-  assign hw2reg.es_entropy.d = es_enable ? sfifo_essw_rdata : '0;
-  assign esentropy_rd_pls = reg2hw.es_entropy.re;
-
-  // threshold
-  assign es_fifo_thresh = reg2hw.es_thresh.q;
-
-  // entropy valid
-  assign entropy_val_d = ~es_enable ? 1'b0 : (sfifo_essw_depth >= es_fifo_thresh);
-
-  // set the es fifo depth to the read reg
-  assign hw2reg.es_fdepthst.d = sfifo_essw_depth;
+  assign pfifo_postht_clr = !es_enable;
+  assign pfifo_postht_pop = ht_esbus_vld_dly2_q && pfifo_postht_not_empty;
 
 
+  //--------------------------------------------
+  // TODO: replace standin block with SHA conditioner
+  //--------------------------------------------
 
-  // this fifo feeds the hw bus interface
 
-  prim_fifo_sync # (.Width(32),.Pass(0),.Depth(4))
-    u_prim_fifo_sync_eshw (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .clr_i          (sfifo_eshw_clr),
-    .wvalid_i       (sfifo_eshw_push),
-    .wready_o       (sfifo_eshw_not_full),
-    .wdata_i        (sfifo_eshw_wdata),
-    .rvalid_o       (sfifo_eshw_not_empty),
-    .rready_i       (sfifo_eshw_pop),
-    .rdata_o        (sfifo_eshw_rdata),
-    .depth_o        (sfifo_eshw_depth)
+  prim_packer_fifo # (.InW(PostHTWidth),.OutW(SeedLen))
+    u_prim_packer_fifo_cond (
+    .clk_i      (clk_i),
+    .rst_ni     (rst_ni),
+    .clr_i      (pfifo_cond_clr),
+    .wvalid_i   (pfifo_cond_push),
+    .wdata_i    (pfifo_cond_wdata),
+    .wready_o   (),
+    .rvalid_o   (pfifo_cond_not_empty),
+    .rdata_o    (pfifo_cond_rdata),
+    .rready_i   (pfifo_cond_pop),
+    .depth_o    ()
   );
 
+  assign pfifo_cond_push = pfifo_postht_pop && !es_bypass_mode;
+  assign pfifo_cond_wdata = pfifo_postht_rdata;
+
+  assign pfifo_cond_clr = !es_enable;
+  assign pfifo_cond_pop = main_stage_pop;
+
+  //--------------------------------------------
+  // bypass SHA conditioner path
+  //--------------------------------------------
+
+  prim_packer_fifo # (.InW(PostHTWidth),.OutW(SeedLen))
+    u_prim_packer_fifo_bypass (
+    .clk_i      (clk_i),
+    .rst_ni     (rst_ni),
+    .clr_i      (pfifo_bypass_clr),
+    .wvalid_i   (pfifo_bypass_push),
+    .wdata_i    (pfifo_bypass_wdata),
+    .wready_o   (),
+    .rvalid_o   (pfifo_bypass_not_empty),
+    .rdata_o    (pfifo_bypass_rdata),
+    .rready_i   (pfifo_bypass_pop),
+    .depth_o    ()
+  );
+
+  assign pfifo_bypass_push = pfifo_postht_pop && es_bypass_mode;
+  assign pfifo_bypass_wdata = pfifo_postht_rdata;
+
+  assign pfifo_bypass_clr = !es_enable;
+  assign pfifo_bypass_pop = bypass_stage_pop;
+
+
+// mux to select between fips and bypass mode
+
+  assign final_es_data = es_bypass_mode ? pfifo_bypass_rdata : pfifo_cond_rdata;
+
+
+  //--------------------------------------------
+  // state machine to coordinate fifo flow
+  //--------------------------------------------
+
+  entropy_src_main_sm
+    u_entropy_src_main_sm (
+    .clk_i              (clk_i),
+    .rst_ni             (rst_ni),
+    .enable_i           (es_enable),
+    .ht_done_pulse_i    (health_test_done_pulse),
+    .ht_fail_pulse_i    (any_fail_pulse),
+    .postht_not_empty_i (pfifo_postht_not_empty),
+    .rst_alert_cntr_o   (rst_alert_cntr),
+    .bypass_mode_i      (es_bypass_mode),
+    .rst_bypass_mode_o  (rst_bypass_mode),
+    .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)
+  );
+
+
+  //--------------------------------------------
+  // send processed entropy to final fifo
+  //--------------------------------------------
+
+  prim_fifo_sync # (.Width(1+SeedLen),.Pass(0),.Depth(EsFifoDepth))
+    u_prim_fifo_sync_esfinal (
+    .clk_i          (clk_i),
+    .rst_ni         (rst_ni),
+    .clr_i          (sfifo_esfinal_clr),
+    .wvalid_i       (sfifo_esfinal_push),
+    .wready_o       (sfifo_esfinal_not_full),
+    .wdata_i        (sfifo_esfinal_wdata),
+    .rvalid_o       (sfifo_esfinal_not_empty),
+    .rready_i       (sfifo_esfinal_pop),
+    .rdata_o        (sfifo_esfinal_rdata),
+    .depth_o        (sfifo_esfinal_depth)
+  );
+
+  assign fips_compliance = !es_bypass_mode && es_enable_rng && !es_enable_lfsr && !rng_bit_en;
+
   // fifo controls
-  assign sfifo_eshw_push = es_enable & sfifo_postht_pop & ~fill_sfifo_essw;
-  assign sfifo_eshw_clr  = ~es_enable;
-  assign sfifo_eshw_wdata = sfifo_postht_rdata;
-  assign sfifo_eshw_pop = es_enable & entropy_src_hw_if_i.entropy_src_rdy
-         & sfifo_eshw_not_empty;
+  assign sfifo_esfinal_push = sfifo_esfinal_not_full &&
+         ((main_stage_pop || bypass_stage_pop) && !ht_failed_q);
+  assign sfifo_esfinal_clr  = ~es_enable;
+  assign sfifo_esfinal_wdata = {fips_compliance,final_es_data};
+  assign sfifo_esfinal_pop = es_route_to_sw ? pfifo_swread_not_full :
+         (es_enable && entropy_src_hw_if_i.es_req);
+  assign {esfinal_fips_flag,esfinal_data} = sfifo_esfinal_rdata;
 
   // fifo err
-  assign sfifo_eshw_err =
-         (sfifo_eshw_push & ~sfifo_eshw_not_full) |
-         (sfifo_eshw_pop & ~sfifo_eshw_not_empty );
+  assign sfifo_esfinal_err =
+         (sfifo_esfinal_push && !sfifo_esfinal_not_full) |
+         (sfifo_esfinal_pop && !sfifo_esfinal_not_empty );
 
   // drive out hw interface
-  assign entropy_src_hw_if_o.entropy_src_vld = sfifo_eshw_not_empty;
-  assign entropy_src_hw_if_o.entropy_src_bits = sfifo_eshw_rdata;
+  assign entropy_src_hw_if_o.es_ack = sfifo_esfinal_not_empty && !es_route_to_sw;
+  assign entropy_src_hw_if_o.es_bits = esfinal_data;
+  assign entropy_src_hw_if_o.es_fips = esfinal_fips_flag;
 
   //--------------------------------------------
+  // software es read path
+  //--------------------------------------------
+
+  prim_packer_fifo # (.InW(SeedLen),.OutW(FullRegWidth))
+    u_prim_packer_fifo_swread (
+    .clk_i      (clk_i),
+    .rst_ni     (rst_ni),
+    .clr_i      (pfifo_swread_clr),
+    .wvalid_i   (pfifo_swread_push),
+    .wdata_i    (pfifo_swread_wdata),
+    .wready_o   (pfifo_swread_not_full),
+    .rvalid_o   (pfifo_swread_not_empty),
+    .rdata_o    (pfifo_swread_rdata),
+    .rready_i   (pfifo_swread_pop),
+    .depth_o    ()
+  );
+
+  assign pfifo_swread_push = sfifo_esfinal_pop;
+  assign pfifo_swread_wdata = esfinal_data;
+
+  assign pfifo_swread_clr = !es_enable;
+  assign pfifo_swread_pop =  es_enable && sw_es_rd_pulse;
+
+  // set the es entropy to the read reg
+  assign hw2reg.entropy_data.d = es_enable ? pfifo_swread_rdata : '0;
+  assign sw_es_rd_pulse = efuse_es_sw_reg_en_i && reg2hw.entropy_data.re;
+  //--------------------------------------------
   // diag settings
   //--------------------------------------------
 
-  assign hw2reg.es_fifo_status.diag.d  =
-         reg2hw.es_regen.q &
-         (&reg2hw.es_entropy.q);
+  assign hw2reg.debug_status.diag.d  =
+         reg2hw.regen.q &&
+         (&reg2hw.entropy_data.q);
 
 endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv b/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv
new file mode 100755
index 0000000..5e4ea67
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_main_sm.sv
@@ -0,0 +1,96 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src main state machine module
+//
+//   determines when new entropy is ready to be forwarded
+
+module entropy_src_main_sm (
+  input logic                clk_i,
+  input logic                rst_ni,
+
+  input logic                enable_i,
+  input logic                ht_done_pulse_i,
+  input logic                ht_fail_pulse_i,
+  input logic                postht_not_empty_i,
+  output logic               rst_alert_cntr_o,
+  input logic                bypass_mode_i,
+  output logic               rst_bypass_mode_o,
+  input logic                main_stage_rdy_i,
+  input logic                bypass_stage_rdy_i,
+  output logic               main_stage_pop_o,
+  output logic               bypass_stage_pop_o
+);
+
+  // TODO: consider hamming-distance expansion of state encoding
+  typedef enum logic [2:0] {
+                            IDLE = 3'h0, // idle
+                            HTDP = 3'h1, // wait for health test done pulse
+                            PNMT = 3'h2, // wait for post health test packer not empty state
+                            MODE = 3'h3, // determine what mode the flow is in
+                            BYPS = 3'h4, // in bypass mode
+                            NORM = 3'h5  // in normal mode
+                            } state_e;
+
+  state_e state_q, state_d;
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      state_q    <= IDLE;
+    end else begin
+      state_q    <= state_d;
+    end
+
+  always_comb begin
+    state_d = state_q;
+    rst_bypass_mode_o = 1'b0;
+    rst_alert_cntr_o = 1'b0;
+    main_stage_pop_o = 1'b0;
+    bypass_stage_pop_o = 1'b0;
+    unique case (state_q)
+      IDLE: begin
+        if (enable_i) begin
+          state_d = HTDP;
+        end
+      end
+      HTDP: begin
+        if (ht_done_pulse_i) begin
+          if (ht_fail_pulse_i) begin
+            state_d = IDLE;
+          end else begin
+            state_d = PNMT;
+          end
+        end
+      end
+      PNMT: begin
+        rst_alert_cntr_o = 1'b1;
+        if (postht_not_empty_i) begin
+          state_d = MODE;
+        end
+      end
+      MODE: begin
+        if (bypass_mode_i) begin
+          state_d = BYPS;
+        end else begin
+          state_d = NORM;
+        end
+      end
+      BYPS: begin
+        if (bypass_stage_rdy_i) begin
+          rst_bypass_mode_o = 1'b1;
+          bypass_stage_pop_o = 1'b1;
+          state_d = IDLE;
+        end
+      end
+      NORM: begin
+        if (main_stage_rdy_i) begin
+          main_stage_pop_o = 1'b1;
+          state_d = IDLE;
+        end
+      end
+      default: state_d = IDLE;
+    endcase
+  end
+
+endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_markov_ht.sv b/hw/ip/entropy_src/rtl/entropy_src_markov_ht.sv
new file mode 100755
index 0000000..f8b8f3e
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_markov_ht.sv
@@ -0,0 +1,111 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src Markov health test module
+//
+
+module entropy_src_markov_ht #(
+  parameter int unsigned RegWidth = 16,
+  parameter int unsigned RngBusWidth = 4
+) (
+  input                  clk_i,
+  input                  rst_ni,
+
+   // ins req interface
+  input logic [RngBusWidth-1:0] entropy_bit_i,
+  input logic                   entropy_bit_vld_i,
+  input logic                   clear_i,
+  input logic                   active_i,
+  input logic [RegWidth-1:0]    thresh_i,
+  input logic [RegWidth-1:0]    window_i,
+  output logic [RegWidth-1:0]   test_cnt_o,
+  output logic                  test_done_pulse_o,
+  output logic                  test_fail_pulse_o
+);
+
+  // signals
+  logic                   window_cntr_wrap;
+  logic [RngBusWidth-1:0] samples_no_match_pulse;
+  logic [RngBusWidth-1:0] pair_cnt_fail;
+
+  // flops
+  logic [RngBusWidth-1:0] prev_sample_q, prev_sample_d;
+  logic [RegWidth-1:0]    pair_cntr_q[RngBusWidth], pair_cntr_d[RngBusWidth];
+  logic [RegWidth-1:0]    window_cntr_q, window_cntr_d;
+  logic [RegWidth-1:0]    test_cnt_q, test_cnt_d;
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      prev_sample_q    <= '0;
+      pair_cntr_q      <= {{RegWidth{1'b0}},{RegWidth{1'b0}},
+                           {RegWidth{1'b0}},{RegWidth{1'b0}}};
+      window_cntr_q    <= '0;
+      test_cnt_q       <= '0;
+    end else begin
+      prev_sample_q    <= prev_sample_d;
+      pair_cntr_q      <= pair_cntr_d;
+      window_cntr_q    <= window_cntr_d;
+      test_cnt_q       <= test_cnt_d;
+    end
+
+
+  // Markov Test
+  //
+  // Test operation
+  //  This test will look at pairs of bit levels per bitstream. A counter for
+  //  stream will only count when the pair equals 0b01 or 0b10.
+
+
+  genvar sh;
+  generate
+    for (sh = 0; sh < RngBusWidth; sh = sh+1) begin : gen_cntrs
+
+      // bit sampler
+      assign prev_sample_d[sh] =
+             (!active_i || clear_i) ? '0 :
+             window_cntr_wrap ? '0  :
+             entropy_bit_vld_i ? entropy_bit_i[sh] :
+             prev_sample_q[sh];
+
+      // pair check
+      assign samples_no_match_pulse[sh] = entropy_bit_vld_i && window_cntr_q[0] &&
+             (prev_sample_q[sh] == !entropy_bit_i[sh]);
+
+      // pair counter
+      assign pair_cntr_d[sh] =
+             (!active_i || clear_i) ? '0 :
+             window_cntr_wrap ? '0  :
+             samples_no_match_pulse[sh] ? (pair_cntr_q[sh]+1) :
+             pair_cntr_q[sh];
+
+      assign pair_cnt_fail[sh] = (pair_cntr_q[sh] >= thresh_i);
+
+    end
+  endgenerate
+
+
+  // Window wrap condition
+  assign window_cntr_wrap = (window_cntr_q == window_i);
+
+  // Window counter
+  assign window_cntr_d =
+         clear_i ? '0 :
+         window_cntr_wrap ? '0  :
+         entropy_bit_vld_i ? (window_cntr_q+1) :
+         window_cntr_q;
+
+  // Test event counter
+  assign test_cnt_d =
+         (!active_i || clear_i) ? '0 :
+         window_cntr_wrap ? '0 :
+         entropy_bit_vld_i && (|pair_cnt_fail) ? (test_cnt_q+1) :
+         test_cnt_q;
+
+  // the pulses will be only one clock in length
+  assign test_fail_pulse_o = active_i && window_cntr_wrap && (test_cnt_q > '0);
+  assign test_done_pulse_o = window_cntr_wrap;
+  assign test_cnt_o = test_cnt_q;
+
+
+endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_pkg.sv b/hw/ip/entropy_src/rtl/entropy_src_pkg.sv
index cd45ab0..afa3320 100755
--- a/hw/ip/entropy_src/rtl/entropy_src_pkg.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_pkg.sv
@@ -11,12 +11,13 @@
   //-------------------------
 
   typedef struct packed {
-    logic        entropy_src_vld;
-    logic [31:0] entropy_src_bits;
+    logic         es_ack;
+    logic [383:0] es_bits;
+    logic         es_fips;
   } entropy_src_hw_if_rsp_t;
 
   typedef struct packed {
-    logic entropy_src_rdy;
+    logic es_req;
   } entropy_src_hw_if_req_t;
 
   typedef struct packed {
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 b4c9813..12116f2 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_reg_pkg.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_reg_pkg.sv
@@ -8,6 +8,7 @@
 
   // Param list
   parameter int EsFifoDepth = 32;
+  parameter int NumAlerts = 1;
 
   ////////////////////////////
   // Typedefs for registers //
@@ -18,10 +19,7 @@
     } es_entropy_valid;
     struct packed {
       logic        q;
-    } es_rct_failed;
-    struct packed {
-      logic        q;
-    } es_apt_failed;
+    } es_health_test_failed;
     struct packed {
       logic        q;
     } es_fifo_err;
@@ -33,10 +31,7 @@
     } es_entropy_valid;
     struct packed {
       logic        q;
-    } es_rct_failed;
-    struct packed {
-      logic        q;
-    } es_apt_failed;
+    } es_health_test_failed;
     struct packed {
       logic        q;
     } es_fifo_err;
@@ -50,11 +45,7 @@
     struct packed {
       logic        q;
       logic        qe;
-    } es_rct_failed;
-    struct packed {
-      logic        q;
-      logic        qe;
-    } es_apt_failed;
+    } es_health_test_failed;
     struct packed {
       logic        q;
       logic        qe;
@@ -63,7 +54,7 @@
 
   typedef struct packed {
     logic        q;
-  } entropy_src_reg2hw_es_regen_reg_t;
+  } entropy_src_reg2hw_regen_reg_t;
 
   typedef struct packed {
     struct packed {
@@ -71,50 +62,109 @@
     } enable;
     struct packed {
       logic        q;
-    } rng_src_en;
+    } boot_bypass_disable;
     struct packed {
       logic        q;
-    } rct_en;
+    } repcnt_disable;
     struct packed {
       logic        q;
-    } apt_en;
+    } adaptp_disable;
+    struct packed {
+      logic        q;
+    } bucket_disable;
+    struct packed {
+      logic        q;
+    } markov_disable;
+    struct packed {
+      logic        q;
+    } health_test_clr;
     struct packed {
       logic        q;
     } rng_bit_en;
     struct packed {
       logic [1:0]  q;
     } rng_bit_sel;
-  } entropy_src_reg2hw_es_conf_reg_t;
+  } entropy_src_reg2hw_conf_reg_t;
 
   typedef struct packed {
     logic [15:0] q;
-  } entropy_src_reg2hw_es_rct_health_reg_t;
+  } entropy_src_reg2hw_rate_reg_t;
 
   typedef struct packed {
     struct packed {
-      logic [15:0] q;
-    } apt_max;
+      logic        q;
+    } es_route;
     struct packed {
-      logic [15:0] q;
-    } apt_win;
-  } entropy_src_reg2hw_es_apt_health_reg_t;
+      logic        q;
+    } es_type;
+  } entropy_src_reg2hw_entropy_control_reg_t;
 
   typedef struct packed {
     logic [31:0] q;
     logic        re;
-  } entropy_src_reg2hw_es_entropy_reg_t;
+  } entropy_src_reg2hw_entropy_data_reg_t;
 
   typedef struct packed {
-    logic [2:0]  q;
-  } entropy_src_reg2hw_es_thresh_reg_t;
+    struct packed {
+      logic [15:0] q;
+    } fips_window;
+    struct packed {
+      logic [15:0] q;
+    } bypass_window;
+  } entropy_src_reg2hw_health_test_windows_reg_t;
 
   typedef struct packed {
-    logic [15:0] q;
-  } entropy_src_reg2hw_es_rate_reg_t;
+    struct packed {
+      logic [15:0] q;
+    } fips_repcnt_thresh;
+    struct packed {
+      logic [15:0] q;
+    } bypass_repcnt_thresh;
+  } entropy_src_reg2hw_repcnt_thresholds_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] q;
+    } fips_adaptp_hi_thresh;
+    struct packed {
+      logic [15:0] q;
+    } bypass_adaptp_hi_thresh;
+  } entropy_src_reg2hw_adaptp_hi_thresholds_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] q;
+    } fips_adaptp_lo_thresh;
+    struct packed {
+      logic [15:0] q;
+    } bypass_adaptp_lo_thresh;
+  } entropy_src_reg2hw_adaptp_lo_thresholds_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] q;
+    } fips_bucket_thresh;
+    struct packed {
+      logic [15:0] q;
+    } bypass_bucket_thresh;
+  } entropy_src_reg2hw_bucket_thresholds_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] q;
+    } fips_markov_thresh;
+    struct packed {
+      logic [15:0] q;
+    } bypass_markov_thresh;
+  } entropy_src_reg2hw_markov_thresholds_reg_t;
 
   typedef struct packed {
     logic [3:0]  q;
-  } entropy_src_reg2hw_es_seed_reg_t;
+  } entropy_src_reg2hw_alert_threshold_reg_t;
+
+  typedef struct packed {
+    logic [3:0]  q;
+  } entropy_src_reg2hw_seed_reg_t;
 
 
   typedef struct packed {
@@ -125,11 +175,7 @@
     struct packed {
       logic        d;
       logic        de;
-    } es_rct_failed;
-    struct packed {
-      logic        d;
-      logic        de;
-    } es_apt_failed;
+    } es_health_test_failed;
     struct packed {
       logic        d;
       logic        de;
@@ -138,70 +184,176 @@
 
   typedef struct packed {
     logic [31:0] d;
-  } entropy_src_hw2reg_es_entropy_reg_t;
+  } entropy_src_hw2reg_entropy_data_reg_t;
 
   typedef struct packed {
     struct packed {
-      logic [2:0]  d;
-    } dig_src_depth;
+      logic [15:0] d;
+    } fips_repcnt_hi_watermark;
     struct packed {
-      logic [2:0]  d;
-    } hwif_depth;
+      logic [15:0] d;
+    } bypass_repcnt_hi_watermark;
+  } entropy_src_hw2reg_repcnt_hi_watermarks_reg_t;
+
+  typedef struct packed {
     struct packed {
-      logic [4:0]  d;
-    } es_depth;
+      logic [15:0] d;
+    } fips_adaptp_hi_watermark;
+    struct packed {
+      logic [15:0] d;
+    } bypass_adaptp_hi_watermark;
+  } entropy_src_hw2reg_adaptp_hi_watermarks_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] d;
+    } fips_adaptp_lo_watermark;
+    struct packed {
+      logic [15:0] d;
+    } bypass_adaptp_lo_watermark;
+  } entropy_src_hw2reg_adaptp_lo_watermarks_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] d;
+    } fips_bucket_hi_watermark;
+    struct packed {
+      logic [15:0] d;
+    } bypass_bucket_hi_watermark;
+  } entropy_src_hw2reg_bucket_hi_watermarks_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [15:0] d;
+    } fips_markov_hi_watermark;
+    struct packed {
+      logic [15:0] d;
+    } bypass_markov_hi_watermark;
+  } entropy_src_hw2reg_markov_hi_watermarks_reg_t;
+
+  typedef struct packed {
+    logic [31:0] d;
+  } entropy_src_hw2reg_repcnt_total_fails_reg_t;
+
+  typedef struct packed {
+    logic [31:0] d;
+  } entropy_src_hw2reg_adaptp_hi_total_fails_reg_t;
+
+  typedef struct packed {
+    logic [31:0] d;
+  } entropy_src_hw2reg_adaptp_lo_total_fails_reg_t;
+
+  typedef struct packed {
+    logic [31:0] d;
+  } entropy_src_hw2reg_bucket_total_fails_reg_t;
+
+  typedef struct packed {
+    logic [31:0] d;
+  } entropy_src_hw2reg_markov_total_fails_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [3:0]  d;
+    } any_fail_count;
+    struct packed {
+      logic [3:0]  d;
+    } repcnt_fail_count;
+    struct packed {
+      logic [3:0]  d;
+    } adaptp_hi_fail_count;
+    struct packed {
+      logic [3:0]  d;
+    } adaptp_lo_fail_count;
+    struct packed {
+      logic [3:0]  d;
+    } bucket_fail_count;
+    struct packed {
+      logic [3:0]  d;
+    } markov_fail_count;
+  } entropy_src_hw2reg_alert_fail_counts_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [1:0]  d;
+    } entropy_fifo_depth;
     struct packed {
       logic        d;
     } diag;
-  } entropy_src_hw2reg_es_fifo_status_reg_t;
-
-  typedef struct packed {
-    logic [2:0]  d;
-  } entropy_src_hw2reg_es_fdepthst_reg_t;
+  } entropy_src_hw2reg_debug_status_reg_t;
 
 
   ///////////////////////////////////////
   // Register to internal design logic //
   ///////////////////////////////////////
   typedef struct packed {
-    entropy_src_reg2hw_intr_state_reg_t intr_state; // [128:125]
-    entropy_src_reg2hw_intr_enable_reg_t intr_enable; // [124:121]
-    entropy_src_reg2hw_intr_test_reg_t intr_test; // [120:113]
-    entropy_src_reg2hw_es_regen_reg_t es_regen; // [112:112]
-    entropy_src_reg2hw_es_conf_reg_t es_conf; // [111:104]
-    entropy_src_reg2hw_es_rct_health_reg_t es_rct_health; // [103:88]
-    entropy_src_reg2hw_es_apt_health_reg_t es_apt_health; // [87:56]
-    entropy_src_reg2hw_es_entropy_reg_t es_entropy; // [55:23]
-    entropy_src_reg2hw_es_thresh_reg_t es_thresh; // [22:20]
-    entropy_src_reg2hw_es_rate_reg_t es_rate; // [19:4]
-    entropy_src_reg2hw_es_seed_reg_t es_seed; // [3:0]
+    entropy_src_reg2hw_intr_state_reg_t intr_state; // [274:272]
+    entropy_src_reg2hw_intr_enable_reg_t intr_enable; // [271:269]
+    entropy_src_reg2hw_intr_test_reg_t intr_test; // [268:263]
+    entropy_src_reg2hw_regen_reg_t regen; // [262:262]
+    entropy_src_reg2hw_conf_reg_t conf; // [261:251]
+    entropy_src_reg2hw_rate_reg_t rate; // [250:235]
+    entropy_src_reg2hw_entropy_control_reg_t entropy_control; // [234:233]
+    entropy_src_reg2hw_entropy_data_reg_t entropy_data; // [232:200]
+    entropy_src_reg2hw_health_test_windows_reg_t health_test_windows; // [199:168]
+    entropy_src_reg2hw_repcnt_thresholds_reg_t repcnt_thresholds; // [167:136]
+    entropy_src_reg2hw_adaptp_hi_thresholds_reg_t adaptp_hi_thresholds; // [135:104]
+    entropy_src_reg2hw_adaptp_lo_thresholds_reg_t adaptp_lo_thresholds; // [103:72]
+    entropy_src_reg2hw_bucket_thresholds_reg_t bucket_thresholds; // [71:40]
+    entropy_src_reg2hw_markov_thresholds_reg_t markov_thresholds; // [39:8]
+    entropy_src_reg2hw_alert_threshold_reg_t alert_threshold; // [7:4]
+    entropy_src_reg2hw_seed_reg_t seed; // [3:0]
   } entropy_src_reg2hw_t;
 
   ///////////////////////////////////////
   // Internal design logic to register //
   ///////////////////////////////////////
   typedef struct packed {
-    entropy_src_hw2reg_intr_state_reg_t intr_state; // [54:51]
-    entropy_src_hw2reg_es_entropy_reg_t es_entropy; // [50:18]
-    entropy_src_hw2reg_es_fifo_status_reg_t es_fifo_status; // [17:18]
-    entropy_src_hw2reg_es_fdepthst_reg_t es_fdepthst; // [17:18]
+    entropy_src_hw2reg_intr_state_reg_t intr_state; // [384:382]
+    entropy_src_hw2reg_entropy_data_reg_t entropy_data; // [381:349]
+    entropy_src_hw2reg_repcnt_hi_watermarks_reg_t repcnt_hi_watermarks; // [348:349]
+    entropy_src_hw2reg_adaptp_hi_watermarks_reg_t adaptp_hi_watermarks; // [348:349]
+    entropy_src_hw2reg_adaptp_lo_watermarks_reg_t adaptp_lo_watermarks; // [348:349]
+    entropy_src_hw2reg_bucket_hi_watermarks_reg_t bucket_hi_watermarks; // [348:349]
+    entropy_src_hw2reg_markov_hi_watermarks_reg_t markov_hi_watermarks; // [348:349]
+    entropy_src_hw2reg_repcnt_total_fails_reg_t repcnt_total_fails; // [348:349]
+    entropy_src_hw2reg_adaptp_hi_total_fails_reg_t adaptp_hi_total_fails; // [348:349]
+    entropy_src_hw2reg_adaptp_lo_total_fails_reg_t adaptp_lo_total_fails; // [348:349]
+    entropy_src_hw2reg_bucket_total_fails_reg_t bucket_total_fails; // [348:349]
+    entropy_src_hw2reg_markov_total_fails_reg_t markov_total_fails; // [348:349]
+    entropy_src_hw2reg_alert_fail_counts_reg_t alert_fail_counts; // [348:349]
+    entropy_src_hw2reg_debug_status_reg_t debug_status; // [348:349]
   } entropy_src_hw2reg_t;
 
   // Register Address
-  parameter logic [5:0] ENTROPY_SRC_INTR_STATE_OFFSET = 6'h 0;
-  parameter logic [5:0] ENTROPY_SRC_INTR_ENABLE_OFFSET = 6'h 4;
-  parameter logic [5:0] ENTROPY_SRC_INTR_TEST_OFFSET = 6'h 8;
-  parameter logic [5:0] ENTROPY_SRC_ES_REGEN_OFFSET = 6'h c;
-  parameter logic [5:0] ENTROPY_SRC_ES_REV_OFFSET = 6'h 10;
-  parameter logic [5:0] ENTROPY_SRC_ES_CONF_OFFSET = 6'h 14;
-  parameter logic [5:0] ENTROPY_SRC_ES_RCT_HEALTH_OFFSET = 6'h 18;
-  parameter logic [5:0] ENTROPY_SRC_ES_APT_HEALTH_OFFSET = 6'h 1c;
-  parameter logic [5:0] ENTROPY_SRC_ES_ENTROPY_OFFSET = 6'h 20;
-  parameter logic [5:0] ENTROPY_SRC_ES_FIFO_STATUS_OFFSET = 6'h 24;
-  parameter logic [5:0] ENTROPY_SRC_ES_FDEPTHST_OFFSET = 6'h 28;
-  parameter logic [5:0] ENTROPY_SRC_ES_THRESH_OFFSET = 6'h 2c;
-  parameter logic [5:0] ENTROPY_SRC_ES_RATE_OFFSET = 6'h 30;
-  parameter logic [5:0] ENTROPY_SRC_ES_SEED_OFFSET = 6'h 34;
+  parameter logic [6:0] ENTROPY_SRC_INTR_STATE_OFFSET = 7'h 0;
+  parameter logic [6:0] ENTROPY_SRC_INTR_ENABLE_OFFSET = 7'h 4;
+  parameter logic [6:0] ENTROPY_SRC_INTR_TEST_OFFSET = 7'h 8;
+  parameter logic [6:0] ENTROPY_SRC_REGEN_OFFSET = 7'h c;
+  parameter logic [6:0] ENTROPY_SRC_REV_OFFSET = 7'h 10;
+  parameter logic [6:0] ENTROPY_SRC_CONF_OFFSET = 7'h 14;
+  parameter logic [6:0] ENTROPY_SRC_RATE_OFFSET = 7'h 18;
+  parameter logic [6:0] ENTROPY_SRC_ENTROPY_CONTROL_OFFSET = 7'h 1c;
+  parameter logic [6:0] ENTROPY_SRC_ENTROPY_DATA_OFFSET = 7'h 20;
+  parameter logic [6:0] ENTROPY_SRC_HEALTH_TEST_WINDOWS_OFFSET = 7'h 24;
+  parameter logic [6:0] ENTROPY_SRC_REPCNT_THRESHOLDS_OFFSET = 7'h 28;
+  parameter logic [6:0] ENTROPY_SRC_ADAPTP_HI_THRESHOLDS_OFFSET = 7'h 2c;
+  parameter logic [6:0] ENTROPY_SRC_ADAPTP_LO_THRESHOLDS_OFFSET = 7'h 30;
+  parameter logic [6:0] ENTROPY_SRC_BUCKET_THRESHOLDS_OFFSET = 7'h 34;
+  parameter logic [6:0] ENTROPY_SRC_MARKOV_THRESHOLDS_OFFSET = 7'h 38;
+  parameter logic [6:0] ENTROPY_SRC_REPCNT_HI_WATERMARKS_OFFSET = 7'h 3c;
+  parameter logic [6:0] ENTROPY_SRC_ADAPTP_HI_WATERMARKS_OFFSET = 7'h 40;
+  parameter logic [6:0] ENTROPY_SRC_ADAPTP_LO_WATERMARKS_OFFSET = 7'h 44;
+  parameter logic [6:0] ENTROPY_SRC_BUCKET_HI_WATERMARKS_OFFSET = 7'h 48;
+  parameter logic [6:0] ENTROPY_SRC_MARKOV_HI_WATERMARKS_OFFSET = 7'h 4c;
+  parameter logic [6:0] ENTROPY_SRC_REPCNT_TOTAL_FAILS_OFFSET = 7'h 50;
+  parameter logic [6:0] ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS_OFFSET = 7'h 54;
+  parameter logic [6:0] ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS_OFFSET = 7'h 58;
+  parameter logic [6:0] ENTROPY_SRC_BUCKET_TOTAL_FAILS_OFFSET = 7'h 5c;
+  parameter logic [6:0] ENTROPY_SRC_MARKOV_TOTAL_FAILS_OFFSET = 7'h 60;
+  parameter logic [6:0] ENTROPY_SRC_ALERT_THRESHOLD_OFFSET = 7'h 64;
+  parameter logic [6:0] ENTROPY_SRC_ALERT_FAIL_COUNTS_OFFSET = 7'h 68;
+  parameter logic [6:0] ENTROPY_SRC_DEBUG_STATUS_OFFSET = 7'h 6c;
+  parameter logic [6:0] ENTROPY_SRC_SEED_OFFSET = 7'h 70;
 
 
   // Register Index
@@ -209,35 +361,65 @@
     ENTROPY_SRC_INTR_STATE,
     ENTROPY_SRC_INTR_ENABLE,
     ENTROPY_SRC_INTR_TEST,
-    ENTROPY_SRC_ES_REGEN,
-    ENTROPY_SRC_ES_REV,
-    ENTROPY_SRC_ES_CONF,
-    ENTROPY_SRC_ES_RCT_HEALTH,
-    ENTROPY_SRC_ES_APT_HEALTH,
-    ENTROPY_SRC_ES_ENTROPY,
-    ENTROPY_SRC_ES_FIFO_STATUS,
-    ENTROPY_SRC_ES_FDEPTHST,
-    ENTROPY_SRC_ES_THRESH,
-    ENTROPY_SRC_ES_RATE,
-    ENTROPY_SRC_ES_SEED
+    ENTROPY_SRC_REGEN,
+    ENTROPY_SRC_REV,
+    ENTROPY_SRC_CONF,
+    ENTROPY_SRC_RATE,
+    ENTROPY_SRC_ENTROPY_CONTROL,
+    ENTROPY_SRC_ENTROPY_DATA,
+    ENTROPY_SRC_HEALTH_TEST_WINDOWS,
+    ENTROPY_SRC_REPCNT_THRESHOLDS,
+    ENTROPY_SRC_ADAPTP_HI_THRESHOLDS,
+    ENTROPY_SRC_ADAPTP_LO_THRESHOLDS,
+    ENTROPY_SRC_BUCKET_THRESHOLDS,
+    ENTROPY_SRC_MARKOV_THRESHOLDS,
+    ENTROPY_SRC_REPCNT_HI_WATERMARKS,
+    ENTROPY_SRC_ADAPTP_HI_WATERMARKS,
+    ENTROPY_SRC_ADAPTP_LO_WATERMARKS,
+    ENTROPY_SRC_BUCKET_HI_WATERMARKS,
+    ENTROPY_SRC_MARKOV_HI_WATERMARKS,
+    ENTROPY_SRC_REPCNT_TOTAL_FAILS,
+    ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS,
+    ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS,
+    ENTROPY_SRC_BUCKET_TOTAL_FAILS,
+    ENTROPY_SRC_MARKOV_TOTAL_FAILS,
+    ENTROPY_SRC_ALERT_THRESHOLD,
+    ENTROPY_SRC_ALERT_FAIL_COUNTS,
+    ENTROPY_SRC_DEBUG_STATUS,
+    ENTROPY_SRC_SEED
   } entropy_src_id_e;
 
   // Register width information to check illegal writes
-  parameter logic [3:0] ENTROPY_SRC_PERMIT [14] = '{
+  parameter logic [3:0] ENTROPY_SRC_PERMIT [29] = '{
     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
-    4'b 0001, // index[ 3] ENTROPY_SRC_ES_REGEN
-    4'b 0111, // index[ 4] ENTROPY_SRC_ES_REV
-    4'b 0011, // index[ 5] ENTROPY_SRC_ES_CONF
-    4'b 0011, // index[ 6] ENTROPY_SRC_ES_RCT_HEALTH
-    4'b 1111, // index[ 7] ENTROPY_SRC_ES_APT_HEALTH
-    4'b 1111, // index[ 8] ENTROPY_SRC_ES_ENTROPY
-    4'b 1111, // index[ 9] ENTROPY_SRC_ES_FIFO_STATUS
-    4'b 0001, // index[10] ENTROPY_SRC_ES_FDEPTHST
-    4'b 0001, // index[11] ENTROPY_SRC_ES_THRESH
-    4'b 0011, // index[12] ENTROPY_SRC_ES_RATE
-    4'b 0001  // index[13] ENTROPY_SRC_ES_SEED
+    4'b 0001, // index[ 3] ENTROPY_SRC_REGEN
+    4'b 0111, // index[ 4] ENTROPY_SRC_REV
+    4'b 0011, // index[ 5] ENTROPY_SRC_CONF
+    4'b 0011, // index[ 6] ENTROPY_SRC_RATE
+    4'b 0001, // index[ 7] ENTROPY_SRC_ENTROPY_CONTROL
+    4'b 1111, // index[ 8] ENTROPY_SRC_ENTROPY_DATA
+    4'b 1111, // index[ 9] ENTROPY_SRC_HEALTH_TEST_WINDOWS
+    4'b 1111, // index[10] ENTROPY_SRC_REPCNT_THRESHOLDS
+    4'b 1111, // index[11] ENTROPY_SRC_ADAPTP_HI_THRESHOLDS
+    4'b 1111, // index[12] ENTROPY_SRC_ADAPTP_LO_THRESHOLDS
+    4'b 1111, // index[13] ENTROPY_SRC_BUCKET_THRESHOLDS
+    4'b 1111, // index[14] ENTROPY_SRC_MARKOV_THRESHOLDS
+    4'b 1111, // index[15] ENTROPY_SRC_REPCNT_HI_WATERMARKS
+    4'b 1111, // index[16] ENTROPY_SRC_ADAPTP_HI_WATERMARKS
+    4'b 1111, // index[17] ENTROPY_SRC_ADAPTP_LO_WATERMARKS
+    4'b 1111, // index[18] ENTROPY_SRC_BUCKET_HI_WATERMARKS
+    4'b 1111, // index[19] ENTROPY_SRC_MARKOV_HI_WATERMARKS
+    4'b 1111, // index[20] ENTROPY_SRC_REPCNT_TOTAL_FAILS
+    4'b 1111, // index[21] ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS
+    4'b 1111, // index[22] ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS
+    4'b 1111, // index[23] ENTROPY_SRC_BUCKET_TOTAL_FAILS
+    4'b 1111, // index[24] ENTROPY_SRC_MARKOV_TOTAL_FAILS
+    4'b 0001, // index[25] ENTROPY_SRC_ALERT_THRESHOLD
+    4'b 0111, // index[26] ENTROPY_SRC_ALERT_FAIL_COUNTS
+    4'b 1111, // index[27] ENTROPY_SRC_DEBUG_STATUS
+    4'b 0001  // index[28] ENTROPY_SRC_SEED
   };
 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 bd27cc3..a49f03d 100644
--- a/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
+++ b/hw/ip/entropy_src/rtl/entropy_src_reg_top.sv
@@ -23,7 +23,7 @@
 
   import entropy_src_reg_pkg::* ;
 
-  localparam int AW = 6;
+  localparam int AW = 7;
   localparam int DW = 32;
   localparam int DBW = DW/8;                    // Byte Width
 
@@ -74,89 +74,159 @@
   logic intr_state_es_entropy_valid_qs;
   logic intr_state_es_entropy_valid_wd;
   logic intr_state_es_entropy_valid_we;
-  logic intr_state_es_rct_failed_qs;
-  logic intr_state_es_rct_failed_wd;
-  logic intr_state_es_rct_failed_we;
-  logic intr_state_es_apt_failed_qs;
-  logic intr_state_es_apt_failed_wd;
-  logic intr_state_es_apt_failed_we;
+  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_enable_es_entropy_valid_qs;
   logic intr_enable_es_entropy_valid_wd;
   logic intr_enable_es_entropy_valid_we;
-  logic intr_enable_es_rct_failed_qs;
-  logic intr_enable_es_rct_failed_wd;
-  logic intr_enable_es_rct_failed_we;
-  logic intr_enable_es_apt_failed_qs;
-  logic intr_enable_es_apt_failed_wd;
-  logic intr_enable_es_apt_failed_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_test_es_entropy_valid_wd;
   logic intr_test_es_entropy_valid_we;
-  logic intr_test_es_rct_failed_wd;
-  logic intr_test_es_rct_failed_we;
-  logic intr_test_es_apt_failed_wd;
-  logic intr_test_es_apt_failed_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 es_regen_qs;
-  logic es_regen_wd;
-  logic es_regen_we;
-  logic [7:0] es_rev_abi_revision_qs;
-  logic [7:0] es_rev_hw_revision_qs;
-  logic [7:0] es_rev_chip_type_qs;
-  logic [1:0] es_conf_enable_qs;
-  logic [1:0] es_conf_enable_wd;
-  logic es_conf_enable_we;
-  logic es_conf_rng_src_en_qs;
-  logic es_conf_rng_src_en_wd;
-  logic es_conf_rng_src_en_we;
-  logic es_conf_rct_en_qs;
-  logic es_conf_rct_en_wd;
-  logic es_conf_rct_en_we;
-  logic es_conf_apt_en_qs;
-  logic es_conf_apt_en_wd;
-  logic es_conf_apt_en_we;
-  logic es_conf_rng_bit_en_qs;
-  logic es_conf_rng_bit_en_wd;
-  logic es_conf_rng_bit_en_we;
-  logic [1:0] es_conf_rng_bit_sel_qs;
-  logic [1:0] es_conf_rng_bit_sel_wd;
-  logic es_conf_rng_bit_sel_we;
-  logic [15:0] es_rct_health_qs;
-  logic [15:0] es_rct_health_wd;
-  logic es_rct_health_we;
-  logic [15:0] es_apt_health_apt_max_qs;
-  logic [15:0] es_apt_health_apt_max_wd;
-  logic es_apt_health_apt_max_we;
-  logic [15:0] es_apt_health_apt_win_qs;
-  logic [15:0] es_apt_health_apt_win_wd;
-  logic es_apt_health_apt_win_we;
-  logic [31:0] es_entropy_qs;
-  logic es_entropy_re;
-  logic [2:0] es_fifo_status_dig_src_depth_qs;
-  logic es_fifo_status_dig_src_depth_re;
-  logic [2:0] es_fifo_status_hwif_depth_qs;
-  logic es_fifo_status_hwif_depth_re;
-  logic [4:0] es_fifo_status_es_depth_qs;
-  logic es_fifo_status_es_depth_re;
-  logic es_fifo_status_diag_qs;
-  logic es_fifo_status_diag_re;
-  logic [2:0] es_fdepthst_qs;
-  logic es_fdepthst_re;
-  logic [2:0] es_thresh_qs;
-  logic [2:0] es_thresh_wd;
-  logic es_thresh_we;
-  logic [15:0] es_rate_qs;
-  logic [15:0] es_rate_wd;
-  logic es_rate_we;
-  logic [3:0] es_seed_qs;
-  logic [3:0] es_seed_wd;
-  logic es_seed_we;
+  logic regen_qs;
+  logic regen_wd;
+  logic regen_we;
+  logic [7:0] rev_abi_revision_qs;
+  logic [7:0] rev_hw_revision_qs;
+  logic [7:0] rev_chip_type_qs;
+  logic [1:0] conf_enable_qs;
+  logic [1:0] conf_enable_wd;
+  logic conf_enable_we;
+  logic conf_boot_bypass_disable_qs;
+  logic conf_boot_bypass_disable_wd;
+  logic conf_boot_bypass_disable_we;
+  logic conf_repcnt_disable_qs;
+  logic conf_repcnt_disable_wd;
+  logic conf_repcnt_disable_we;
+  logic conf_adaptp_disable_qs;
+  logic conf_adaptp_disable_wd;
+  logic conf_adaptp_disable_we;
+  logic conf_bucket_disable_qs;
+  logic conf_bucket_disable_wd;
+  logic conf_bucket_disable_we;
+  logic conf_markov_disable_qs;
+  logic conf_markov_disable_wd;
+  logic conf_markov_disable_we;
+  logic conf_health_test_clr_qs;
+  logic conf_health_test_clr_wd;
+  logic conf_health_test_clr_we;
+  logic conf_rng_bit_en_qs;
+  logic conf_rng_bit_en_wd;
+  logic conf_rng_bit_en_we;
+  logic [1:0] conf_rng_bit_sel_qs;
+  logic [1:0] conf_rng_bit_sel_wd;
+  logic conf_rng_bit_sel_we;
+  logic [15:0] rate_qs;
+  logic [15:0] rate_wd;
+  logic rate_we;
+  logic entropy_control_es_route_qs;
+  logic entropy_control_es_route_wd;
+  logic entropy_control_es_route_we;
+  logic entropy_control_es_type_qs;
+  logic entropy_control_es_type_wd;
+  logic entropy_control_es_type_we;
+  logic [31:0] entropy_data_qs;
+  logic entropy_data_re;
+  logic [15:0] health_test_windows_fips_window_qs;
+  logic [15:0] health_test_windows_fips_window_wd;
+  logic health_test_windows_fips_window_we;
+  logic [15:0] health_test_windows_bypass_window_qs;
+  logic [15:0] health_test_windows_bypass_window_wd;
+  logic health_test_windows_bypass_window_we;
+  logic [15:0] repcnt_thresholds_fips_repcnt_thresh_qs;
+  logic [15:0] repcnt_thresholds_fips_repcnt_thresh_wd;
+  logic repcnt_thresholds_fips_repcnt_thresh_we;
+  logic [15:0] repcnt_thresholds_bypass_repcnt_thresh_qs;
+  logic [15:0] repcnt_thresholds_bypass_repcnt_thresh_wd;
+  logic repcnt_thresholds_bypass_repcnt_thresh_we;
+  logic [15:0] adaptp_hi_thresholds_fips_adaptp_hi_thresh_qs;
+  logic [15:0] adaptp_hi_thresholds_fips_adaptp_hi_thresh_wd;
+  logic adaptp_hi_thresholds_fips_adaptp_hi_thresh_we;
+  logic [15:0] adaptp_hi_thresholds_bypass_adaptp_hi_thresh_qs;
+  logic [15:0] adaptp_hi_thresholds_bypass_adaptp_hi_thresh_wd;
+  logic adaptp_hi_thresholds_bypass_adaptp_hi_thresh_we;
+  logic [15:0] adaptp_lo_thresholds_fips_adaptp_lo_thresh_qs;
+  logic [15:0] adaptp_lo_thresholds_fips_adaptp_lo_thresh_wd;
+  logic adaptp_lo_thresholds_fips_adaptp_lo_thresh_we;
+  logic [15:0] adaptp_lo_thresholds_bypass_adaptp_lo_thresh_qs;
+  logic [15:0] adaptp_lo_thresholds_bypass_adaptp_lo_thresh_wd;
+  logic adaptp_lo_thresholds_bypass_adaptp_lo_thresh_we;
+  logic [15:0] bucket_thresholds_fips_bucket_thresh_qs;
+  logic [15:0] bucket_thresholds_fips_bucket_thresh_wd;
+  logic bucket_thresholds_fips_bucket_thresh_we;
+  logic [15:0] bucket_thresholds_bypass_bucket_thresh_qs;
+  logic [15:0] bucket_thresholds_bypass_bucket_thresh_wd;
+  logic bucket_thresholds_bypass_bucket_thresh_we;
+  logic [15:0] markov_thresholds_fips_markov_thresh_qs;
+  logic [15:0] markov_thresholds_fips_markov_thresh_wd;
+  logic markov_thresholds_fips_markov_thresh_we;
+  logic [15:0] markov_thresholds_bypass_markov_thresh_qs;
+  logic [15:0] markov_thresholds_bypass_markov_thresh_wd;
+  logic markov_thresholds_bypass_markov_thresh_we;
+  logic [15:0] repcnt_hi_watermarks_fips_repcnt_hi_watermark_qs;
+  logic repcnt_hi_watermarks_fips_repcnt_hi_watermark_re;
+  logic [15:0] repcnt_hi_watermarks_bypass_repcnt_hi_watermark_qs;
+  logic repcnt_hi_watermarks_bypass_repcnt_hi_watermark_re;
+  logic [15:0] adaptp_hi_watermarks_fips_adaptp_hi_watermark_qs;
+  logic adaptp_hi_watermarks_fips_adaptp_hi_watermark_re;
+  logic [15:0] adaptp_hi_watermarks_bypass_adaptp_hi_watermark_qs;
+  logic adaptp_hi_watermarks_bypass_adaptp_hi_watermark_re;
+  logic [15:0] adaptp_lo_watermarks_fips_adaptp_lo_watermark_qs;
+  logic adaptp_lo_watermarks_fips_adaptp_lo_watermark_re;
+  logic [15:0] adaptp_lo_watermarks_bypass_adaptp_lo_watermark_qs;
+  logic adaptp_lo_watermarks_bypass_adaptp_lo_watermark_re;
+  logic [15:0] bucket_hi_watermarks_fips_bucket_hi_watermark_qs;
+  logic bucket_hi_watermarks_fips_bucket_hi_watermark_re;
+  logic [15:0] bucket_hi_watermarks_bypass_bucket_hi_watermark_qs;
+  logic bucket_hi_watermarks_bypass_bucket_hi_watermark_re;
+  logic [15:0] markov_hi_watermarks_fips_markov_hi_watermark_qs;
+  logic markov_hi_watermarks_fips_markov_hi_watermark_re;
+  logic [15:0] markov_hi_watermarks_bypass_markov_hi_watermark_qs;
+  logic markov_hi_watermarks_bypass_markov_hi_watermark_re;
+  logic [31:0] repcnt_total_fails_qs;
+  logic repcnt_total_fails_re;
+  logic [31:0] adaptp_hi_total_fails_qs;
+  logic adaptp_hi_total_fails_re;
+  logic [31:0] adaptp_lo_total_fails_qs;
+  logic adaptp_lo_total_fails_re;
+  logic [31:0] bucket_total_fails_qs;
+  logic bucket_total_fails_re;
+  logic [31:0] markov_total_fails_qs;
+  logic markov_total_fails_re;
+  logic [3:0] alert_threshold_qs;
+  logic [3:0] alert_threshold_wd;
+  logic alert_threshold_we;
+  logic [3:0] alert_fail_counts_any_fail_count_qs;
+  logic alert_fail_counts_any_fail_count_re;
+  logic [3:0] alert_fail_counts_repcnt_fail_count_qs;
+  logic alert_fail_counts_repcnt_fail_count_re;
+  logic [3:0] alert_fail_counts_adaptp_hi_fail_count_qs;
+  logic alert_fail_counts_adaptp_hi_fail_count_re;
+  logic [3:0] alert_fail_counts_adaptp_lo_fail_count_qs;
+  logic alert_fail_counts_adaptp_lo_fail_count_re;
+  logic [3:0] alert_fail_counts_bucket_fail_count_qs;
+  logic alert_fail_counts_bucket_fail_count_re;
+  logic [3:0] alert_fail_counts_markov_fail_count_qs;
+  logic alert_fail_counts_markov_fail_count_re;
+  logic [1:0] debug_status_entropy_fifo_depth_qs;
+  logic debug_status_entropy_fifo_depth_re;
+  logic debug_status_diag_qs;
+  logic debug_status_diag_re;
+  logic [3:0] seed_qs;
+  logic [3:0] seed_wd;
+  logic seed_we;
 
   // Register instances
   // R[intr_state]: V(False)
@@ -187,59 +257,33 @@
   );
 
 
-  //   F[es_rct_failed]: 1:1
+  //   F[es_health_test_failed]: 1:1
   prim_subreg #(
     .DW      (1),
     .SWACCESS("W1C"),
     .RESVAL  (1'h0)
-  ) u_intr_state_es_rct_failed (
+  ) u_intr_state_es_health_test_failed (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface
-    .we     (intr_state_es_rct_failed_we),
-    .wd     (intr_state_es_rct_failed_wd),
+    .we     (intr_state_es_health_test_failed_we),
+    .wd     (intr_state_es_health_test_failed_wd),
 
     // from internal hardware
-    .de     (hw2reg.intr_state.es_rct_failed.de),
-    .d      (hw2reg.intr_state.es_rct_failed.d ),
+    .de     (hw2reg.intr_state.es_health_test_failed.de),
+    .d      (hw2reg.intr_state.es_health_test_failed.d ),
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.intr_state.es_rct_failed.q ),
+    .q      (reg2hw.intr_state.es_health_test_failed.q ),
 
     // to register interface (read)
-    .qs     (intr_state_es_rct_failed_qs)
+    .qs     (intr_state_es_health_test_failed_qs)
   );
 
 
-  //   F[es_apt_failed]: 2:2
-  prim_subreg #(
-    .DW      (1),
-    .SWACCESS("W1C"),
-    .RESVAL  (1'h0)
-  ) u_intr_state_es_apt_failed (
-    .clk_i   (clk_i    ),
-    .rst_ni  (rst_ni  ),
-
-    // from register interface
-    .we     (intr_state_es_apt_failed_we),
-    .wd     (intr_state_es_apt_failed_wd),
-
-    // from internal hardware
-    .de     (hw2reg.intr_state.es_apt_failed.de),
-    .d      (hw2reg.intr_state.es_apt_failed.d ),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.intr_state.es_apt_failed.q ),
-
-    // to register interface (read)
-    .qs     (intr_state_es_apt_failed_qs)
-  );
-
-
-  //   F[es_fifo_err]: 3:3
+  //   F[es_fifo_err]: 2:2
   prim_subreg #(
     .DW      (1),
     .SWACCESS("W1C"),
@@ -293,18 +337,18 @@
   );
 
 
-  //   F[es_rct_failed]: 1:1
+  //   F[es_health_test_failed]: 1:1
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
     .RESVAL  (1'h0)
-  ) u_intr_enable_es_rct_failed (
+  ) u_intr_enable_es_health_test_failed (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface
-    .we     (intr_enable_es_rct_failed_we),
-    .wd     (intr_enable_es_rct_failed_wd),
+    .we     (intr_enable_es_health_test_failed_we),
+    .wd     (intr_enable_es_health_test_failed_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -312,40 +356,14 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.intr_enable.es_rct_failed.q ),
+    .q      (reg2hw.intr_enable.es_health_test_failed.q ),
 
     // to register interface (read)
-    .qs     (intr_enable_es_rct_failed_qs)
+    .qs     (intr_enable_es_health_test_failed_qs)
   );
 
 
-  //   F[es_apt_failed]: 2:2
-  prim_subreg #(
-    .DW      (1),
-    .SWACCESS("RW"),
-    .RESVAL  (1'h0)
-  ) u_intr_enable_es_apt_failed (
-    .clk_i   (clk_i    ),
-    .rst_ni  (rst_ni  ),
-
-    // from register interface
-    .we     (intr_enable_es_apt_failed_we),
-    .wd     (intr_enable_es_apt_failed_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0  ),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.intr_enable.es_apt_failed.q ),
-
-    // to register interface (read)
-    .qs     (intr_enable_es_apt_failed_qs)
-  );
-
-
-  //   F[es_fifo_err]: 3:3
+  //   F[es_fifo_err]: 2:2
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
@@ -388,37 +406,22 @@
   );
 
 
-  //   F[es_rct_failed]: 1:1
+  //   F[es_health_test_failed]: 1:1
   prim_subreg_ext #(
     .DW    (1)
-  ) u_intr_test_es_rct_failed (
+  ) u_intr_test_es_health_test_failed (
     .re     (1'b0),
-    .we     (intr_test_es_rct_failed_we),
-    .wd     (intr_test_es_rct_failed_wd),
+    .we     (intr_test_es_health_test_failed_we),
+    .wd     (intr_test_es_health_test_failed_wd),
     .d      ('0),
     .qre    (),
-    .qe     (reg2hw.intr_test.es_rct_failed.qe),
-    .q      (reg2hw.intr_test.es_rct_failed.q ),
+    .qe     (reg2hw.intr_test.es_health_test_failed.qe),
+    .q      (reg2hw.intr_test.es_health_test_failed.q ),
     .qs     ()
   );
 
 
-  //   F[es_apt_failed]: 2:2
-  prim_subreg_ext #(
-    .DW    (1)
-  ) u_intr_test_es_apt_failed (
-    .re     (1'b0),
-    .we     (intr_test_es_apt_failed_we),
-    .wd     (intr_test_es_apt_failed_wd),
-    .d      ('0),
-    .qre    (),
-    .qe     (reg2hw.intr_test.es_apt_failed.qe),
-    .q      (reg2hw.intr_test.es_apt_failed.q ),
-    .qs     ()
-  );
-
-
-  //   F[es_fifo_err]: 3:3
+  //   F[es_fifo_err]: 2:2
   prim_subreg_ext #(
     .DW    (1)
   ) u_intr_test_es_fifo_err (
@@ -433,19 +436,19 @@
   );
 
 
-  // R[es_regen]: V(False)
+  // R[regen]: V(False)
 
   prim_subreg #(
     .DW      (1),
     .SWACCESS("W1C"),
     .RESVAL  (1'h1)
-  ) u_es_regen (
+  ) u_regen (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface
-    .we     (es_regen_we),
-    .wd     (es_regen_wd),
+    .we     (regen_we),
+    .wd     (regen_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -453,44 +456,44 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_regen.q ),
+    .q      (reg2hw.regen.q ),
 
     // to register interface (read)
-    .qs     (es_regen_qs)
+    .qs     (regen_qs)
   );
 
 
-  // R[es_rev]: V(False)
+  // R[rev]: V(False)
 
   //   F[abi_revision]: 7:0
   // constant-only read
-  assign es_rev_abi_revision_qs = 8'h1;
+  assign rev_abi_revision_qs = 8'h3;
 
 
   //   F[hw_revision]: 15:8
   // constant-only read
-  assign es_rev_hw_revision_qs = 8'h1;
+  assign rev_hw_revision_qs = 8'h3;
 
 
   //   F[chip_type]: 23:16
   // constant-only read
-  assign es_rev_chip_type_qs = 8'h1;
+  assign rev_chip_type_qs = 8'h1;
 
 
-  // R[es_conf]: V(False)
+  // R[conf]: V(False)
 
   //   F[enable]: 1:0
   prim_subreg #(
     .DW      (2),
     .SWACCESS("RW"),
     .RESVAL  (2'h0)
-  ) u_es_conf_enable (
+  ) u_conf_enable (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_conf_enable_we & es_regen_qs),
-    .wd     (es_conf_enable_wd),
+    .we     (conf_enable_we & regen_qs),
+    .wd     (conf_enable_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -498,25 +501,25 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_conf.enable.q ),
+    .q      (reg2hw.conf.enable.q ),
 
     // to register interface (read)
-    .qs     (es_conf_enable_qs)
+    .qs     (conf_enable_qs)
   );
 
 
-  //   F[rng_src_en]: 4:4
+  //   F[boot_bypass_disable]: 3:3
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
     .RESVAL  (1'h0)
-  ) u_es_conf_rng_src_en (
+  ) u_conf_boot_bypass_disable (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_conf_rng_src_en_we & es_regen_qs),
-    .wd     (es_conf_rng_src_en_wd),
+    .we     (conf_boot_bypass_disable_we & regen_qs),
+    .wd     (conf_boot_bypass_disable_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -524,25 +527,25 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_conf.rng_src_en.q ),
+    .q      (reg2hw.conf.boot_bypass_disable.q ),
 
     // to register interface (read)
-    .qs     (es_conf_rng_src_en_qs)
+    .qs     (conf_boot_bypass_disable_qs)
   );
 
 
-  //   F[rct_en]: 5:5
+  //   F[repcnt_disable]: 4:4
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
     .RESVAL  (1'h0)
-  ) u_es_conf_rct_en (
+  ) u_conf_repcnt_disable (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_conf_rct_en_we & es_regen_qs),
-    .wd     (es_conf_rct_en_wd),
+    .we     (conf_repcnt_disable_we & regen_qs),
+    .wd     (conf_repcnt_disable_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -550,25 +553,25 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_conf.rct_en.q ),
+    .q      (reg2hw.conf.repcnt_disable.q ),
 
     // to register interface (read)
-    .qs     (es_conf_rct_en_qs)
+    .qs     (conf_repcnt_disable_qs)
   );
 
 
-  //   F[apt_en]: 6:6
+  //   F[adaptp_disable]: 5:5
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
     .RESVAL  (1'h0)
-  ) u_es_conf_apt_en (
+  ) u_conf_adaptp_disable (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_conf_apt_en_we & es_regen_qs),
-    .wd     (es_conf_apt_en_wd),
+    .we     (conf_adaptp_disable_we & regen_qs),
+    .wd     (conf_adaptp_disable_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -576,25 +579,25 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_conf.apt_en.q ),
+    .q      (reg2hw.conf.adaptp_disable.q ),
 
     // to register interface (read)
-    .qs     (es_conf_apt_en_qs)
+    .qs     (conf_adaptp_disable_qs)
   );
 
 
-  //   F[rng_bit_en]: 8:8
+  //   F[bucket_disable]: 6:6
   prim_subreg #(
     .DW      (1),
     .SWACCESS("RW"),
     .RESVAL  (1'h0)
-  ) u_es_conf_rng_bit_en (
+  ) u_conf_bucket_disable (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_conf_rng_bit_en_we & es_regen_qs),
-    .wd     (es_conf_rng_bit_en_wd),
+    .we     (conf_bucket_disable_we & regen_qs),
+    .wd     (conf_bucket_disable_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -602,25 +605,103 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_conf.rng_bit_en.q ),
+    .q      (reg2hw.conf.bucket_disable.q ),
 
     // to register interface (read)
-    .qs     (es_conf_rng_bit_en_qs)
+    .qs     (conf_bucket_disable_qs)
   );
 
 
-  //   F[rng_bit_sel]: 10:9
+  //   F[markov_disable]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_conf_markov_disable (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (conf_markov_disable_we & regen_qs),
+    .wd     (conf_markov_disable_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.conf.markov_disable.q ),
+
+    // to register interface (read)
+    .qs     (conf_markov_disable_qs)
+  );
+
+
+  //   F[health_test_clr]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_conf_health_test_clr (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (conf_health_test_clr_we & regen_qs),
+    .wd     (conf_health_test_clr_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.conf.health_test_clr.q ),
+
+    // to register interface (read)
+    .qs     (conf_health_test_clr_qs)
+  );
+
+
+  //   F[rng_bit_en]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_conf_rng_bit_en (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (conf_rng_bit_en_we & regen_qs),
+    .wd     (conf_rng_bit_en_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.conf.rng_bit_en.q ),
+
+    // to register interface (read)
+    .qs     (conf_rng_bit_en_qs)
+  );
+
+
+  //   F[rng_bit_sel]: 11:10
   prim_subreg #(
     .DW      (2),
     .SWACCESS("RW"),
     .RESVAL  (2'h0)
-  ) u_es_conf_rng_bit_sel (
+  ) u_conf_rng_bit_sel (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_conf_rng_bit_sel_we & es_regen_qs),
-    .wd     (es_conf_rng_bit_sel_wd),
+    .we     (conf_rng_bit_sel_we & regen_qs),
+    .wd     (conf_rng_bit_sel_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -628,26 +709,26 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_conf.rng_bit_sel.q ),
+    .q      (reg2hw.conf.rng_bit_sel.q ),
 
     // to register interface (read)
-    .qs     (es_conf_rng_bit_sel_qs)
+    .qs     (conf_rng_bit_sel_qs)
   );
 
 
-  // R[es_rct_health]: V(False)
+  // R[rate]: V(False)
 
   prim_subreg #(
     .DW      (16),
     .SWACCESS("RW"),
-    .RESVAL  (16'hb)
-  ) u_es_rct_health (
+    .RESVAL  (16'h7d0)
+  ) u_rate (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface (qualified with register enable)
-    .we     (es_rct_health_we & es_regen_qs),
-    .wd     (es_rct_health_wd),
+    // from register interface
+    .we     (rate_we),
+    .wd     (rate_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -655,27 +736,27 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_rct_health.q ),
+    .q      (reg2hw.rate.q ),
 
     // to register interface (read)
-    .qs     (es_rct_health_qs)
+    .qs     (rate_qs)
   );
 
 
-  // R[es_apt_health]: V(False)
+  // R[entropy_control]: V(False)
 
-  //   F[apt_max]: 15:0
+  //   F[es_route]: 0:0
   prim_subreg #(
-    .DW      (16),
+    .DW      (1),
     .SWACCESS("RW"),
-    .RESVAL  (16'h298)
-  ) u_es_apt_health_apt_max (
+    .RESVAL  (1'h0)
+  ) u_entropy_control_es_route (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_apt_health_apt_max_we & es_regen_qs),
-    .wd     (es_apt_health_apt_max_wd),
+    .we     (entropy_control_es_route_we & regen_qs),
+    .wd     (entropy_control_es_route_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -683,25 +764,25 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_apt_health.apt_max.q ),
+    .q      (reg2hw.entropy_control.es_route.q ),
 
     // to register interface (read)
-    .qs     (es_apt_health_apt_max_qs)
+    .qs     (entropy_control_es_route_qs)
   );
 
 
-  //   F[apt_win]: 31:16
+  //   F[es_type]: 1:1
   prim_subreg #(
-    .DW      (16),
+    .DW      (1),
     .SWACCESS("RW"),
-    .RESVAL  (16'h400)
-  ) u_es_apt_health_apt_win (
+    .RESVAL  (1'h0)
+  ) u_entropy_control_es_type (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_apt_health_apt_win_we & es_regen_qs),
-    .wd     (es_apt_health_apt_win_wd),
+    .we     (entropy_control_es_type_we & regen_qs),
+    .wd     (entropy_control_es_type_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -709,174 +790,757 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_apt_health.apt_win.q ),
+    .q      (reg2hw.entropy_control.es_type.q ),
 
     // to register interface (read)
-    .qs     (es_apt_health_apt_win_qs)
+    .qs     (entropy_control_es_type_qs)
   );
 
 
-  // R[es_entropy]: V(True)
+  // R[entropy_data]: V(True)
 
   prim_subreg_ext #(
     .DW    (32)
-  ) u_es_entropy (
-    .re     (es_entropy_re),
+  ) u_entropy_data (
+    .re     (entropy_data_re),
     .we     (1'b0),
     .wd     ('0),
-    .d      (hw2reg.es_entropy.d),
-    .qre    (reg2hw.es_entropy.re),
+    .d      (hw2reg.entropy_data.d),
+    .qre    (reg2hw.entropy_data.re),
     .qe     (),
-    .q      (reg2hw.es_entropy.q ),
-    .qs     (es_entropy_qs)
+    .q      (reg2hw.entropy_data.q ),
+    .qs     (entropy_data_qs)
   );
 
 
-  // R[es_fifo_status]: V(True)
+  // R[health_test_windows]: V(False)
 
-  //   F[dig_src_depth]: 2:0
-  prim_subreg_ext #(
-    .DW    (3)
-  ) u_es_fifo_status_dig_src_depth (
-    .re     (es_fifo_status_dig_src_depth_re),
-    .we     (1'b0),
-    .wd     ('0),
-    .d      (hw2reg.es_fifo_status.dig_src_depth.d),
-    .qre    (),
+  //   F[fips_window]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h100)
+  ) u_health_test_windows_fips_window (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (health_test_windows_fips_window_we & regen_qs),
+    .wd     (health_test_windows_fips_window_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
     .qe     (),
-    .q      (),
-    .qs     (es_fifo_status_dig_src_depth_qs)
+    .q      (reg2hw.health_test_windows.fips_window.q ),
+
+    // to register interface (read)
+    .qs     (health_test_windows_fips_window_qs)
   );
 
 
-  //   F[hwif_depth]: 6:4
-  prim_subreg_ext #(
-    .DW    (3)
-  ) u_es_fifo_status_hwif_depth (
-    .re     (es_fifo_status_hwif_depth_re),
-    .we     (1'b0),
-    .wd     ('0),
-    .d      (hw2reg.es_fifo_status.hwif_depth.d),
-    .qre    (),
+  //   F[bypass_window]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h60)
+  ) u_health_test_windows_bypass_window (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (health_test_windows_bypass_window_we & regen_qs),
+    .wd     (health_test_windows_bypass_window_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
     .qe     (),
-    .q      (),
-    .qs     (es_fifo_status_hwif_depth_qs)
+    .q      (reg2hw.health_test_windows.bypass_window.q ),
+
+    // to register interface (read)
+    .qs     (health_test_windows_bypass_window_qs)
   );
 
 
-  //   F[es_depth]: 16:12
+  // R[repcnt_thresholds]: V(False)
+
+  //   F[fips_repcnt_thresh]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h20)
+  ) u_repcnt_thresholds_fips_repcnt_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (repcnt_thresholds_fips_repcnt_thresh_we & regen_qs),
+    .wd     (repcnt_thresholds_fips_repcnt_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.repcnt_thresholds.fips_repcnt_thresh.q ),
+
+    // to register interface (read)
+    .qs     (repcnt_thresholds_fips_repcnt_thresh_qs)
+  );
+
+
+  //   F[bypass_repcnt_thresh]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h20)
+  ) u_repcnt_thresholds_bypass_repcnt_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (repcnt_thresholds_bypass_repcnt_thresh_we & regen_qs),
+    .wd     (repcnt_thresholds_bypass_repcnt_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.repcnt_thresholds.bypass_repcnt_thresh.q ),
+
+    // to register interface (read)
+    .qs     (repcnt_thresholds_bypass_repcnt_thresh_qs)
+  );
+
+
+  // R[adaptp_hi_thresholds]: V(False)
+
+  //   F[fips_adaptp_hi_thresh]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h256)
+  ) u_adaptp_hi_thresholds_fips_adaptp_hi_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (adaptp_hi_thresholds_fips_adaptp_hi_thresh_we & regen_qs),
+    .wd     (adaptp_hi_thresholds_fips_adaptp_hi_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.adaptp_hi_thresholds.fips_adaptp_hi_thresh.q ),
+
+    // to register interface (read)
+    .qs     (adaptp_hi_thresholds_fips_adaptp_hi_thresh_qs)
+  );
+
+
+  //   F[bypass_adaptp_hi_thresh]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'he0)
+  ) u_adaptp_hi_thresholds_bypass_adaptp_hi_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (adaptp_hi_thresholds_bypass_adaptp_hi_thresh_we & regen_qs),
+    .wd     (adaptp_hi_thresholds_bypass_adaptp_hi_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.adaptp_hi_thresholds.bypass_adaptp_hi_thresh.q ),
+
+    // to register interface (read)
+    .qs     (adaptp_hi_thresholds_bypass_adaptp_hi_thresh_qs)
+  );
+
+
+  // R[adaptp_lo_thresholds]: V(False)
+
+  //   F[fips_adaptp_lo_thresh]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h1aa)
+  ) u_adaptp_lo_thresholds_fips_adaptp_lo_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (adaptp_lo_thresholds_fips_adaptp_lo_thresh_we & regen_qs),
+    .wd     (adaptp_lo_thresholds_fips_adaptp_lo_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.adaptp_lo_thresholds.fips_adaptp_lo_thresh.q ),
+
+    // to register interface (read)
+    .qs     (adaptp_lo_thresholds_fips_adaptp_lo_thresh_qs)
+  );
+
+
+  //   F[bypass_adaptp_lo_thresh]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'ha0)
+  ) u_adaptp_lo_thresholds_bypass_adaptp_lo_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (adaptp_lo_thresholds_bypass_adaptp_lo_thresh_we & regen_qs),
+    .wd     (adaptp_lo_thresholds_bypass_adaptp_lo_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.adaptp_lo_thresholds.bypass_adaptp_lo_thresh.q ),
+
+    // to register interface (read)
+    .qs     (adaptp_lo_thresholds_bypass_adaptp_lo_thresh_qs)
+  );
+
+
+  // R[bucket_thresholds]: V(False)
+
+  //   F[fips_bucket_thresh]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h20)
+  ) u_bucket_thresholds_fips_bucket_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (bucket_thresholds_fips_bucket_thresh_we & regen_qs),
+    .wd     (bucket_thresholds_fips_bucket_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.bucket_thresholds.fips_bucket_thresh.q ),
+
+    // to register interface (read)
+    .qs     (bucket_thresholds_fips_bucket_thresh_qs)
+  );
+
+
+  //   F[bypass_bucket_thresh]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h20)
+  ) u_bucket_thresholds_bypass_bucket_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (bucket_thresholds_bypass_bucket_thresh_we & regen_qs),
+    .wd     (bucket_thresholds_bypass_bucket_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.bucket_thresholds.bypass_bucket_thresh.q ),
+
+    // to register interface (read)
+    .qs     (bucket_thresholds_bypass_bucket_thresh_qs)
+  );
+
+
+  // R[markov_thresholds]: V(False)
+
+  //   F[fips_markov_thresh]: 15:0
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h100)
+  ) u_markov_thresholds_fips_markov_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (markov_thresholds_fips_markov_thresh_we & regen_qs),
+    .wd     (markov_thresholds_fips_markov_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.markov_thresholds.fips_markov_thresh.q ),
+
+    // to register interface (read)
+    .qs     (markov_thresholds_fips_markov_thresh_qs)
+  );
+
+
+  //   F[bypass_markov_thresh]: 31:16
+  prim_subreg #(
+    .DW      (16),
+    .SWACCESS("RW"),
+    .RESVAL  (16'h60)
+  ) u_markov_thresholds_bypass_markov_thresh (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (markov_thresholds_bypass_markov_thresh_we & regen_qs),
+    .wd     (markov_thresholds_bypass_markov_thresh_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.markov_thresholds.bypass_markov_thresh.q ),
+
+    // to register interface (read)
+    .qs     (markov_thresholds_bypass_markov_thresh_qs)
+  );
+
+
+  // R[repcnt_hi_watermarks]: V(True)
+
+  //   F[fips_repcnt_hi_watermark]: 15:0
   prim_subreg_ext #(
-    .DW    (5)
-  ) u_es_fifo_status_es_depth (
-    .re     (es_fifo_status_es_depth_re),
+    .DW    (16)
+  ) u_repcnt_hi_watermarks_fips_repcnt_hi_watermark (
+    .re     (repcnt_hi_watermarks_fips_repcnt_hi_watermark_re),
     .we     (1'b0),
     .wd     ('0),
-    .d      (hw2reg.es_fifo_status.es_depth.d),
+    .d      (hw2reg.repcnt_hi_watermarks.fips_repcnt_hi_watermark.d),
     .qre    (),
     .qe     (),
     .q      (),
-    .qs     (es_fifo_status_es_depth_qs)
+    .qs     (repcnt_hi_watermarks_fips_repcnt_hi_watermark_qs)
+  );
+
+
+  //   F[bypass_repcnt_hi_watermark]: 31:16
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_repcnt_hi_watermarks_bypass_repcnt_hi_watermark (
+    .re     (repcnt_hi_watermarks_bypass_repcnt_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.repcnt_hi_watermarks.bypass_repcnt_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (repcnt_hi_watermarks_bypass_repcnt_hi_watermark_qs)
+  );
+
+
+  // R[adaptp_hi_watermarks]: V(True)
+
+  //   F[fips_adaptp_hi_watermark]: 15:0
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_adaptp_hi_watermarks_fips_adaptp_hi_watermark (
+    .re     (adaptp_hi_watermarks_fips_adaptp_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.adaptp_hi_watermarks.fips_adaptp_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (adaptp_hi_watermarks_fips_adaptp_hi_watermark_qs)
+  );
+
+
+  //   F[bypass_adaptp_hi_watermark]: 31:16
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_adaptp_hi_watermarks_bypass_adaptp_hi_watermark (
+    .re     (adaptp_hi_watermarks_bypass_adaptp_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.adaptp_hi_watermarks.bypass_adaptp_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (adaptp_hi_watermarks_bypass_adaptp_hi_watermark_qs)
+  );
+
+
+  // R[adaptp_lo_watermarks]: V(True)
+
+  //   F[fips_adaptp_lo_watermark]: 15:0
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_adaptp_lo_watermarks_fips_adaptp_lo_watermark (
+    .re     (adaptp_lo_watermarks_fips_adaptp_lo_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.adaptp_lo_watermarks.fips_adaptp_lo_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (adaptp_lo_watermarks_fips_adaptp_lo_watermark_qs)
+  );
+
+
+  //   F[bypass_adaptp_lo_watermark]: 31:16
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_adaptp_lo_watermarks_bypass_adaptp_lo_watermark (
+    .re     (adaptp_lo_watermarks_bypass_adaptp_lo_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.adaptp_lo_watermarks.bypass_adaptp_lo_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (adaptp_lo_watermarks_bypass_adaptp_lo_watermark_qs)
+  );
+
+
+  // R[bucket_hi_watermarks]: V(True)
+
+  //   F[fips_bucket_hi_watermark]: 15:0
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_bucket_hi_watermarks_fips_bucket_hi_watermark (
+    .re     (bucket_hi_watermarks_fips_bucket_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.bucket_hi_watermarks.fips_bucket_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (bucket_hi_watermarks_fips_bucket_hi_watermark_qs)
+  );
+
+
+  //   F[bypass_bucket_hi_watermark]: 31:16
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_bucket_hi_watermarks_bypass_bucket_hi_watermark (
+    .re     (bucket_hi_watermarks_bypass_bucket_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.bucket_hi_watermarks.bypass_bucket_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (bucket_hi_watermarks_bypass_bucket_hi_watermark_qs)
+  );
+
+
+  // R[markov_hi_watermarks]: V(True)
+
+  //   F[fips_markov_hi_watermark]: 15:0
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_markov_hi_watermarks_fips_markov_hi_watermark (
+    .re     (markov_hi_watermarks_fips_markov_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.markov_hi_watermarks.fips_markov_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (markov_hi_watermarks_fips_markov_hi_watermark_qs)
+  );
+
+
+  //   F[bypass_markov_hi_watermark]: 31:16
+  prim_subreg_ext #(
+    .DW    (16)
+  ) u_markov_hi_watermarks_bypass_markov_hi_watermark (
+    .re     (markov_hi_watermarks_bypass_markov_hi_watermark_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.markov_hi_watermarks.bypass_markov_hi_watermark.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (markov_hi_watermarks_bypass_markov_hi_watermark_qs)
+  );
+
+
+  // R[repcnt_total_fails]: V(True)
+
+  prim_subreg_ext #(
+    .DW    (32)
+  ) u_repcnt_total_fails (
+    .re     (repcnt_total_fails_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.repcnt_total_fails.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (repcnt_total_fails_qs)
+  );
+
+
+  // R[adaptp_hi_total_fails]: V(True)
+
+  prim_subreg_ext #(
+    .DW    (32)
+  ) u_adaptp_hi_total_fails (
+    .re     (adaptp_hi_total_fails_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.adaptp_hi_total_fails.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (adaptp_hi_total_fails_qs)
+  );
+
+
+  // R[adaptp_lo_total_fails]: V(True)
+
+  prim_subreg_ext #(
+    .DW    (32)
+  ) u_adaptp_lo_total_fails (
+    .re     (adaptp_lo_total_fails_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.adaptp_lo_total_fails.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (adaptp_lo_total_fails_qs)
+  );
+
+
+  // R[bucket_total_fails]: V(True)
+
+  prim_subreg_ext #(
+    .DW    (32)
+  ) u_bucket_total_fails (
+    .re     (bucket_total_fails_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.bucket_total_fails.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (bucket_total_fails_qs)
+  );
+
+
+  // R[markov_total_fails]: V(True)
+
+  prim_subreg_ext #(
+    .DW    (32)
+  ) u_markov_total_fails (
+    .re     (markov_total_fails_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.markov_total_fails.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (markov_total_fails_qs)
+  );
+
+
+  // R[alert_threshold]: V(False)
+
+  prim_subreg #(
+    .DW      (4),
+    .SWACCESS("RW"),
+    .RESVAL  (4'h2)
+  ) u_alert_threshold (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface (qualified with register enable)
+    .we     (alert_threshold_we & regen_qs),
+    .wd     (alert_threshold_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.alert_threshold.q ),
+
+    // to register interface (read)
+    .qs     (alert_threshold_qs)
+  );
+
+
+  // R[alert_fail_counts]: V(True)
+
+  //   F[any_fail_count]: 3:0
+  prim_subreg_ext #(
+    .DW    (4)
+  ) u_alert_fail_counts_any_fail_count (
+    .re     (alert_fail_counts_any_fail_count_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.alert_fail_counts.any_fail_count.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (alert_fail_counts_any_fail_count_qs)
+  );
+
+
+  //   F[repcnt_fail_count]: 7:4
+  prim_subreg_ext #(
+    .DW    (4)
+  ) u_alert_fail_counts_repcnt_fail_count (
+    .re     (alert_fail_counts_repcnt_fail_count_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.alert_fail_counts.repcnt_fail_count.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (alert_fail_counts_repcnt_fail_count_qs)
+  );
+
+
+  //   F[adaptp_hi_fail_count]: 11:8
+  prim_subreg_ext #(
+    .DW    (4)
+  ) u_alert_fail_counts_adaptp_hi_fail_count (
+    .re     (alert_fail_counts_adaptp_hi_fail_count_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.alert_fail_counts.adaptp_hi_fail_count.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (alert_fail_counts_adaptp_hi_fail_count_qs)
+  );
+
+
+  //   F[adaptp_lo_fail_count]: 15:12
+  prim_subreg_ext #(
+    .DW    (4)
+  ) u_alert_fail_counts_adaptp_lo_fail_count (
+    .re     (alert_fail_counts_adaptp_lo_fail_count_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.alert_fail_counts.adaptp_lo_fail_count.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (alert_fail_counts_adaptp_lo_fail_count_qs)
+  );
+
+
+  //   F[bucket_fail_count]: 19:16
+  prim_subreg_ext #(
+    .DW    (4)
+  ) u_alert_fail_counts_bucket_fail_count (
+    .re     (alert_fail_counts_bucket_fail_count_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.alert_fail_counts.bucket_fail_count.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (alert_fail_counts_bucket_fail_count_qs)
+  );
+
+
+  //   F[markov_fail_count]: 23:20
+  prim_subreg_ext #(
+    .DW    (4)
+  ) u_alert_fail_counts_markov_fail_count (
+    .re     (alert_fail_counts_markov_fail_count_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.alert_fail_counts.markov_fail_count.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (alert_fail_counts_markov_fail_count_qs)
+  );
+
+
+  // R[debug_status]: V(True)
+
+  //   F[entropy_fifo_depth]: 1:0
+  prim_subreg_ext #(
+    .DW    (2)
+  ) u_debug_status_entropy_fifo_depth (
+    .re     (debug_status_entropy_fifo_depth_re),
+    .we     (1'b0),
+    .wd     ('0),
+    .d      (hw2reg.debug_status.entropy_fifo_depth.d),
+    .qre    (),
+    .qe     (),
+    .q      (),
+    .qs     (debug_status_entropy_fifo_depth_qs)
   );
 
 
   //   F[diag]: 31:31
   prim_subreg_ext #(
     .DW    (1)
-  ) u_es_fifo_status_diag (
-    .re     (es_fifo_status_diag_re),
+  ) u_debug_status_diag (
+    .re     (debug_status_diag_re),
     .we     (1'b0),
     .wd     ('0),
-    .d      (hw2reg.es_fifo_status.diag.d),
+    .d      (hw2reg.debug_status.diag.d),
     .qre    (),
     .qe     (),
     .q      (),
-    .qs     (es_fifo_status_diag_qs)
+    .qs     (debug_status_diag_qs)
   );
 
 
-  // R[es_fdepthst]: V(True)
-
-  prim_subreg_ext #(
-    .DW    (3)
-  ) u_es_fdepthst (
-    .re     (es_fdepthst_re),
-    .we     (1'b0),
-    .wd     ('0),
-    .d      (hw2reg.es_fdepthst.d),
-    .qre    (),
-    .qe     (),
-    .q      (),
-    .qs     (es_fdepthst_qs)
-  );
-
-
-  // R[es_thresh]: V(False)
-
-  prim_subreg #(
-    .DW      (3),
-    .SWACCESS("RW"),
-    .RESVAL  (3'h0)
-  ) u_es_thresh (
-    .clk_i   (clk_i    ),
-    .rst_ni  (rst_ni  ),
-
-    // from register interface
-    .we     (es_thresh_we),
-    .wd     (es_thresh_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0  ),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.es_thresh.q ),
-
-    // to register interface (read)
-    .qs     (es_thresh_qs)
-  );
-
-
-  // R[es_rate]: V(False)
-
-  prim_subreg #(
-    .DW      (16),
-    .SWACCESS("RW"),
-    .RESVAL  (16'h4)
-  ) u_es_rate (
-    .clk_i   (clk_i    ),
-    .rst_ni  (rst_ni  ),
-
-    // from register interface
-    .we     (es_rate_we),
-    .wd     (es_rate_wd),
-
-    // from internal hardware
-    .de     (1'b0),
-    .d      ('0  ),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.es_rate.q ),
-
-    // to register interface (read)
-    .qs     (es_rate_qs)
-  );
-
-
-  // R[es_seed]: V(False)
+  // R[seed]: V(False)
 
   prim_subreg #(
     .DW      (4),
     .SWACCESS("RW"),
     .RESVAL  (4'hb)
-  ) u_es_seed (
+  ) u_seed (
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
     // from register interface (qualified with register enable)
-    .we     (es_seed_we & es_regen_qs),
-    .wd     (es_seed_wd),
+    .we     (seed_we & regen_qs),
+    .wd     (seed_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -884,32 +1548,47 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.es_seed.q ),
+    .q      (reg2hw.seed.q ),
 
     // to register interface (read)
-    .qs     (es_seed_qs)
+    .qs     (seed_qs)
   );
 
 
 
 
-  logic [13:0] addr_hit;
+  logic [28:0] addr_hit;
   always_comb begin
     addr_hit = '0;
     addr_hit[ 0] = (reg_addr == ENTROPY_SRC_INTR_STATE_OFFSET);
     addr_hit[ 1] = (reg_addr == ENTROPY_SRC_INTR_ENABLE_OFFSET);
     addr_hit[ 2] = (reg_addr == ENTROPY_SRC_INTR_TEST_OFFSET);
-    addr_hit[ 3] = (reg_addr == ENTROPY_SRC_ES_REGEN_OFFSET);
-    addr_hit[ 4] = (reg_addr == ENTROPY_SRC_ES_REV_OFFSET);
-    addr_hit[ 5] = (reg_addr == ENTROPY_SRC_ES_CONF_OFFSET);
-    addr_hit[ 6] = (reg_addr == ENTROPY_SRC_ES_RCT_HEALTH_OFFSET);
-    addr_hit[ 7] = (reg_addr == ENTROPY_SRC_ES_APT_HEALTH_OFFSET);
-    addr_hit[ 8] = (reg_addr == ENTROPY_SRC_ES_ENTROPY_OFFSET);
-    addr_hit[ 9] = (reg_addr == ENTROPY_SRC_ES_FIFO_STATUS_OFFSET);
-    addr_hit[10] = (reg_addr == ENTROPY_SRC_ES_FDEPTHST_OFFSET);
-    addr_hit[11] = (reg_addr == ENTROPY_SRC_ES_THRESH_OFFSET);
-    addr_hit[12] = (reg_addr == ENTROPY_SRC_ES_RATE_OFFSET);
-    addr_hit[13] = (reg_addr == ENTROPY_SRC_ES_SEED_OFFSET);
+    addr_hit[ 3] = (reg_addr == ENTROPY_SRC_REGEN_OFFSET);
+    addr_hit[ 4] = (reg_addr == ENTROPY_SRC_REV_OFFSET);
+    addr_hit[ 5] = (reg_addr == ENTROPY_SRC_CONF_OFFSET);
+    addr_hit[ 6] = (reg_addr == ENTROPY_SRC_RATE_OFFSET);
+    addr_hit[ 7] = (reg_addr == ENTROPY_SRC_ENTROPY_CONTROL_OFFSET);
+    addr_hit[ 8] = (reg_addr == ENTROPY_SRC_ENTROPY_DATA_OFFSET);
+    addr_hit[ 9] = (reg_addr == ENTROPY_SRC_HEALTH_TEST_WINDOWS_OFFSET);
+    addr_hit[10] = (reg_addr == ENTROPY_SRC_REPCNT_THRESHOLDS_OFFSET);
+    addr_hit[11] = (reg_addr == ENTROPY_SRC_ADAPTP_HI_THRESHOLDS_OFFSET);
+    addr_hit[12] = (reg_addr == ENTROPY_SRC_ADAPTP_LO_THRESHOLDS_OFFSET);
+    addr_hit[13] = (reg_addr == ENTROPY_SRC_BUCKET_THRESHOLDS_OFFSET);
+    addr_hit[14] = (reg_addr == ENTROPY_SRC_MARKOV_THRESHOLDS_OFFSET);
+    addr_hit[15] = (reg_addr == ENTROPY_SRC_REPCNT_HI_WATERMARKS_OFFSET);
+    addr_hit[16] = (reg_addr == ENTROPY_SRC_ADAPTP_HI_WATERMARKS_OFFSET);
+    addr_hit[17] = (reg_addr == ENTROPY_SRC_ADAPTP_LO_WATERMARKS_OFFSET);
+    addr_hit[18] = (reg_addr == ENTROPY_SRC_BUCKET_HI_WATERMARKS_OFFSET);
+    addr_hit[19] = (reg_addr == ENTROPY_SRC_MARKOV_HI_WATERMARKS_OFFSET);
+    addr_hit[20] = (reg_addr == ENTROPY_SRC_REPCNT_TOTAL_FAILS_OFFSET);
+    addr_hit[21] = (reg_addr == ENTROPY_SRC_ADAPTP_HI_TOTAL_FAILS_OFFSET);
+    addr_hit[22] = (reg_addr == ENTROPY_SRC_ADAPTP_LO_TOTAL_FAILS_OFFSET);
+    addr_hit[23] = (reg_addr == ENTROPY_SRC_BUCKET_TOTAL_FAILS_OFFSET);
+    addr_hit[24] = (reg_addr == ENTROPY_SRC_MARKOV_TOTAL_FAILS_OFFSET);
+    addr_hit[25] = (reg_addr == ENTROPY_SRC_ALERT_THRESHOLD_OFFSET);
+    addr_hit[26] = (reg_addr == ENTROPY_SRC_ALERT_FAIL_COUNTS_OFFSET);
+    addr_hit[27] = (reg_addr == ENTROPY_SRC_DEBUG_STATUS_OFFSET);
+    addr_hit[28] = (reg_addr == ENTROPY_SRC_SEED_OFFSET);
   end
 
   assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -931,97 +1610,181 @@
     if (addr_hit[11] && reg_we && (ENTROPY_SRC_PERMIT[11] != (ENTROPY_SRC_PERMIT[11] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[12] && reg_we && (ENTROPY_SRC_PERMIT[12] != (ENTROPY_SRC_PERMIT[12] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[13] && reg_we && (ENTROPY_SRC_PERMIT[13] != (ENTROPY_SRC_PERMIT[13] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[14] && reg_we && (ENTROPY_SRC_PERMIT[14] != (ENTROPY_SRC_PERMIT[14] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[15] && reg_we && (ENTROPY_SRC_PERMIT[15] != (ENTROPY_SRC_PERMIT[15] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[16] && reg_we && (ENTROPY_SRC_PERMIT[16] != (ENTROPY_SRC_PERMIT[16] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[17] && reg_we && (ENTROPY_SRC_PERMIT[17] != (ENTROPY_SRC_PERMIT[17] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[18] && reg_we && (ENTROPY_SRC_PERMIT[18] != (ENTROPY_SRC_PERMIT[18] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[19] && reg_we && (ENTROPY_SRC_PERMIT[19] != (ENTROPY_SRC_PERMIT[19] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[20] && reg_we && (ENTROPY_SRC_PERMIT[20] != (ENTROPY_SRC_PERMIT[20] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[21] && reg_we && (ENTROPY_SRC_PERMIT[21] != (ENTROPY_SRC_PERMIT[21] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[22] && reg_we && (ENTROPY_SRC_PERMIT[22] != (ENTROPY_SRC_PERMIT[22] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[23] && reg_we && (ENTROPY_SRC_PERMIT[23] != (ENTROPY_SRC_PERMIT[23] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[24] && reg_we && (ENTROPY_SRC_PERMIT[24] != (ENTROPY_SRC_PERMIT[24] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[25] && reg_we && (ENTROPY_SRC_PERMIT[25] != (ENTROPY_SRC_PERMIT[25] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[26] && reg_we && (ENTROPY_SRC_PERMIT[26] != (ENTROPY_SRC_PERMIT[26] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[27] && reg_we && (ENTROPY_SRC_PERMIT[27] != (ENTROPY_SRC_PERMIT[27] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[28] && reg_we && (ENTROPY_SRC_PERMIT[28] != (ENTROPY_SRC_PERMIT[28] & reg_be))) wr_err = 1'b1 ;
   end
 
   assign intr_state_es_entropy_valid_we = addr_hit[0] & reg_we & ~wr_err;
   assign intr_state_es_entropy_valid_wd = reg_wdata[0];
 
-  assign intr_state_es_rct_failed_we = addr_hit[0] & reg_we & ~wr_err;
-  assign intr_state_es_rct_failed_wd = reg_wdata[1];
-
-  assign intr_state_es_apt_failed_we = addr_hit[0] & reg_we & ~wr_err;
-  assign intr_state_es_apt_failed_wd = reg_wdata[2];
+  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[3];
+  assign intr_state_es_fifo_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];
 
-  assign intr_enable_es_rct_failed_we = addr_hit[1] & reg_we & ~wr_err;
-  assign intr_enable_es_rct_failed_wd = reg_wdata[1];
-
-  assign intr_enable_es_apt_failed_we = addr_hit[1] & reg_we & ~wr_err;
-  assign intr_enable_es_apt_failed_wd = reg_wdata[2];
+  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[3];
+  assign intr_enable_es_fifo_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];
 
-  assign intr_test_es_rct_failed_we = addr_hit[2] & reg_we & ~wr_err;
-  assign intr_test_es_rct_failed_wd = reg_wdata[1];
-
-  assign intr_test_es_apt_failed_we = addr_hit[2] & reg_we & ~wr_err;
-  assign intr_test_es_apt_failed_wd = reg_wdata[2];
+  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[3];
+  assign intr_test_es_fifo_err_wd = reg_wdata[2];
 
-  assign es_regen_we = addr_hit[3] & reg_we & ~wr_err;
-  assign es_regen_wd = reg_wdata[0];
+  assign regen_we = addr_hit[3] & reg_we & ~wr_err;
+  assign regen_wd = reg_wdata[0];
 
 
 
 
-  assign es_conf_enable_we = addr_hit[5] & reg_we & ~wr_err;
-  assign es_conf_enable_wd = reg_wdata[1:0];
+  assign conf_enable_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_enable_wd = reg_wdata[1:0];
 
-  assign es_conf_rng_src_en_we = addr_hit[5] & reg_we & ~wr_err;
-  assign es_conf_rng_src_en_wd = reg_wdata[4];
+  assign conf_boot_bypass_disable_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_boot_bypass_disable_wd = reg_wdata[3];
 
-  assign es_conf_rct_en_we = addr_hit[5] & reg_we & ~wr_err;
-  assign es_conf_rct_en_wd = reg_wdata[5];
+  assign conf_repcnt_disable_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_repcnt_disable_wd = reg_wdata[4];
 
-  assign es_conf_apt_en_we = addr_hit[5] & reg_we & ~wr_err;
-  assign es_conf_apt_en_wd = reg_wdata[6];
+  assign conf_adaptp_disable_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_adaptp_disable_wd = reg_wdata[5];
 
-  assign es_conf_rng_bit_en_we = addr_hit[5] & reg_we & ~wr_err;
-  assign es_conf_rng_bit_en_wd = reg_wdata[8];
+  assign conf_bucket_disable_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_bucket_disable_wd = reg_wdata[6];
 
-  assign es_conf_rng_bit_sel_we = addr_hit[5] & reg_we & ~wr_err;
-  assign es_conf_rng_bit_sel_wd = reg_wdata[10:9];
+  assign conf_markov_disable_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_markov_disable_wd = reg_wdata[7];
 
-  assign es_rct_health_we = addr_hit[6] & reg_we & ~wr_err;
-  assign es_rct_health_wd = reg_wdata[15:0];
+  assign conf_health_test_clr_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_health_test_clr_wd = reg_wdata[8];
 
-  assign es_apt_health_apt_max_we = addr_hit[7] & reg_we & ~wr_err;
-  assign es_apt_health_apt_max_wd = reg_wdata[15:0];
+  assign conf_rng_bit_en_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_rng_bit_en_wd = reg_wdata[9];
 
-  assign es_apt_health_apt_win_we = addr_hit[7] & reg_we & ~wr_err;
-  assign es_apt_health_apt_win_wd = reg_wdata[31:16];
+  assign conf_rng_bit_sel_we = addr_hit[5] & reg_we & ~wr_err;
+  assign conf_rng_bit_sel_wd = reg_wdata[11:10];
 
-  assign es_entropy_re = addr_hit[8] && reg_re;
+  assign rate_we = addr_hit[6] & reg_we & ~wr_err;
+  assign rate_wd = reg_wdata[15:0];
 
-  assign es_fifo_status_dig_src_depth_re = addr_hit[9] && reg_re;
+  assign entropy_control_es_route_we = addr_hit[7] & reg_we & ~wr_err;
+  assign entropy_control_es_route_wd = reg_wdata[0];
 
-  assign es_fifo_status_hwif_depth_re = addr_hit[9] && reg_re;
+  assign entropy_control_es_type_we = addr_hit[7] & reg_we & ~wr_err;
+  assign entropy_control_es_type_wd = reg_wdata[1];
 
-  assign es_fifo_status_es_depth_re = addr_hit[9] && reg_re;
+  assign entropy_data_re = addr_hit[8] && reg_re;
 
-  assign es_fifo_status_diag_re = addr_hit[9] && reg_re;
+  assign health_test_windows_fips_window_we = addr_hit[9] & reg_we & ~wr_err;
+  assign health_test_windows_fips_window_wd = reg_wdata[15:0];
 
-  assign es_fdepthst_re = addr_hit[10] && reg_re;
+  assign health_test_windows_bypass_window_we = addr_hit[9] & reg_we & ~wr_err;
+  assign health_test_windows_bypass_window_wd = reg_wdata[31:16];
 
-  assign es_thresh_we = addr_hit[11] & reg_we & ~wr_err;
-  assign es_thresh_wd = reg_wdata[2:0];
+  assign repcnt_thresholds_fips_repcnt_thresh_we = addr_hit[10] & reg_we & ~wr_err;
+  assign repcnt_thresholds_fips_repcnt_thresh_wd = reg_wdata[15:0];
 
-  assign es_rate_we = addr_hit[12] & reg_we & ~wr_err;
-  assign es_rate_wd = reg_wdata[15:0];
+  assign repcnt_thresholds_bypass_repcnt_thresh_we = addr_hit[10] & reg_we & ~wr_err;
+  assign repcnt_thresholds_bypass_repcnt_thresh_wd = reg_wdata[31:16];
 
-  assign es_seed_we = addr_hit[13] & reg_we & ~wr_err;
-  assign es_seed_wd = reg_wdata[3:0];
+  assign adaptp_hi_thresholds_fips_adaptp_hi_thresh_we = addr_hit[11] & reg_we & ~wr_err;
+  assign adaptp_hi_thresholds_fips_adaptp_hi_thresh_wd = reg_wdata[15:0];
+
+  assign adaptp_hi_thresholds_bypass_adaptp_hi_thresh_we = addr_hit[11] & reg_we & ~wr_err;
+  assign adaptp_hi_thresholds_bypass_adaptp_hi_thresh_wd = reg_wdata[31:16];
+
+  assign adaptp_lo_thresholds_fips_adaptp_lo_thresh_we = addr_hit[12] & reg_we & ~wr_err;
+  assign adaptp_lo_thresholds_fips_adaptp_lo_thresh_wd = reg_wdata[15:0];
+
+  assign adaptp_lo_thresholds_bypass_adaptp_lo_thresh_we = addr_hit[12] & reg_we & ~wr_err;
+  assign adaptp_lo_thresholds_bypass_adaptp_lo_thresh_wd = reg_wdata[31:16];
+
+  assign bucket_thresholds_fips_bucket_thresh_we = addr_hit[13] & reg_we & ~wr_err;
+  assign bucket_thresholds_fips_bucket_thresh_wd = reg_wdata[15:0];
+
+  assign bucket_thresholds_bypass_bucket_thresh_we = addr_hit[13] & reg_we & ~wr_err;
+  assign bucket_thresholds_bypass_bucket_thresh_wd = reg_wdata[31:16];
+
+  assign markov_thresholds_fips_markov_thresh_we = addr_hit[14] & reg_we & ~wr_err;
+  assign markov_thresholds_fips_markov_thresh_wd = reg_wdata[15:0];
+
+  assign markov_thresholds_bypass_markov_thresh_we = addr_hit[14] & reg_we & ~wr_err;
+  assign markov_thresholds_bypass_markov_thresh_wd = reg_wdata[31:16];
+
+  assign repcnt_hi_watermarks_fips_repcnt_hi_watermark_re = addr_hit[15] && reg_re;
+
+  assign repcnt_hi_watermarks_bypass_repcnt_hi_watermark_re = addr_hit[15] && reg_re;
+
+  assign adaptp_hi_watermarks_fips_adaptp_hi_watermark_re = addr_hit[16] && reg_re;
+
+  assign adaptp_hi_watermarks_bypass_adaptp_hi_watermark_re = addr_hit[16] && reg_re;
+
+  assign adaptp_lo_watermarks_fips_adaptp_lo_watermark_re = addr_hit[17] && reg_re;
+
+  assign adaptp_lo_watermarks_bypass_adaptp_lo_watermark_re = addr_hit[17] && reg_re;
+
+  assign bucket_hi_watermarks_fips_bucket_hi_watermark_re = addr_hit[18] && reg_re;
+
+  assign bucket_hi_watermarks_bypass_bucket_hi_watermark_re = addr_hit[18] && reg_re;
+
+  assign markov_hi_watermarks_fips_markov_hi_watermark_re = addr_hit[19] && reg_re;
+
+  assign markov_hi_watermarks_bypass_markov_hi_watermark_re = addr_hit[19] && reg_re;
+
+  assign repcnt_total_fails_re = addr_hit[20] && reg_re;
+
+  assign adaptp_hi_total_fails_re = addr_hit[21] && reg_re;
+
+  assign adaptp_lo_total_fails_re = addr_hit[22] && reg_re;
+
+  assign bucket_total_fails_re = addr_hit[23] && reg_re;
+
+  assign markov_total_fails_re = addr_hit[24] && reg_re;
+
+  assign alert_threshold_we = addr_hit[25] & reg_we & ~wr_err;
+  assign alert_threshold_wd = reg_wdata[3:0];
+
+  assign alert_fail_counts_any_fail_count_re = addr_hit[26] && reg_re;
+
+  assign alert_fail_counts_repcnt_fail_count_re = addr_hit[26] && reg_re;
+
+  assign alert_fail_counts_adaptp_hi_fail_count_re = addr_hit[26] && reg_re;
+
+  assign alert_fail_counts_adaptp_lo_fail_count_re = addr_hit[26] && reg_re;
+
+  assign alert_fail_counts_bucket_fail_count_re = addr_hit[26] && reg_re;
+
+  assign alert_fail_counts_markov_fail_count_re = addr_hit[26] && reg_re;
+
+  assign debug_status_entropy_fifo_depth_re = addr_hit[27] && reg_re;
+
+  assign debug_status_diag_re = addr_hit[27] && reg_re;
+
+  assign seed_we = addr_hit[28] & reg_we & ~wr_err;
+  assign seed_wd = reg_wdata[3:0];
 
   // Read data return
   always_comb begin
@@ -1029,78 +1792,152 @@
     unique case (1'b1)
       addr_hit[0]: begin
         reg_rdata_next[0] = intr_state_es_entropy_valid_qs;
-        reg_rdata_next[1] = intr_state_es_rct_failed_qs;
-        reg_rdata_next[2] = intr_state_es_apt_failed_qs;
-        reg_rdata_next[3] = intr_state_es_fifo_err_qs;
+        reg_rdata_next[1] = intr_state_es_health_test_failed_qs;
+        reg_rdata_next[2] = intr_state_es_fifo_err_qs;
       end
 
       addr_hit[1]: begin
         reg_rdata_next[0] = intr_enable_es_entropy_valid_qs;
-        reg_rdata_next[1] = intr_enable_es_rct_failed_qs;
-        reg_rdata_next[2] = intr_enable_es_apt_failed_qs;
-        reg_rdata_next[3] = intr_enable_es_fifo_err_qs;
+        reg_rdata_next[1] = intr_enable_es_health_test_failed_qs;
+        reg_rdata_next[2] = intr_enable_es_fifo_err_qs;
       end
 
       addr_hit[2]: begin
         reg_rdata_next[0] = '0;
         reg_rdata_next[1] = '0;
         reg_rdata_next[2] = '0;
-        reg_rdata_next[3] = '0;
       end
 
       addr_hit[3]: begin
-        reg_rdata_next[0] = es_regen_qs;
+        reg_rdata_next[0] = regen_qs;
       end
 
       addr_hit[4]: begin
-        reg_rdata_next[7:0] = es_rev_abi_revision_qs;
-        reg_rdata_next[15:8] = es_rev_hw_revision_qs;
-        reg_rdata_next[23:16] = es_rev_chip_type_qs;
+        reg_rdata_next[7:0] = rev_abi_revision_qs;
+        reg_rdata_next[15:8] = rev_hw_revision_qs;
+        reg_rdata_next[23:16] = rev_chip_type_qs;
       end
 
       addr_hit[5]: begin
-        reg_rdata_next[1:0] = es_conf_enable_qs;
-        reg_rdata_next[4] = es_conf_rng_src_en_qs;
-        reg_rdata_next[5] = es_conf_rct_en_qs;
-        reg_rdata_next[6] = es_conf_apt_en_qs;
-        reg_rdata_next[8] = es_conf_rng_bit_en_qs;
-        reg_rdata_next[10:9] = es_conf_rng_bit_sel_qs;
+        reg_rdata_next[1:0] = conf_enable_qs;
+        reg_rdata_next[3] = conf_boot_bypass_disable_qs;
+        reg_rdata_next[4] = conf_repcnt_disable_qs;
+        reg_rdata_next[5] = conf_adaptp_disable_qs;
+        reg_rdata_next[6] = conf_bucket_disable_qs;
+        reg_rdata_next[7] = conf_markov_disable_qs;
+        reg_rdata_next[8] = conf_health_test_clr_qs;
+        reg_rdata_next[9] = conf_rng_bit_en_qs;
+        reg_rdata_next[11:10] = conf_rng_bit_sel_qs;
       end
 
       addr_hit[6]: begin
-        reg_rdata_next[15:0] = es_rct_health_qs;
+        reg_rdata_next[15:0] = rate_qs;
       end
 
       addr_hit[7]: begin
-        reg_rdata_next[15:0] = es_apt_health_apt_max_qs;
-        reg_rdata_next[31:16] = es_apt_health_apt_win_qs;
+        reg_rdata_next[0] = entropy_control_es_route_qs;
+        reg_rdata_next[1] = entropy_control_es_type_qs;
       end
 
       addr_hit[8]: begin
-        reg_rdata_next[31:0] = es_entropy_qs;
+        reg_rdata_next[31:0] = entropy_data_qs;
       end
 
       addr_hit[9]: begin
-        reg_rdata_next[2:0] = es_fifo_status_dig_src_depth_qs;
-        reg_rdata_next[6:4] = es_fifo_status_hwif_depth_qs;
-        reg_rdata_next[16:12] = es_fifo_status_es_depth_qs;
-        reg_rdata_next[31] = es_fifo_status_diag_qs;
+        reg_rdata_next[15:0] = health_test_windows_fips_window_qs;
+        reg_rdata_next[31:16] = health_test_windows_bypass_window_qs;
       end
 
       addr_hit[10]: begin
-        reg_rdata_next[2:0] = es_fdepthst_qs;
+        reg_rdata_next[15:0] = repcnt_thresholds_fips_repcnt_thresh_qs;
+        reg_rdata_next[31:16] = repcnt_thresholds_bypass_repcnt_thresh_qs;
       end
 
       addr_hit[11]: begin
-        reg_rdata_next[2:0] = es_thresh_qs;
+        reg_rdata_next[15:0] = adaptp_hi_thresholds_fips_adaptp_hi_thresh_qs;
+        reg_rdata_next[31:16] = adaptp_hi_thresholds_bypass_adaptp_hi_thresh_qs;
       end
 
       addr_hit[12]: begin
-        reg_rdata_next[15:0] = es_rate_qs;
+        reg_rdata_next[15:0] = adaptp_lo_thresholds_fips_adaptp_lo_thresh_qs;
+        reg_rdata_next[31:16] = adaptp_lo_thresholds_bypass_adaptp_lo_thresh_qs;
       end
 
       addr_hit[13]: begin
-        reg_rdata_next[3:0] = es_seed_qs;
+        reg_rdata_next[15:0] = bucket_thresholds_fips_bucket_thresh_qs;
+        reg_rdata_next[31:16] = bucket_thresholds_bypass_bucket_thresh_qs;
+      end
+
+      addr_hit[14]: begin
+        reg_rdata_next[15:0] = markov_thresholds_fips_markov_thresh_qs;
+        reg_rdata_next[31:16] = markov_thresholds_bypass_markov_thresh_qs;
+      end
+
+      addr_hit[15]: begin
+        reg_rdata_next[15:0] = repcnt_hi_watermarks_fips_repcnt_hi_watermark_qs;
+        reg_rdata_next[31:16] = repcnt_hi_watermarks_bypass_repcnt_hi_watermark_qs;
+      end
+
+      addr_hit[16]: begin
+        reg_rdata_next[15:0] = adaptp_hi_watermarks_fips_adaptp_hi_watermark_qs;
+        reg_rdata_next[31:16] = adaptp_hi_watermarks_bypass_adaptp_hi_watermark_qs;
+      end
+
+      addr_hit[17]: begin
+        reg_rdata_next[15:0] = adaptp_lo_watermarks_fips_adaptp_lo_watermark_qs;
+        reg_rdata_next[31:16] = adaptp_lo_watermarks_bypass_adaptp_lo_watermark_qs;
+      end
+
+      addr_hit[18]: begin
+        reg_rdata_next[15:0] = bucket_hi_watermarks_fips_bucket_hi_watermark_qs;
+        reg_rdata_next[31:16] = bucket_hi_watermarks_bypass_bucket_hi_watermark_qs;
+      end
+
+      addr_hit[19]: begin
+        reg_rdata_next[15:0] = markov_hi_watermarks_fips_markov_hi_watermark_qs;
+        reg_rdata_next[31:16] = markov_hi_watermarks_bypass_markov_hi_watermark_qs;
+      end
+
+      addr_hit[20]: begin
+        reg_rdata_next[31:0] = repcnt_total_fails_qs;
+      end
+
+      addr_hit[21]: begin
+        reg_rdata_next[31:0] = adaptp_hi_total_fails_qs;
+      end
+
+      addr_hit[22]: begin
+        reg_rdata_next[31:0] = adaptp_lo_total_fails_qs;
+      end
+
+      addr_hit[23]: begin
+        reg_rdata_next[31:0] = bucket_total_fails_qs;
+      end
+
+      addr_hit[24]: begin
+        reg_rdata_next[31:0] = markov_total_fails_qs;
+      end
+
+      addr_hit[25]: begin
+        reg_rdata_next[3:0] = alert_threshold_qs;
+      end
+
+      addr_hit[26]: begin
+        reg_rdata_next[3:0] = alert_fail_counts_any_fail_count_qs;
+        reg_rdata_next[7:4] = alert_fail_counts_repcnt_fail_count_qs;
+        reg_rdata_next[11:8] = alert_fail_counts_adaptp_hi_fail_count_qs;
+        reg_rdata_next[15:12] = alert_fail_counts_adaptp_lo_fail_count_qs;
+        reg_rdata_next[19:16] = alert_fail_counts_bucket_fail_count_qs;
+        reg_rdata_next[23:20] = alert_fail_counts_markov_fail_count_qs;
+      end
+
+      addr_hit[27]: begin
+        reg_rdata_next[1:0] = debug_status_entropy_fifo_depth_qs;
+        reg_rdata_next[31] = debug_status_diag_qs;
+      end
+
+      addr_hit[28]: begin
+        reg_rdata_next[3:0] = seed_qs;
       end
 
       default: begin
diff --git a/hw/ip/entropy_src/rtl/entropy_src_repcnt_ht.sv b/hw/ip/entropy_src/rtl/entropy_src_repcnt_ht.sv
new file mode 100755
index 0000000..7ace6b7
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_repcnt_ht.sv
@@ -0,0 +1,114 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src repetitive count health test module
+//
+
+module entropy_src_repcnt_ht #(
+  parameter int unsigned RegWidth = 16,
+  parameter int unsigned RngBusWidth = 4
+) (
+  input                  clk_i,
+  input                  rst_ni,
+
+   // ins req interface
+  input logic [RngBusWidth-1:0] entropy_bit_i,
+  input logic                   entropy_bit_vld_i,
+  input logic                   clear_i,
+  input logic                   active_i,
+  input logic [RegWidth-1:0]    thresh_i,
+  input logic [RegWidth-1:0]    window_i,
+  output logic [RegWidth-1:0]   test_cnt_o,
+  output logic                  test_done_pulse_o,
+  output logic                  test_fail_pulse_o
+);
+
+  // signals
+  logic                  window_cntr_wrap;
+  logic [RngBusWidth-1:0] samples_match_pulse;
+  logic [RngBusWidth-1:0] samples_no_match_pulse;
+  logic [RngBusWidth-1:0] rep_cnt_fail;
+
+  // flops
+  logic [RngBusWidth-1:0] prev_sample_q, prev_sample_d;
+  logic [RegWidth-1:0]  rep_cntr_q[RngBusWidth], rep_cntr_d[RngBusWidth];
+  logic [RegWidth-1:0]  window_cntr_q, window_cntr_d;
+  logic [RegWidth-1:0]  test_cnt_q, test_cnt_d;
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      prev_sample_q    <= '0;
+      rep_cntr_q       <= {{RegWidth{1'b0}},{RegWidth{1'b0}},
+                           {RegWidth{1'b0}},{RegWidth{1'b0}}};
+      window_cntr_q    <= '0;
+      test_cnt_q       <= '0;
+    end else begin
+      prev_sample_q    <= prev_sample_d;
+      rep_cntr_q       <= rep_cntr_d;
+      window_cntr_q    <= window_cntr_d;
+      test_cnt_q       <= test_cnt_d;
+    end
+
+
+  // Repetitive Count Test
+  //
+  // Test operation
+  //  This test will look for catastrophic stuck bit failures. The rep_cntr
+  //  uses zero as the starting value, differing from the NIST value of one.
+
+
+  genvar sh;
+  generate
+    for (sh = 0; sh < RngBusWidth; sh = sh+1) begin : gen_cntrs
+
+      // NIST A sample
+      assign prev_sample_d[sh] =
+             (!active_i || clear_i) ? '0 :
+             window_cntr_wrap ? '0  :
+             entropy_bit_vld_i ? entropy_bit_i[sh] :
+             prev_sample_q[sh];
+
+      assign samples_match_pulse[sh] = entropy_bit_vld_i &&
+             (prev_sample_q[sh] == entropy_bit_i[sh]);
+      assign samples_no_match_pulse[sh] = entropy_bit_vld_i &&
+             (prev_sample_q[sh] != entropy_bit_i[sh]);
+
+      // NIST B counter
+      assign rep_cntr_d[sh] =
+             (!active_i || clear_i) ? '0 :
+             window_cntr_wrap ? '0  :
+             samples_match_pulse[sh] ? (rep_cntr_q[sh]+1) :
+             samples_no_match_pulse[sh] ?  '0 :
+             rep_cntr_q[sh];
+
+      assign rep_cnt_fail[sh] = (rep_cntr_q[sh] >= thresh_i);
+
+    end
+  endgenerate
+
+
+  // Window wrap condition
+  assign window_cntr_wrap = (window_cntr_q == window_i);
+
+  // Window counter
+  assign window_cntr_d =
+         clear_i ? '0 :
+         window_cntr_wrap ? '0  :
+         entropy_bit_vld_i ? (window_cntr_q+1) :
+         window_cntr_q;
+
+  // Test event counter
+  assign test_cnt_d =
+         (!active_i || clear_i) ? '0 :
+         window_cntr_wrap ? '0 :
+         entropy_bit_vld_i && (|rep_cnt_fail) ? (test_cnt_q+1) :
+         test_cnt_q;
+
+  // the pulses will be only one clock in length
+  assign test_fail_pulse_o = active_i && window_cntr_wrap && (test_cnt_q > '0);
+  assign test_done_pulse_o = window_cntr_wrap;
+  assign test_cnt_o = test_cnt_q;
+
+
+endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_shtests.sv b/hw/ip/entropy_src/rtl/entropy_src_shtests.sv
deleted file mode 100755
index 7c3cd0e..0000000
--- a/hw/ip/entropy_src/rtl/entropy_src_shtests.sv
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-// Description: entropy_src health tests module
-//
-
-module entropy_src_shtests (
-  input                  clk_i,
-  input                  rst_ni,
-
-   // ins req interface
-  input logic            entropy_bit_i,
-  input logic            entropy_bit_vld_i,
-  input logic            rct_active_i,
-  input logic [15:0]     rct_max_cnt_i,
-  input logic            apt_active_i,
-  input logic [15:0]     apt_max_cnt_i,
-  input logic [15:0]     apt_window_i,
-  output logic           rct_fail_pls_o,
-  output logic           apt_fail_pls_o,
-  output logic           shtests_passing_o
-);
-
-  // signals
-  logic rct_samples_match;
-  logic rct_fail;
-  logic rct_pass;
-  logic apt_reset_test;
-  logic apt_samples_match;
-  logic apt_fail;
-  logic apt_pass;
-
-
-  // flops
-  logic        rct_prev_sample_q, rct_prev_sample_d;
-  logic [15:0] rct_rep_cntr_q, rct_rep_cntr_d;
-  logic        apt_initial_sample_q, apt_initial_sample_d;
-  logic [15:0] apt_sample_cntr_q, apt_sample_cntr_d;
-  logic [15:0] apt_match_cntr_q, apt_match_cntr_d;
-  logic        rct_passing_q, rct_passing_d;
-  logic        apt_passing_q, apt_passing_d;
-
-  always_ff @(posedge clk_i or negedge rst_ni)
-    if (!rst_ni) begin
-      rct_prev_sample_q     <= '0;
-      rct_rep_cntr_q        <= '0;
-      apt_initial_sample_q  <= '0;
-      apt_sample_cntr_q     <= '0;
-      apt_match_cntr_q      <= '0;
-      rct_passing_q    <= '0;
-      apt_passing_q    <= '0;
-    end else begin
-      rct_prev_sample_q     <= rct_prev_sample_d;
-      rct_rep_cntr_q        <= rct_rep_cntr_d;
-      apt_initial_sample_q  <= apt_initial_sample_d;
-      apt_sample_cntr_q     <= apt_sample_cntr_d;
-      apt_match_cntr_q      <= apt_match_cntr_d;
-      rct_passing_q    <= rct_passing_d;
-      apt_passing_q    <= apt_passing_d;
-    end
-
-
-
-  // Repetition Count Test (RCT)
-  //
-  // Point of test
-  //  check for back to back patterns up to a
-  //  limit, fail if it does
-
-
-  // NIST A sample
-  assign rct_prev_sample_d = ~rct_active_i ? 1'b0 :
-         (entropy_bit_vld_i & (rct_rep_cntr_q == 16'h0001)) ? entropy_bit_i :
-         rct_prev_sample_q;
-
-  assign rct_samples_match = (rct_prev_sample_q == (entropy_bit_vld_i & entropy_bit_i));
-
-  // NIST B counter
-  assign rct_rep_cntr_d =
-         ~rct_active_i ? 16'h0001 :
-         rct_fail ? 16'h0001 :
-         (entropy_bit_vld_i & rct_samples_match) ? (rct_rep_cntr_q+1) :
-         rct_pass ? 16'h0001 :
-         rct_rep_cntr_q;
-
-  assign rct_pass = rct_active_i & (entropy_bit_vld_i & ~rct_samples_match);
-  assign rct_fail = rct_active_i & (rct_rep_cntr_q >= rct_max_cnt_i);
-  assign rct_fail_pls_o = rct_fail;
-
-  assign rct_passing_d =
-         ~rct_active_i ? 1'b1 :
-         rct_fail ? 1'b0 :
-         rct_pass ? 1'b1 :
-         rct_passing_q;
-
-
-  // Adaptive Proportion Test (APT)
-  //
-  // Point of test
-  //  sample once, then check for period of time if
-  //  that pattern appears again, fail if it does
-
-
-  // NIST N value
-  assign apt_reset_test = ~apt_active_i | apt_fail | (apt_sample_cntr_q >= apt_window_i);
-
-  // NIST A counter
-  assign apt_initial_sample_d =
-         ((apt_sample_cntr_q == 16'h0000) & entropy_bit_vld_i) ? entropy_bit_i :
-         apt_initial_sample_q;
-
-  // NIST S counter
-  assign apt_sample_cntr_d = apt_reset_test ? 16'b0 :
-         entropy_bit_vld_i ? (apt_sample_cntr_q+1) :
-         apt_sample_cntr_q;
-
-  assign apt_samples_match = entropy_bit_vld_i & (apt_initial_sample_q == entropy_bit_i);
-
-  // NIST B counter
-  assign apt_match_cntr_d = apt_reset_test ? 16'b0 :
-         (entropy_bit_vld_i & apt_samples_match) ? (apt_match_cntr_q+1) :
-         apt_match_cntr_q;
-
-  assign apt_pass = (apt_sample_cntr_q >= apt_window_i);
-  assign apt_fail = apt_active_i & (apt_match_cntr_q >= apt_max_cnt_i);
-  assign apt_fail_pls_o = apt_fail;
-
-  assign apt_passing_d =
-         ~apt_active_i ? 1'b1 :
-         apt_fail ? 1'b0 :
-         apt_pass ? 1'b1 :
-         apt_passing_q;
-
-  // tests summary
-  assign shtests_passing_o = rct_passing_q && apt_passing_q;
-
-endmodule
diff --git a/hw/ip/entropy_src/rtl/entropy_src_watermark_reg.sv b/hw/ip/entropy_src/rtl/entropy_src_watermark_reg.sv
new file mode 100755
index 0000000..577e5d7
--- /dev/null
+++ b/hw/ip/entropy_src/rtl/entropy_src_watermark_reg.sv
@@ -0,0 +1,55 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+// Description: entropy_src high or how watermark register module
+//
+
+module entropy_src_watermark_reg #(
+  parameter int unsigned RegWidth = 16,
+  parameter int unsigned HighWatermark = 1
+) (
+  input logic                   clk_i,
+  input logic                   rst_ni,
+
+   // functional interface
+  input logic                   clear_i,
+  input logic                   active_i,
+  input logic                   event_i,
+  input logic [RegWidth-1:0]    value_i,
+  output logic [RegWidth-1:0]   value_o
+);
+
+  // signals
+  logic [RegWidth-1:0] event_cntr_change;
+
+  // flops
+  logic [RegWidth-1:0] event_cntr_q, event_cntr_d;
+
+  always_ff @(posedge clk_i or negedge rst_ni)
+    if (!rst_ni) begin
+      event_cntr_q       <= '0;
+    end else begin
+      event_cntr_q       <= event_cntr_d;
+    end
+
+  assign event_cntr_d = (!active_i || clear_i) ? '0 :
+                        event_i ? event_cntr_change :
+                        event_cntr_q;
+
+  generate
+    if (HighWatermark) begin : gen_hi_wm
+
+      assign event_cntr_change = (value_i > event_cntr_q) ? (value_i) : event_cntr_q;
+
+    end else begin : gen_lo_wm
+
+      assign event_cntr_change = (value_i < event_cntr_q) ? (value_i) : event_cntr_q;
+
+    end
+  endgenerate
+
+  // drive output
+  assign value_o = event_cntr_q;
+
+endmodule