[AST] Update prim_mubi4_sync parameter

Signed-off-by: Jacob Levy <jacob.levy@opentitan.org>
diff --git a/hw/top_earlgrey/ip/ast/ast.core b/hw/top_earlgrey/ip/ast/ast.core
index 524794e..12b0440 100644
--- a/hw/top_earlgrey/ip/ast/ast.core
+++ b/hw/top_earlgrey/ip/ast/ast.core
@@ -28,28 +28,29 @@
       - rtl/ast_pkg.sv
       - rtl/ast_bhv_pkg.sv
       - rtl/ast.sv
+      - rtl/ast_reg_top.sv
       - rtl/adc.sv
       - rtl/adc_ana.sv
-      - rtl/aon_clk.sv
-      - rtl/aon_osc.sv
-      - rtl/ast_dft.sv
-      - rtl/ast_reg_top.sv
-      - rtl/ast_entropy.sv
-      - rtl/dev_entropy.sv
-      - rtl/ast_alert.sv
       - rtl/vcc_pgd.sv
       - rtl/vio_pgd.sv
       - rtl/vcaon_pgd.sv
       - rtl/vcmain_pgd.sv
-      - rtl/gfr_clk_mux2.sv
+      - rtl/ast_alert.sv
+      - rtl/aon_clk.sv
+      - rtl/aon_osc.sv
       - rtl/io_clk.sv
       - rtl/io_osc.sv
-      - rtl/rglts_pdm_3p3v.sv
-      - rtl/rng.sv
       - rtl/sys_clk.sv
       - rtl/sys_osc.sv
       - rtl/usb_clk.sv
       - rtl/usb_osc.sv
+      - rtl/gfr_clk_mux2.sv
+      - rtl/ast_clks_byp.sv
+      - rtl/rglts_pdm_3p3v.sv
+      - rtl/ast_entropy.sv
+      - rtl/dev_entropy.sv
+      - rtl/rng.sv
+      - rtl/ast_dft.sv
     file_type: systemVerilogSource
 
   files_verilator_waiver:
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast.sv b/hw/top_earlgrey/ip/ast/rtl/ast.sv
index 3602c39..b12b4dc 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast.sv
@@ -277,7 +277,7 @@
 // Regulators & PDM Logic (VCC)
 ///////////////////////////////////////
 
-logic clk_aon;
+logic clk_aon, deep_sleep;
 
 rglts_pdm_3p3v u_rglts_pdm_3p3v (
   .vcc_pok_h_i ( vcc_pok_h ),
@@ -290,6 +290,7 @@
   .scan_mode_i ( scan_mode ),
   .vcaon_pok_h_o ( vcaon_pok_h_int ),
   .main_pwr_dly_o ( main_pwr_dly_o ),
+  .deep_sleep_h_o ( deep_sleep ),
   .otp_power_seq_h_o ( otp_power_seq_h_o[1:0] ),
   .flash_power_down_h_o ( flash_power_down_h_o ),
   .flash_power_ready_h_o ( flash_power_ready_h_o )
@@ -348,7 +349,7 @@
 assign clk_usb_ext   = clk_osc_byp_i.usb;
 `endif
 assign rst_usb_clk_n = vcmain_pok_por;
-assign clk_usb_pd_n  = vcmain_pok;
+assign clk_usb_pd_n  = !deep_sleep;
 
 usb_clk u_usb_clk (
   .vcore_pok_h_i ( vcaon_pok_h ),
@@ -446,6 +447,39 @@
 
 
 ///////////////////////////////////////
+// AST Clocks Bypass
+///////////////////////////////////////
+ast_clks_byp u_ast_clks_byp (
+  .clk_i ( clk_ast_tlul_i ),
+  .rst_ni ( rst_ast_tlul_ni ),
+  .vcaon_pok_i ( vcaon_pok ),
+  .deep_sleep_i ( deep_sleep ),
+  .clk_osc_sys_i ( clk_osc_sys ),
+  .clk_osc_sys_val_i ( clk_osc_sys_val ),
+  .clk_osc_io_i ( clk_osc_io ),
+  .clk_osc_io_val_i ( clk_osc_io_val ),
+  .clk_osc_usb_i ( clk_osc_usb ),
+  .clk_osc_usb_val_i ( clk_osc_usb_val ),
+  .clk_osc_aon_i ( clk_osc_aon ),
+  .clk_osc_aon_val_i ( clk_osc_aon_val ),
+  .clk_ast_ext_i ( clk_ast_ext_i ),
+  .io_clk_byp_req_i ( io_clk_byp_req_i ),
+  .all_clk_byp_req_i ( all_clk_byp_req_i ),
+  .ext_freq_is_96m_i ( ext_freq_is_96m_i ),
+  .io_clk_byp_ack_o ( io_clk_byp_ack_o ),
+  .all_clk_byp_ack_o ( all_clk_byp_ack_o ),
+  .clk_src_sys_o ( clk_src_sys_o ),
+  .clk_src_sys_val_o ( clk_src_sys_val_o ),
+  .clk_src_io_o ( clk_src_io_o ),
+  .clk_src_io_val_o ( clk_src_io_val_o ),
+  .clk_src_usb_o ( clk_src_usb_o ),
+  .clk_src_usb_val_o ( clk_src_usb_val_o ),
+  .clk_src_aon_o ( clk_src_aon_o ),
+  .clk_src_aon_val_o ( clk_src_aon_val_o )
+);
+
+
+///////////////////////////////////////
 // ADC (Always ON)
 ///////////////////////////////////////
 adc #(
@@ -744,33 +778,7 @@
 ///////////////////////////////////////
 // DFT (Main | Always ON)
 ///////////////////////////////////////
-
 ast_dft u_ast_dft (
-  .clk_i ( clk_ast_tlul_i ),
-  .rst_ni ( rst_ast_tlul_ni ),
-  .vcaon_pok_i ( vcaon_pok ),
-  .clk_osc_sys_i ( clk_osc_sys ),
-  .clk_osc_sys_val_i ( clk_osc_sys_val ),
-  .clk_osc_io_i ( clk_osc_io ),
-  .clk_osc_io_val_i ( clk_osc_io_val ),
-  .clk_osc_usb_i ( clk_osc_usb ),
-  .clk_osc_usb_val_i ( clk_osc_usb_val ),
-  .clk_osc_aon_i ( clk_osc_aon ),
-  .clk_osc_aon_val_i ( clk_osc_aon_val ),
-  .all_clk_byp_req_i ( all_clk_byp_req_i ),
-  .io_clk_byp_req_i ( io_clk_byp_req_i ),
-  .ext_freq_is_96m_i ( ext_freq_is_96m_i ),
-  .clk_ast_ext_i ( clk_ast_ext_i ),
-  .clk_src_sys_o ( clk_src_sys_o ),
-  .clk_src_sys_val_o ( clk_src_sys_val_o ),
-  .clk_src_io_o ( clk_src_io_o ),
-  .clk_src_io_val_o ( clk_src_io_val_o ),
-  .clk_src_usb_o ( clk_src_usb_o ),
-  .clk_src_usb_val_o ( clk_src_usb_val_o ),
-  .clk_src_aon_o ( clk_src_aon_o ),
-  .clk_src_aon_val_o ( clk_src_aon_val_o ),
-  .io_clk_byp_ack_o ( io_clk_byp_ack_o ),
-  .all_clk_byp_ack_o ( all_clk_byp_ack_o ),
   .dpram_rmf_o ( dpram_rmf_o ),
   .dpram_rml_o ( dpram_rml_o ),
   .spram_rm_o ( spram_rm_o ),
@@ -778,6 +786,7 @@
   .sprom_rm_o ( sprom_rm_o )
 );
 
+
 ////////////////////////////////////////
 // DFT Misc Logic
 ////////////////////////////////////////
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_clks_byp.sv b/hw/top_earlgrey/ip/ast/rtl/ast_clks_byp.sv
new file mode 100644
index 0000000..bd1b853
--- /dev/null
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_clks_byp.sv
@@ -0,0 +1,305 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//############################################################################
+// *Name: ast_clks_byp
+// *Module Description: AST Clocks Bypass
+//############################################################################
+
+`include "prim_assert.sv"
+
+module ast_clks_byp (
+  input clk_i,                              // TLUL Clock
+  input rst_ni,                             // TLUL Reset
+  input vcaon_pok_i,                        // VCAON POK
+  input deep_sleep_i,                       // Deep Sleep (main regulator & switch are off)
+  input clk_osc_sys_i,                      // SYS Oscillator Clock
+  input clk_osc_sys_val_i,                  // SYS Oscillator Clock Valid
+  input clk_osc_io_i,                       // IO Oscillator Clock
+  input clk_osc_io_val_i,                   // IO Oscillator Clock Valid
+  input clk_osc_usb_i,                      // USB Oscillator Clock
+  input clk_osc_usb_val_i,                  // USB Oscillator Clock Valid
+  input clk_osc_aon_i,                      // AON Oscillator Clock
+  input clk_osc_aon_val_i,                  // AON Oscillator Clock Valid
+  input clk_ast_ext_i,                      // External Clock
+  input prim_mubi_pkg::mubi4_t io_clk_byp_req_i,  // External IO clock mux for OTP bootstrap
+  input prim_mubi_pkg::mubi4_t all_clk_byp_req_i, // External all clock mux override
+  input ext_freq_is_96m_i,                  // External Clock Frequecy is 96MHz (else 48MHz)
+  output prim_mubi_pkg::mubi4_t io_clk_byp_ack_o,   // Switch IO clock to External clock
+  output prim_mubi_pkg::mubi4_t all_clk_byp_ack_o,  // Switch all clocks to External clock
+  output logic clk_src_sys_o,               // SYS Source Clock
+  output logic clk_src_sys_val_o,           // SYS Source Clock Valid
+  output logic clk_src_io_o,                // IO Source Clock
+  output logic clk_src_io_val_o,            // IO Source Clock Valid
+  output logic clk_src_usb_o,               // USB Source Clock
+  output logic clk_src_usb_val_o,           // USB Source Clock Valid
+  output logic clk_src_aon_o,               // AON Source Clock
+  output logic clk_src_aon_val_o            // AON Source Clock Valid
+);
+
+logic ext_clk, rst_aon_n;
+
+logic scan_mode_i;
+
+assign scan_mode_i = 1'b0;
+assign ext_clk     = clk_ast_ext_i;
+assign rst_aon_n   = vcaon_pok_i;
+
+
+////////////////////////////////////////
+// Source Clocks Selection
+////////////////////////////////////////
+
+
+
+// SW Bypass select logic
+////////////////////////////////////////
+
+// Sync to local TLUL clcok
+prim_mubi_pkg::mubi4_t io_clk_byp_req, all_clk_byp_req;
+logic sw_ext_freq_is_96m;
+
+prim_mubi4_sync #(
+  .StabilityCheck ( 1 ),
+  .ResetValue ( prim_mubi_pkg::MuBi4False )
+) u_io_clk_byp_req (
+  .clk_i,
+  .rst_ni,
+  .mubi_i ( io_clk_byp_req_i ),
+  .mubi_o ( io_clk_byp_req )
+);
+
+prim_mubi4_sync #(
+  .StabilityCheck ( 1 ),
+  .ResetValue ( prim_mubi_pkg::MuBi4False )
+) u_all_clk_byp_req (
+  .clk_i,
+  .rst_ni,
+  .mubi_i ( all_clk_byp_req_i ),
+  .mubi_o ( all_clk_byp_req )
+);
+
+prim_flop_2sync #(
+  .Width ( 1 ),
+  .ResetValue ( 1'b0 )
+) u_sw_ext_freq_sync (
+  .clk_i ( ext_clk ),
+  .rst_ni ( rst_aon_n ),
+  .d_i ( ext_freq_is_96m_i ),
+  .q_o ( sw_ext_freq_is_96m )
+);
+
+// Decode logic
+prim_mubi_pkg::mubi4_t io_clk_byp_sel_req;
+logic all_clk_byp, sys_clk_byp, io_clk_byp, usb_clk_byp, aon_clk_byp;
+
+assign io_clk_byp_sel_req = prim_mubi_pkg::mubi4_test_true_strict( all_clk_byp_req ) ?
+                            prim_mubi_pkg::MuBi4True : io_clk_byp_req;
+
+prim_mubi4_dec u_all_byp_sel ( .mubi_i ( all_clk_byp_req ), .mubi_dec_o ( all_clk_byp ) );
+prim_mubi4_dec u_sys_byp_sel ( .mubi_i ( all_clk_byp_req ), .mubi_dec_o ( sys_clk_byp ) );
+prim_mubi4_dec u_io_byp_sel  ( .mubi_i ( io_clk_byp_sel_req ), .mubi_dec_o ( io_clk_byp ) );
+prim_mubi4_dec u_usb_byp_sel ( .mubi_i ( all_clk_byp_req ), .mubi_dec_o ( usb_clk_byp ) );
+prim_mubi4_dec u_aon_byp_sel ( .mubi_i ( all_clk_byp_req ), .mubi_dec_o ( aon_clk_byp ) );
+
+// De-Glitch selects (decode "noise")
+logic sw_all_clk_byp, sw_sys_clk_byp, sw_io_clk_byp, sw_usb_clk_byp, sw_aon_clk_byp;
+
+always_ff @ ( posedge clk_i, negedge rst_ni ) begin
+  if ( !rst_ni ) begin
+    sw_all_clk_byp <= 1'b0;
+    sw_sys_clk_byp <= 1'b0;
+    sw_io_clk_byp <= 1'b0;
+    sw_usb_clk_byp <= 1'b0;
+    sw_aon_clk_byp <= 1'b0;
+  end else begin
+    sw_all_clk_byp <= all_clk_byp;
+    sw_sys_clk_byp <= sys_clk_byp;
+    sw_io_clk_byp <= io_clk_byp;
+    sw_usb_clk_byp <= usb_clk_byp;
+    sw_aon_clk_byp <= aon_clk_byp;
+  end
+end
+
+logic sys_clk_byp_sel, io_clk_byp_sel, usb_clk_byp_sel, aon_clk_byp_sel, ext_freq_is_96m;
+
+assign sys_clk_byp_sel = sw_sys_clk_byp;
+assign io_clk_byp_sel  = sw_io_clk_byp;
+assign usb_clk_byp_sel = sw_usb_clk_byp;
+assign aon_clk_byp_sel = sw_aon_clk_byp;
+assign ext_freq_is_96m = sw_ext_freq_is_96m;
+
+
+// External USB & AON clocks genaration
+////////////////////////////////////////
+logic ext_clk_usb, clk_usb_ext;
+
+prim_clock_div #(
+  .Divisor( 2 )
+) u_clk_ext_div2_div (
+  .clk_i ( ext_clk ),
+  .rst_ni ( rst_aon_n ),
+  .step_down_req_i( !ext_freq_is_96m ),
+  .step_down_ack_o ( ),
+  .test_en_i ( scan_mode_i ),
+  .clk_o ( ext_clk_usb )
+);
+
+assign clk_usb_ext = ext_clk_usb;
+
+logic clk_usb_ext_d240, clk_ext_aon;
+
+prim_clock_div #(
+  .Divisor( 240 )
+) u_clk_usb_div240_div (
+  .clk_i ( clk_usb_ext ),
+  .rst_ni ( rst_aon_n ),
+  .step_down_req_i( 1'b0 ),
+  .step_down_ack_o ( ),
+  .test_en_i ( scan_mode_i ),
+  .clk_o ( clk_usb_ext_d240 )
+);
+
+assign clk_ext_aon = clk_usb_ext_d240;
+
+
+// Deep Slepp Gators
+////////////////////////////////////////
+logic deep_sleep_n;
+
+prim_flop_2sync #(
+  .Width ( 1 ),
+  .ResetValue ( 1'b0 )
+) u_deep_sleep_sync (
+  .clk_i ( ext_clk ),
+  .rst_ni ( rst_aon_n ),
+  .d_i ( !deep_sleep_i ),
+  .q_o ( deep_sleep_n )
+);
+
+// SYS & IO
+logic clk_ext_sys, clk_ext_io;
+
+prim_clock_gating #(
+  .NoFpgaGate ( 1'b1)
+) u_clk_ext_sys_ckgt (
+  .clk_i ( ext_clk ),
+  .en_i ( deep_sleep_n ),
+  .test_en_i ( scan_mode_i ),
+  .clk_o ( clk_ext_sys )
+);
+
+assign clk_ext_io = clk_ext_sys;
+
+// USB SYS
+logic clk_ext_usb;
+
+prim_clock_gating #(
+  .NoFpgaGate ( 1'b1)
+) u_clk_ext_usb_ckgt (
+  .clk_i ( clk_usb_ext ),
+  .en_i ( deep_sleep_n ),
+  .test_en_i ( scan_mode_i ),
+  .clk_o ( clk_ext_usb )
+);
+
+logic sys_clk_osc_en, io_clk_osc_en, usb_clk_osc_en, aon_clk_osc_en;
+logic sys_clk_byp_en, io_clk_byp_en, usb_clk_byp_en, aon_clk_byp_en;
+
+logic rst_clk_osc_n, rst_clk_ext_n;
+assign rst_clk_osc_n = vcaon_pok_i;
+assign rst_clk_ext_n = vcaon_pok_i;
+
+// SYS Clock Bypass Mux
+////////////////////////////////////////
+gfr_clk_mux2 u_clk_src_sys_sel (
+  .clk_osc_i ( clk_osc_sys_i ),
+  .rst_clk_osc_ni ( rst_clk_osc_n ),
+  .clk_ext_i ( clk_ext_sys ),
+  .rst_clk_ext_ni ( rst_clk_ext_n ),
+  .ext_sel_i ( sys_clk_byp_sel ),
+  .clk_osc_en_o ( sys_clk_osc_en ),
+  .clk_ext_en_o ( sys_clk_byp_en ),
+  .clk_o ( clk_src_sys_o )
+);
+
+// IO Clock Bypass Mux
+////////////////////////////////////////
+gfr_clk_mux2 u_clk_src_io_sel (
+  .clk_osc_i ( clk_osc_io_i ),
+  .rst_clk_osc_ni ( rst_clk_osc_n ),
+  .clk_ext_i ( clk_ext_io ),
+  .rst_clk_ext_ni ( rst_clk_ext_n ),
+  .ext_sel_i ( io_clk_byp_sel ),
+  .clk_osc_en_o ( io_clk_osc_en ),
+  .clk_ext_en_o ( io_clk_byp_en ),
+  .clk_o ( clk_src_io_o )
+);
+
+// USB Clock Bypass Mux
+////////////////////////////////////////
+gfr_clk_mux2 u_clk_src_usb_sel (
+  .clk_osc_i ( clk_osc_usb_i ),
+  .rst_clk_osc_ni ( rst_clk_osc_n ),
+  .clk_ext_i ( clk_ext_usb ),
+  .rst_clk_ext_ni ( rst_clk_ext_n ),
+  .ext_sel_i ( usb_clk_byp_sel ),
+  .clk_osc_en_o ( usb_clk_osc_en ),
+  .clk_ext_en_o ( usb_clk_byp_en ),
+  .clk_o ( clk_src_usb_o )
+);
+
+// AON Clock Bypass Mux
+////////////////////////////////////////
+gfr_clk_mux2 u_clk_src_aon_sel (
+  .clk_osc_i ( clk_osc_aon_i ),
+  .rst_clk_osc_ni ( rst_clk_osc_n ),
+  .clk_ext_i ( clk_ext_aon ),
+  .rst_clk_ext_ni ( rst_clk_ext_n ),
+  .ext_sel_i ( aon_clk_byp_sel ),
+  .clk_osc_en_o ( aon_clk_osc_en ),
+  .clk_ext_en_o ( aon_clk_byp_en ),
+  .clk_o ( clk_src_aon_o )
+);
+
+assign clk_src_sys_val_o = sys_clk_byp_sel ? sys_clk_byp_en : sys_clk_osc_en && clk_osc_sys_val_i;
+assign clk_src_io_val_o  = io_clk_byp_sel  ? io_clk_byp_en  : io_clk_osc_en && clk_osc_io_val_i;
+assign clk_src_usb_val_o = usb_clk_byp_sel ? usb_clk_byp_en : usb_clk_osc_en && clk_osc_usb_val_i;
+assign clk_src_aon_val_o = aon_clk_byp_sel ? aon_clk_byp_en : aon_clk_osc_en && clk_osc_aon_val_i;
+
+logic all_clks_byp_en;
+prim_mubi_pkg::mubi4_t all_clk_byp_ack;
+
+assign all_clks_byp_en = sw_all_clk_byp && sys_clk_byp_en && io_clk_byp_en &&
+                         usb_clk_byp_en && aon_clk_byp_en;
+
+assign all_clk_byp_ack = all_clks_byp_en ? prim_mubi_pkg::MuBi4True :
+                                           prim_mubi_pkg::MuBi4False;
+
+prim_mubi4_sender #(
+  .ResetValue ( prim_mubi_pkg::MuBi4False )
+) u_all_clk_byp_ack (
+  .clk_i,
+  .rst_ni,
+  .mubi_i ( all_clk_byp_ack ),
+  .mubi_o ( all_clk_byp_ack_o )
+);
+
+logic only_io_clk_byp_en;
+prim_mubi_pkg::mubi4_t io_clk_byp_ack;
+
+assign only_io_clk_byp_en = !sw_all_clk_byp && sw_io_clk_byp && io_clk_byp_en;
+
+assign io_clk_byp_ack = only_io_clk_byp_en ? prim_mubi_pkg::MuBi4True :
+                                             prim_mubi_pkg::MuBi4False;
+
+prim_mubi4_sender #(
+  .ResetValue ( prim_mubi_pkg::MuBi4False )
+) u_io_clk_byp_ack (
+  .clk_i,
+  .rst_ni,
+  .mubi_i ( io_clk_byp_ack ),
+  .mubi_o ( io_clk_byp_ack_o )
+);
+
+endmodule : ast_clks_byp
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_dft.sv b/hw/top_earlgrey/ip/ast/rtl/ast_dft.sv
index 3aa9281..76aa8e3 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast_dft.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_dft.sv
@@ -9,31 +9,6 @@
 `include "prim_assert.sv"
 
 module ast_dft (
-  input clk_i,                              // TLUL Clock
-  input rst_ni,                             // TLUL Reset
-  input vcaon_pok_i,                        // AON POK
-  input clk_osc_sys_i,                      // SYS Oscillator Clock
-  input clk_osc_sys_val_i,                  // SYS Oscillator Clock Valid
-  input clk_osc_io_i,                       // IO Oscillator Clock
-  input clk_osc_io_val_i,                   // IO Oscillator Clock Valid
-  input clk_osc_usb_i,                      // USB Oscillator Clock
-  input clk_osc_usb_val_i,                  // USB Oscillator Clock Valid
-  input clk_osc_aon_i,                      // AON Oscillator Clock
-  input clk_osc_aon_val_i,                  // AON Oscillator Clock Valid
-  input prim_mubi_pkg::mubi4_t io_clk_byp_req_i,  // External IO clock mux for OTP bootstrap
-  input prim_mubi_pkg::mubi4_t all_clk_byp_req_i, // External all clock mux override
-  input ext_freq_is_96m_i,                  // External Clock Frequecy is 96MHz (else 48MHz)
-  input clk_ast_ext_i,                      // External Clock
-  output logic clk_src_sys_o,               // SYS Source Clock
-  output logic clk_src_sys_val_o,           // SYS Source Clock Valid
-  output logic clk_src_io_o,                // IO Source Clock
-  output logic clk_src_io_val_o,            // IO Source Clock Valid
-  output logic clk_src_usb_o,               // USB Source Clock
-  output logic clk_src_usb_val_o,           // USB Source Clock Valid
-  output logic clk_src_aon_o,               // AON Source Clock
-  output logic clk_src_aon_val_o,           // AON Source Clock Valid
-  output prim_mubi_pkg::mubi4_t io_clk_byp_ack_o,   // Switch IO clock to External clock
-  output prim_mubi_pkg::mubi4_t all_clk_byp_ack_o,  // Switch all clocks to External clock
   // memories read-write margins
   output ast_pkg::dpm_rm_t dpram_rmf_o,     // Dual Port RAM Read-write Margin Fast
   output ast_pkg::dpm_rm_t dpram_rml_o,     // Dual Port RAM Read-write Margin sLow
@@ -42,244 +17,6 @@
   output ast_pkg::spm_rm_t sprom_rm_o       // Single Port ROM Read-write Margin
 );
 
-logic ext_clk, rst_aon_n;
-
-logic scan_mode_i;
-assign scan_mode_i = 1'b0;
-
-assign ext_clk   = clk_ast_ext_i;
-assign rst_aon_n = vcaon_pok_i;
-
-
-////////////////////////////////////////
-// Source Clocks Selection
-////////////////////////////////////////
-
-
-
-// SW Bypass select logic
-////////////////////////////////////////
-prim_mubi_pkg::mubi4_t  io_clk_byp_req;
-
-assign io_clk_byp_req = prim_mubi_pkg::mubi4_test_true_strict( all_clk_byp_req_i ) ?
-                          prim_mubi_pkg::MuBi4True : io_clk_byp_req_i;
-
-logic all_clk_byp, sys_clk_byp, io_clk_byp, usb_clk_byp, aon_clk_byp;
-
-prim_mubi4_dec u_all_byp_sel ( .mubi_i ( all_clk_byp_req_i ), .mubi_dec_o ( all_clk_byp ) );
-prim_mubi4_dec u_sys_byp_sel ( .mubi_i ( all_clk_byp_req_i ), .mubi_dec_o ( sys_clk_byp ) );
-prim_mubi4_dec u_io_byp_sel  ( .mubi_i ( io_clk_byp_req ), .mubi_dec_o ( io_clk_byp ) );
-prim_mubi4_dec u_usb_byp_sel ( .mubi_i ( all_clk_byp_req_i ), .mubi_dec_o ( usb_clk_byp ) );
-prim_mubi4_dec u_aon_byp_sel ( .mubi_i ( all_clk_byp_req_i ), .mubi_dec_o ( aon_clk_byp ) );
-
-// Sync to De-Glitch selects
-logic sw_all_clk_byp, sw_sys_clk_byp, sw_io_clk_byp, sw_usb_clk_byp, sw_aon_clk_byp;
-
-prim_flop_2sync #(
-  .Width ( 1 ),
-  .ResetValue ( 1'b0 )
-) u_sw_all_clk_byp (
-  .clk_i,
-  .rst_ni,
-  .d_i ( all_clk_byp ),
-  .q_o ( sw_all_clk_byp )
-);
-
-prim_flop_2sync #(
-  .Width ( 1 ),
-  .ResetValue ( 1'b0 )
-) u_sw_sys_clk_byp (
-  .clk_i,
-  .rst_ni,
-  .d_i ( sys_clk_byp ),
-  .q_o ( sw_sys_clk_byp )
-);
-
-prim_flop_2sync #(
-  .Width ( 1 ),
-  .ResetValue ( 1'b0 )
-) u_sw_io_clk_byp (
-  .clk_i,
-  .rst_ni,
-  .d_i ( io_clk_byp ),
-  .q_o ( sw_io_clk_byp )
-);
-
-prim_flop_2sync #(
-  .Width ( 1 ),
-  .ResetValue ( 1'b0 )
-) u_sw_usb_clk_byp (
-  .clk_i,
-  .rst_ni,
-  .d_i ( usb_clk_byp ),
-  .q_o ( sw_usb_clk_byp )
-);
-
-prim_flop_2sync #(
-  .Width ( 1 ),
-  .ResetValue ( 1'b0 )
-) u_sw_aon_clk_byp (
-  .clk_i,
-  .rst_ni,
-  .d_i ( aon_clk_byp ),
-  .q_o ( sw_aon_clk_byp )
-);
-
-logic sw_ext_freq_is_96m;
-
-prim_flop_2sync #(
-  .Width ( 1 ),
-  .ResetValue ( 1'b0 )
-) u_ (
-  .clk_i ( ext_clk ),
-  .rst_ni ( rst_aon_n ),
-  .d_i ( ext_freq_is_96m_i ),
-  .q_o ( sw_ext_freq_is_96m )
-);
-
-logic sys_clk_byp_sel, io_clk_byp_sel, usb_clk_byp_sel, aon_clk_byp_sel, ext_freq_is_96m;
-
-assign sys_clk_byp_sel = sw_sys_clk_byp;
-assign io_clk_byp_sel  = sw_io_clk_byp;
-assign usb_clk_byp_sel = sw_usb_clk_byp;
-assign aon_clk_byp_sel = sw_aon_clk_byp;
-assign ext_freq_is_96m = sw_ext_freq_is_96m;
-
-
-// External USB & AON clocks genaration
-////////////////////////////////////////
-logic clk_usb_ext_d2, clk_usb_ext;
-
-prim_clock_div #(
-  .Divisor( 2 )
-) u_clk_ext_div2_div (
-  .clk_i ( ext_clk ),
-  .rst_ni ( rst_aon_n ),
-  .step_down_req_i( ext_freq_is_96m ),
-  .step_down_ack_o ( ),
-  .test_en_i ( scan_mode_i ),
-  .clk_o ( clk_usb_ext_d2 )
-);
-
-assign clk_usb_ext = clk_usb_ext_d2;
-
-logic clk_usb_ext_d240, clk_aon_ext;
-
-prim_clock_div #(
-  .Divisor( 240 )
-) u_clk_usb_div240_div (
-  .clk_i ( clk_usb_ext ),
-  .rst_ni ( rst_aon_n ),
-  .step_down_req_i( 1'b1 ),
-  .step_down_ack_o ( ),
-  .test_en_i ( scan_mode_i ),
-  .clk_o ( clk_usb_ext_d240 )
-);
-
-assign clk_aon_ext = clk_usb_ext_d240;
-
-logic sys_clk_byp_en, io_clk_byp_en, usb_clk_byp_en, aon_clk_byp_en;
-
-logic rst_clk_osc_n, rst_clk_ext_n;
-assign rst_clk_osc_n = vcaon_pok_i;
-assign rst_clk_ext_n = vcaon_pok_i;
-
-// SYS Clock Bypass Mux
-////////////////////////////////////////
-gfr_clk_mux2 u_clk_src_sys_sel (
-  .clk_osc_i ( clk_osc_sys_i ),
-  .rst_clk_osc_ni ( rst_clk_osc_n ),
-  .clk_ext_i ( ext_clk ),
-  .rst_clk_ext_ni ( rst_clk_ext_n ),
-  .ext_sel_i ( sys_clk_byp_sel ),
-  .clk_osc_en_o ( ),
-  .clk_ext_en_o ( sys_clk_byp_en ),
-  .clk_o ( clk_src_sys_o )
-);
-
-// IO Clock Bypass Mux
-////////////////////////////////////////
-gfr_clk_mux2 u_clk_src_io_sel (
-  .clk_osc_i ( clk_osc_io_i ),
-  .rst_clk_osc_ni ( rst_clk_osc_n ),
-  .clk_ext_i ( ext_clk ),
-  .rst_clk_ext_ni ( rst_clk_ext_n ),
-  .ext_sel_i ( io_clk_byp_sel ),
-  .clk_osc_en_o ( ),
-  .clk_ext_en_o ( io_clk_byp_en ),
-  .clk_o ( clk_src_io_o )
-);
-
-// USB Clock Bypass Mux
-////////////////////////////////////////
-gfr_clk_mux2 u_clk_src_usb_sel (
-  .clk_osc_i ( clk_osc_usb_i ),
-  .rst_clk_osc_ni ( rst_clk_osc_n ),
-  .clk_ext_i ( clk_usb_ext ),
-  .rst_clk_ext_ni ( rst_clk_ext_n ),
-  .ext_sel_i ( usb_clk_byp_sel ),
-  .clk_osc_en_o ( ),
-  .clk_ext_en_o ( usb_clk_byp_en ),
-  .clk_o ( clk_src_usb_o )
-);
-
-// AON Clock Bypass Mux
-////////////////////////////////////////
-gfr_clk_mux2 u_clk_src_aon_sel (
-  .clk_osc_i ( clk_osc_aon_i ),
-  .rst_clk_osc_ni ( rst_clk_osc_n ),
-  .clk_ext_i ( clk_aon_ext ),
-  .rst_clk_ext_ni ( rst_clk_ext_n ),
-  .ext_sel_i ( aon_clk_byp_sel ),
-  .clk_osc_en_o ( ),
-  .clk_ext_en_o ( aon_clk_byp_en ),
-  .clk_o ( clk_src_aon_o )
-);
-
-assign clk_src_sys_val_o = sys_clk_byp_sel ? sys_clk_byp_en : clk_osc_sys_val_i;
-assign clk_src_io_val_o  = io_clk_byp_sel  ? io_clk_byp_en  : clk_osc_io_val_i;
-assign clk_src_usb_val_o = usb_clk_byp_sel ? usb_clk_byp_en : clk_osc_usb_val_i;
-assign clk_src_aon_val_o = aon_clk_byp_sel ? aon_clk_byp_en : clk_osc_aon_val_i;
-
-logic all_clks_byp_en, only_io_clk_byp_en;
-
-assign all_clks_byp_en = sw_all_clk_byp && sys_clk_byp_en && io_clk_byp_en &&
-                         usb_clk_byp_en && aon_clk_byp_en;
-
-assign only_io_clk_byp_en = !sw_all_clk_byp && sw_io_clk_byp && io_clk_byp_en;
-
-
-prim_mubi_pkg::mubi4_t all_clk_byp_ack;
-
-assign all_clk_byp_ack = all_clks_byp_en ? prim_mubi_pkg::MuBi4True :
-                                           prim_mubi_pkg::MuBi4False;
-
-prim_mubi4_sync #(
-  .ResetValue ( prim_mubi_pkg::MuBi4False )
-) u_all_clk_byp_ack (
-  .clk_i,
-  .rst_ni,
-  .mubi_i ( all_clk_byp_ack ),
-  .mubi_o ( all_clk_byp_ack_o )
-);
-
-prim_mubi_pkg::mubi4_t io_clk_byp_ack;
-
-assign io_clk_byp_ack = only_io_clk_byp_en ? prim_mubi_pkg::MuBi4True :
-                                             prim_mubi_pkg::MuBi4False;
-
-prim_mubi4_sync #(
-  .ResetValue ( prim_mubi_pkg::MuBi4False )
-) u_io_clk_byp_ack (
-  .clk_i,
-  .rst_ni,
-  .mubi_i ( io_clk_byp_ack ),
-  .mubi_o ( io_clk_byp_ack_o )
-);
-
-
-
-
 ////////////////////////////////////////
 // Memories Read-write Margins
 ////////////////////////////////////////
@@ -289,13 +26,4 @@
 assign sprgf_rm_o  = 5'h00;
 assign sprom_rm_o  = 5'h00;
 
-
-///////////////////////
-// Unused Signals
-///////////////////////
-logic unused_sigs;
-assign unused_sigs = ^{ clk_i,       // Used in ASIC implementation
-                        rst_ni       // Used in ASIC implementation
-                      };
-
 endmodule : ast_dft
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv b/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
index 4a3fcd3..ddb6e61 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
@@ -11,127 +11,127 @@
 
 package ast_pkg;
 
-  // Alerts
-  parameter int unsigned NumAlerts  = 13;
-  parameter int unsigned NumIoRails = 2;
-  parameter int unsigned AsSel      = 0;
-  parameter int unsigned CgSel      = 1;
-  parameter int unsigned GdSel      = 2;
-  parameter int unsigned TsHiSel    = 3;
-  parameter int unsigned TsLoSel    = 4;
-  parameter int unsigned FlaSel     = 5;
-  parameter int unsigned OtpSel     = 6;
-  parameter int unsigned Ot0Sel     = 7;
-  parameter int unsigned Ot1Sel     = 8;
-  parameter int unsigned Ot2Sel     = 9;
-  parameter int unsigned Ot3Sel     = 10;
-  parameter int unsigned Ot4Sel     = 11;
-  parameter int unsigned Ot5Sel     = 12;
-  //
-  parameter int unsigned EntropyStreams  = 4;
-  parameter int unsigned AdcChannels     = 2;
-  parameter int unsigned AdcDataWidth    = 10;
-  parameter int unsigned UsbCalibWidth   = 20;
-  parameter int unsigned Ast2PadOutWidth = 9;
-  parameter int unsigned Pad2AstInWidth  = 7;
+// Alerts
+parameter int unsigned NumAlerts  = 13;
+parameter int unsigned NumIoRails = 2;
+parameter int unsigned AsSel      = 0;
+parameter int unsigned CgSel      = 1;
+parameter int unsigned GdSel      = 2;
+parameter int unsigned TsHiSel    = 3;
+parameter int unsigned TsLoSel    = 4;
+parameter int unsigned FlaSel     = 5;
+parameter int unsigned OtpSel     = 6;
+parameter int unsigned Ot0Sel     = 7;
+parameter int unsigned Ot1Sel     = 8;
+parameter int unsigned Ot2Sel     = 9;
+parameter int unsigned Ot3Sel     = 10;
+parameter int unsigned Ot4Sel     = 11;
+parameter int unsigned Ot5Sel     = 12;
+//
+parameter int unsigned EntropyStreams  = 4;
+parameter int unsigned AdcChannels     = 2;
+parameter int unsigned AdcDataWidth    = 10;
+parameter int unsigned UsbCalibWidth   = 20;
+parameter int unsigned Ast2PadOutWidth = 9;
+parameter int unsigned Pad2AstInWidth  = 7;
 
-  // These LFSR parameters have been generated with
-  // $ ./util/design/gen-lfsr-seed.py --width 64 --seed 691876113 --prefix ""
-  parameter int LfsrWidth = 64;
-  typedef logic [LfsrWidth-1:0] lfsr_seed_t;
-  typedef logic [LfsrWidth-1:0][$clog2(LfsrWidth)-1:0] lfsr_perm_t;
-  parameter lfsr_seed_t RndCnstLfsrSeedDefault = 64'h22d326255bd24320;
-  parameter lfsr_perm_t RndCnstLfsrPermDefault = {
-    128'h16108c9f9008aa37e5118d1ec1df64a7,
-    256'h24f3f1b73537f42d38383ee8f897286df81d49ab54b6bbbb666cbd1a16c41252
-  };
+// These LFSR parameters have been generated with
+// $ ./util/design/gen-lfsr-seed.py --width 64 --seed 691876113 --prefix ""
+parameter int LfsrWidth = 64;
+typedef logic [LfsrWidth-1:0] lfsr_seed_t;
+typedef logic [LfsrWidth-1:0][$clog2(LfsrWidth)-1:0] lfsr_perm_t;
+parameter lfsr_seed_t RndCnstLfsrSeedDefault = 64'h22d326255bd24320;
+parameter lfsr_perm_t RndCnstLfsrPermDefault = {
+  128'h16108c9f9008aa37e5118d1ec1df64a7,
+  256'h24f3f1b73537f42d38383ee8f897286df81d49ab54b6bbbb666cbd1a16c41252
+};
 
-  // Memories Read-Write Margin Interface
-  typedef struct packed {
-    logic          marg_en_a;
-    logic [4-1:0]  marg_a;
-    logic          marg_en_b;
-    logic [4-1:0]  marg_b;
-  } dpm_rm_t;
+// Memories Read-Write Margin Interface
+typedef struct packed {
+  logic          marg_en_a;
+  logic [4-1:0]  marg_a;
+  logic          marg_en_b;
+  logic [4-1:0]  marg_b;
+} dpm_rm_t;
 
-  typedef struct packed {
-    logic          marg_en;
-    logic [4-1:0]  marg;
-  } spm_rm_t;
+typedef struct packed {
+  logic          marg_en;
+  logic [4-1:0]  marg;
+} spm_rm_t;
 
-  // ADC Interface
-  typedef struct packed {
-    logic [AdcChannels-1:0] channel_sel;
-    logic pd;
-  } adc_ast_req_t;
+// ADC Interface
+typedef struct packed {
+  logic [AdcChannels-1:0] channel_sel;
+  logic pd;
+} adc_ast_req_t;
 
-  typedef struct packed {
-    logic [AdcDataWidth-1:0] data;
-    logic data_valid;
-  } adc_ast_rsp_t;
+typedef struct packed {
+  logic [AdcDataWidth-1:0] data;
+  logic data_valid;
+} adc_ast_rsp_t;
 
-  // Analog Signal
+// Analog Signal
   `ifdef ANALOGSIM
-  typedef real  awire_t;
+typedef real  awire_t;
   `else
-  typedef logic awire_t;
+typedef logic awire_t;
   `endif
 
-  // Clock & Resets Interface
-  typedef struct packed {
-    logic clk_sys;
-    logic clk_io;
-    logic clk_usb;
-    logic clk_aon;
-  } ast_clks_t;
+// Clock & Resets Interface
+typedef struct packed {
+  logic clk_sys;
+  logic clk_io;
+  logic clk_usb;
+  logic clk_aon;
+} ast_clks_t;
 
-  typedef struct packed {
-    logic aon_pok;
-  } ast_rst_t;
+typedef struct packed {
+  logic aon_pok;
+} ast_rst_t;
 
-  parameter ast_rst_t AST_RST_DEFAULT = '{
-    aon_pok: 1'b1
-  };
+parameter ast_rst_t AST_RST_DEFAULT = '{
+  aon_pok: 1'b1
+};
 
-  typedef struct packed {
-    logic [NumIoRails-1:0] io_pok;
-  } ast_status_t;
+typedef struct packed {
+  logic [NumIoRails-1:0] io_pok;
+} ast_status_t;
 
-  typedef struct packed {
-    logic                  aon_pok;
-    logic                  vcc_pok;
-    logic                  main_pok;
-    logic [NumIoRails-1:0] io_pok;
-  } ast_pwst_t;
+typedef struct packed {
+  logic                  aon_pok;
+  logic                  vcc_pok;
+  logic                  main_pok;
+  logic [NumIoRails-1:0] io_pok;
+} ast_pwst_t;
 
-  // Alerts Interface
-  typedef struct packed {
-    logic        p;
-    logic        n;
-  } ast_dif_t;
+// Alerts Interface
+typedef struct packed {
+  logic        p;
+  logic        n;
+} ast_dif_t;
 
-  typedef struct packed {
-    ast_dif_t [NumAlerts-1:0] alerts;
-  } ast_alert_req_t;
+typedef struct packed {
+  ast_dif_t [NumAlerts-1:0] alerts;
+} ast_alert_req_t;
 
-  typedef struct packed {
-    ast_dif_t [NumAlerts-1:0] alerts_ack;
-    ast_dif_t [NumAlerts-1:0] alerts_trig;
-  } ast_alert_rsp_t;
+typedef struct packed {
+  ast_dif_t [NumAlerts-1:0] alerts_ack;
+  ast_dif_t [NumAlerts-1:0] alerts_trig;
+} ast_alert_rsp_t;
 
-  // Ack mode enumerations
-  typedef enum logic {
-    ImmAck = 0,
-    SwAck  = 1
-  } ast_ack_mode_e;
+// Ack mode enumerations
+typedef enum logic {
+  ImmAck = 0,
+  SwAck  = 1
+} ast_ack_mode_e;
 
-  // Clocks Oschillator Bypass
-  typedef struct packed {
-    logic     usb;
-    logic     sys;
-    logic     io;
-    logic     aon;
-  } clks_osc_byp_t;
+// Clocks Oschillator Bypass
+typedef struct packed {
+  logic     usb;
+  logic     sys;
+  logic     io;
+  logic     aon;
+} clks_osc_byp_t;
 
 endpackage  // of ast_pkg
 `endif  // of __AST_PKG_SV
diff --git a/hw/top_earlgrey/ip/ast/rtl/gfr_clk_mux2.sv b/hw/top_earlgrey/ip/ast/rtl/gfr_clk_mux2.sv
index 3afd0fc..66ee89c 100644
--- a/hw/top_earlgrey/ip/ast/rtl/gfr_clk_mux2.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/gfr_clk_mux2.sv
@@ -59,7 +59,6 @@
 ////////////////////////////////////////
 logic clk_ext_sel, clk_ext_aoff;
 
-
 always_ff @( posedge clk_ext_i, negedge rst_clk_ext_ni ) begin
   if ( !rst_clk_ext_ni ) begin
     clk_ext_sel  <= 1'b0;
@@ -91,7 +90,7 @@
 prim_clock_gating #(
   .NoFpgaGate ( 1'b1)
 ) u_clk_osc_ckgt (
-  .clk_i ( clk_osc_i && rst_clk_osc_ni ),
+  .clk_i ( clk_osc_i ),
   .en_i ( clk_osc_en_o ),
   .test_en_i ( 1'b0 ),
   .clk_o ( clk_osc )
@@ -100,7 +99,7 @@
 prim_clock_gating #(
   .NoFpgaGate ( 1'b1)
 ) u_clk_byp_ckgt (
-  .clk_i ( clk_ext_i && rst_clk_ext_ni ),
+  .clk_i ( clk_ext_i ),
   .en_i ( clk_ext_en_o ),
   .test_en_i ( 1'b0 ),
   .clk_o ( clk_ext )
diff --git a/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv b/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv
index d4b5843..ca993d6 100644
--- a/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv
@@ -22,6 +22,7 @@
   input scan_mode_i,                     // Scan Mode
   output logic vcaon_pok_h_o,            // VCAON (1.1v) Exist @3.3v
   output logic main_pwr_dly_o,           // For modeling only.
+  output logic deep_sleep_h_o,           // Deep Sleep (main regulator & switch are off) @3.3v
   output logic flash_power_down_h_o,     //
   output logic flash_power_ready_h_o,    //
   output logic [1:0] otp_power_seq_h_o   // MMR0,24 masked by PDM, out (VCC)
@@ -104,6 +105,12 @@
 
 
 ///////////////////////////////////////
+// Deep Sleep Indication
+///////////////////////////////////////
+assign deep_sleep_h_o = !(main_pd_h_ni && vcmain_pok_o_h_i);
+
+
+///////////////////////////////////////
 // Flash
 ///////////////////////////////////////
 assign flash_power_down_h_o  = scan_mode_i || !(main_pd_h_ni && vcmain_pok_o_h_i);