[ast] AST update

Signed-off-by: Arnon Sharlin <arnon.sharlin@opentitan.org>
diff --git a/hw/top_earlgrey/ip/ast/ast.core b/hw/top_earlgrey/ip/ast/ast.core
index e73b4a1..9e25354 100644
--- a/hw/top_earlgrey/ip/ast/ast.core
+++ b/hw/top_earlgrey/ip/ast/ast.core
@@ -9,7 +9,10 @@
     depend:
       - lowrisc:ip:tlul
     files:
+      - rtl/lc_ctrl_pkg.sv
       - rtl/ast_reg_pkg.sv
+      - rtl/ast_pkg.sv
+      - rtl/ana_pkg.sv
       - rtl/ast.sv
       - rtl/adc.sv
       - rtl/aon_clk.sv
@@ -20,15 +23,14 @@
       - rtl/gen_pok.sv
       - rtl/io_clk.sv
       - rtl/io_osc.sv
-      - rtl/main_rglt.sv
-      - rtl/pdm.sv
+      - rtl/rglts_pdm_3p3v.sv
       - rtl/rng.sv
       - rtl/rng_osc.sv
       - rtl/sys_clk.sv
       - rtl/sys_osc.sv
       - rtl/usb_clk.sv
       - rtl/usb_osc.sv
-
+      
     file_type: systemVerilogSource
 
 
@@ -55,3 +57,4 @@
       vcs:
         vcs_options: [-timescale=1ns/1ps]
     toplevel: ast
+  
diff --git a/hw/top_earlgrey/ip/ast/data/ast.hjson b/hw/top_earlgrey/ip/ast/data/ast.hjson
index 414bb88..10f51f7 100644
--- a/hw/top_earlgrey/ip/ast/data/ast.hjson
+++ b/hw/top_earlgrey/ip/ast/data/ast.hjson
@@ -1,6 +1,10 @@
 // Copyright lowRISC contributors.
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
+//#############################################################################
+// *Name: ast
+// *Module Description: Analog Sensors Top Registers
+//#############################################################################
 { name: "ast",
   clock_primary: "clk_i",
   bus_device: "tlul",
@@ -10,7 +14,7 @@
     { name: "RWTYPE0",
       desc: "RW type with one field",
       swaccess: "rw",
-      hwaccess: "hro",
+      hwaccess: "hrw",
       fields: [
         {
           bits: "31:0",
diff --git a/hw/top_earlgrey/ip/ast/doc/ast_regs.html b/hw/top_earlgrey/ip/ast/doc/ast_regs.html
new file mode 100644
index 0000000..9a170c9
--- /dev/null
+++ b/hw/top_earlgrey/ip/ast/doc/ast_regs.html
@@ -0,0 +1,35 @@
+<table class="regdef" id="Reg_rwtype0">
+<tr><th class="regdef" colspan=5><div>ast.RWTYPE0 @ + 0x0</div><div>RW type with one field</div><div>Reset default = 0xbc614e, mask 0xffffffff</div></th></tr>
+<tr><td colspan=5><table class="regpic"><tr><td class="bitnum">31</td><td class="bitnum">30</td><td class="bitnum">29</td><td class="bitnum">28</td><td class="bitnum">27</td><td class="bitnum">26</td><td class="bitnum">25</td><td class="bitnum">24</td><td class="bitnum">23</td><td class="bitnum">22</td><td class="bitnum">21</td><td class="bitnum">20</td><td class="bitnum">19</td><td class="bitnum">18</td><td class="bitnum">17</td><td class="bitnum">16</td></tr><tr><td class="fname" colspan=16>RWTYPE0...</td>
+</tr>
+<tr><td class="bitnum">15</td><td class="bitnum">14</td><td class="bitnum">13</td><td class="bitnum">12</td><td class="bitnum">11</td><td class="bitnum">10</td><td class="bitnum">9</td><td class="bitnum">8</td><td class="bitnum">7</td><td class="bitnum">6</td><td class="bitnum">5</td><td class="bitnum">4</td><td class="bitnum">3</td><td class="bitnum">2</td><td class="bitnum">1</td><td class="bitnum">0</td></tr><tr><td class="fname" colspan=16>...RWTYPE0</td>
+</tr></table></td></tr>
+<tr><th width=5%>Bits</th><th width=5%>Type</th><th width=5%>Reset</th><th>Name</th><th>Description</th></tr><tr><td class="regbits">31:0</td><td class="regperm">rw</td><td class="regrv">0xbc614e</td><td class="regfn">RWTYPE0</td><td class="regde">field description
+</td></tr>
+</table>
+<br><br>
+<table class="regdef" id="Reg_rwtype1">
+<tr><th class="regdef" colspan=5><div>ast.RWTYPE1 @ + 0x4</div><div>RW type
+with long
+description
+and multiple fields</div><div>Reset default = 0x6411, mask 0xff13</div></th></tr>
+<tr><td colspan=5><table class="regpic"><tr><td class="bitnum">31</td><td class="bitnum">30</td><td class="bitnum">29</td><td class="bitnum">28</td><td class="bitnum">27</td><td class="bitnum">26</td><td class="bitnum">25</td><td class="bitnum">24</td><td class="bitnum">23</td><td class="bitnum">22</td><td class="bitnum">21</td><td class="bitnum">20</td><td class="bitnum">19</td><td class="bitnum">18</td><td class="bitnum">17</td><td class="bitnum">16</td></tr><tr><td class="unused" colspan=16>&nbsp;</td>
+</tr>
+<tr><td class="bitnum">15</td><td class="bitnum">14</td><td class="bitnum">13</td><td class="bitnum">12</td><td class="bitnum">11</td><td class="bitnum">10</td><td class="bitnum">9</td><td class="bitnum">8</td><td class="bitnum">7</td><td class="bitnum">6</td><td class="bitnum">5</td><td class="bitnum">4</td><td class="bitnum">3</td><td class="bitnum">2</td><td class="bitnum">1</td><td class="bitnum">0</td></tr><tr><td class="fname" colspan=8>FIELD15_8</td>
+<td class="unused" colspan=3>&nbsp;</td>
+<td class="fname" colspan=1 style="font-size:50.0%">FIELD4</td>
+<td class="unused" colspan=2>&nbsp;</td>
+<td class="fname" colspan=1 style="font-size:50.0%">FIELD1</td>
+<td class="fname" colspan=1 style="font-size:50.0%">FIELD0</td>
+</tr></table></td></tr>
+<tr><th width=5%>Bits</th><th width=5%>Type</th><th width=5%>Reset</th><th>Name</th><th>Description</th></tr><tr><td class="regbits">0</td><td class="regperm">rw</td><td class="regrv">0x1</td><td class="regfn">FIELD0</td><td class="regde">field 0
+</td></tr>
+<tr><td class="regbits">1</td><td class="regperm">rw</td><td class="regrv">0x0</td><td class="regfn">FIELD1</td><td class="regde">field 1
+</td></tr>
+<tr><td class="regbits">3:2</td><td></td><td></td><td></td><td>Reserved</td></tr><tr><td class="regbits">4</td><td class="regperm">rw</td><td class="regrv">0x1</td><td class="regfn">FIELD4</td><td class="regde">field 4
+</td></tr>
+<tr><td class="regbits">7:5</td><td></td><td></td><td></td><td>Reserved</td></tr><tr><td class="regbits">15:8</td><td class="regperm">rw</td><td class="regrv">0x64</td><td class="regfn">FIELD15_8</td><td class="regde">field [15:8]
+</td></tr>
+</table>
+<br><br>
+
diff --git a/hw/top_earlgrey/ip/ast/rtl/adc.sv b/hw/top_earlgrey/ip/ast/rtl/adc.sv
index 9ffbc80..0b089c4 100644
--- a/hw/top_earlgrey/ip/ast/rtl/adc.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/adc.sv
@@ -2,68 +2,103 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: adc
 // *Module Description:  Analog/Digital Converter
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
-module adc #(
-   parameter int AdcDataWidth = 10,
-   parameter int AdcChannels  = 2,
-   parameter int AdcCnvtClks  = 44
+module adc
+  import ana_pkg::*;  // For nettype real awire;
+#(
+  parameter int AdcCnvtClks  = 22,          //JL TODO: Update to actual convertion clock
+  parameter int AdcDataWidth = 10,
+  parameter int AdcChannels  = 2
 ) (
-   input [AdcChannels-1:0] adc_ai,         // One signal per channel
-   input [AdcChannels-1:0] adc_chnsel_i,   // Onehot value only for selrction
-   input adc_pd_i,
-   input clk_adc_i,
-   input rst_adc_ni,
-   output logic [AdcDataWidth-1:0] adc_d_o,
-   output logic adc_d_val_o
+`ifndef VERILATOR
+`ifndef SYNTHESIS
+  input awire adc_a0_ai,                    // ADC A0 Analog Input
+  input awire adc_a1_ai,                    // ADC A1 Analog Input
+`else
+  input wire adc_a0_ai,                     // ADC A0 Analog Input
+  input wire adc_a1_ai,                     // ADC A1 Analog Input
+`endif
+`else
+  input wire adc_a0_ai,                     // ADC A0 Analog Input
+  input wire adc_a1_ai,                     // ADC A1 Analog Input
+`endif
+  input [AdcChannels-1:0] adc_chnsel_i,     // Onehot value only for selrction
+  input adc_pd_i,                           // ADC Power Down
+  input clk_adc_i,                          // ADC Clock (aon_clk - 200KHz)
+  input rst_adc_ni,                         // ADC Reset active low
+  output logic [AdcDataWidth-1:0] adc_d_o,  // ADC 10-bit Data Output
+  output logic adc_d_val_o                  // ADC Data Valid Output
 );
-
+ 
 // Behavioral Model
+integer adc_d_ch0, adc_d_ch1;
+
+`ifndef VERILATOR
+`ifndef SYNTHESIS
+awire vref = 2.3;
+awire adc_vi0, adc_vi1;
+assign adc_vi0 = adc_a0_ai;
+assign adc_vi1 = adc_a1_ai;
+assign adc_d_ch0 = $rtoi( (adc_vi0/vref) * $itor(10'h3ff) );
+assign adc_d_ch1 = $rtoi( (adc_vi1/vref) * $itor(10'h3ff) );
+`else
+assign adc_d_ch0 = 'h31;    // 0.111V
+assign adc_d_ch1 = 'h21f;   // 1.222V
+`endif
+`else
+// Hook for testing for VERILATOR
+assign adc_d_ch0 = 'h31;    // 0.111V
+assign adc_d_ch1 = 'h21f;   // 1.222V
+`endif
+
+logic adc_en;
+
+always_ff @( posedge clk_adc_i, negedge rst_adc_ni ) begin
+  if ( !rst_adc_ni ) adc_en <= 1'b0;
+  else               adc_en <= ~adc_pd_i;
+end
 
 logic [8-1:0] ConvertCount;
-logic [8-1:0] cnv_cnt;
-logic [AdcChannels-1:0] cnv_chnsel;
-logic chn_selected;
-logic rst_pd_adc_n;
-// 2 ahalog channels as digital for testing
-logic [AdcDataWidth-1:0] adc_a_chn0;
-logic [AdcDataWidth-1:0] adc_a_chn1;
+assign ConvertCount = AdcCnvtClks[8-1:0];
 
-assign ConvertCount = AdcCnvtClks[8-1:0];  // 44
-assign adc_a_chn0 = {AdcDataWidth{1'b0}};  // All '0'
-assign adc_a_chn1 = {AdcDataWidth{1'b1}};  // All '1'
-
+logic init_convert, chn_selected, chn_selected_d;
 assign chn_selected = |(adc_chnsel_i[AdcChannels-1:0]);
-assign rst_pd_adc_n = rst_adc_ni && ~adc_pd_i;
 
-always_ff @( posedge clk_adc_i, negedge rst_pd_adc_n ) begin
-   if (!rst_pd_adc_n ) begin
-      cnv_cnt     <= 8'h00;
-      cnv_chnsel  <= {AdcChannels{1'b0}};
-      adc_d_o     <= {AdcDataWidth{1'b0}};
-      adc_d_val_o <= 1'b0;
-   end
-   else if ( !chn_selected ) begin
-      cnv_cnt     <= 8'h00;
-      cnv_chnsel  <= {AdcChannels{1'b0}};
-      adc_d_val_o <= 1'b0;
-   end
-   else if ( cnv_cnt != ConvertCount ) begin
-      cnv_chnsel  <= adc_chnsel_i[AdcChannels-1:0];
-      cnv_cnt     <= cnv_cnt + 1'b1;
-      adc_d_val_o <= 1'b0;
-   end
-   else begin
-      adc_d_o     <= (cnv_chnsel == 2'b00) ? adc_d_o :
-                     (cnv_chnsel == 2'b01) ? adc_a_chn0 :
-                     (cnv_chnsel == 2'b10) ? adc_a_chn1 : {AdcDataWidth{1'bx}};
-      adc_d_val_o <= 1'b1;
-   end
+always_ff @( posedge clk_adc_i ) begin
+  chn_selected_d <= chn_selected;
+end
+
+assign init_convert = chn_selected && ~chn_selected_d;
+
+logic [8-1:0] cnv_cyc;
+logic adc_convert;
+
+always_ff @( posedge clk_adc_i, negedge rst_adc_ni ) begin
+  if (!rst_adc_ni ) begin
+    cnv_cyc     <= 8'h00;
+    adc_d_val_o <= 1'b0;
+    adc_convert <= 1'b0;
+    adc_d_o     <= {AdcDataWidth{1'b0}};
+  end else if ( !(adc_en && chn_selected) ) begin
+    cnv_cyc     <= 8'h00;
+    adc_d_val_o <= 1'b0;
+    adc_convert <= 1'b0;
+  end else if ( init_convert ) begin
+    cnv_cyc     <= ConvertCount;
+    adc_convert <= 1'b1;
+  end else if ( adc_convert && (cnv_cyc > 8'h00) ) begin
+    cnv_cyc     <= cnv_cyc - 1'b1;
+  end else if ( adc_convert ) begin
+    adc_d_val_o <= 1'b1;
+    adc_d_o     <= (adc_chnsel_i == 2'b00) ? adc_d_o :
+                   (adc_chnsel_i == 2'b01) ? adc_d_ch0[10-1:0] :
+                   (adc_chnsel_i == 2'b10) ? adc_d_ch1[10-1:0] :
+                                             {AdcDataWidth{1'bx}};
+  end
 end
 
 
diff --git a/hw/top_earlgrey/ip/ast/rtl/ana_pkg.sv b/hw/top_earlgrey/ip/ast/rtl/ana_pkg.sv
new file mode 100644
index 0000000..4ac5633
--- /dev/null
+++ b/hw/top_earlgrey/ip/ast/rtl/ana_pkg.sv
@@ -0,0 +1,21 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//############################################################################
+// *Name: ana_pkg
+// *Module Description: Analog (nettype) Package
+//############################################################################
+
+`ifdef __ANA_PKG
+`else
+`define __ANA_PKG
+package ana_pkg;
+
+// NETTYPE Definition
+`ifndef VERILATOR
+`ifndef SYNTHESIS
+  nettype real awire;
+`endif
+`endif
+endpackage  // of ana_pkg
+`endif  // of __ANA_PKG
diff --git a/hw/top_earlgrey/ip/ast/rtl/aon_clk.sv b/hw/top_earlgrey/ip/ast/rtl/aon_clk.sv
index acbd045..bd30e4a 100644
--- a/hw/top_earlgrey/ip/ast/rtl/aon_clk.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/aon_clk.sv
@@ -2,46 +2,57 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: aon_clk
 // *Module Description: Always ON Clock
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module aon_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time AON_EN_RDLY = 10us,
-   parameter time AON_EN_FDLY = 100ns
+  parameter time AON_EN_RDLY = 5us
 // synopsys translate_on
+`endif
 ) (
-   input rst_ni,                   // Reset
-   output logic clk_src_aon_o,     // AON Source Clock
-   output logic clk_src_aon_val_o  // AON Source Clock Valid
+  input vcaon_pok_i,              // 1.1v VCAON POK
+  output logic clk_src_aon_o,     // AON Source Clock
+  output logic clk_src_aon_val_o  // AON Source Clock Valid
 );
 
-logic clk, clk_en, aon_en;
+logic clk, aon_clk_en, aon_clk_val, aon_en, rst_n;
+assign aon_en = 1'b1;  // AON Clock is always enabled!
 
 // Behavioral Model
+assign rst_n = vcaon_pok_i;
+
 aon_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .AON_EN_RDLY ( AON_EN_RDLY ),
-/*P*/ .AON_EN_FDLY ( AON_EN_FDLY )
+/*P*/ .AON_EN_RDLY ( AON_EN_RDLY )
 // synopsys translate_on
+`endif
 ) i_aon_osc (
-/*I*/ .aon_en_i ( 1'b1 ),  // AON Clock is always enabled!
-/*O*/ .aon_clk_o ( clk ),
-/*O*/ .aon_clk_en_o ( aon_en )
+/*I*/ .vcaon_pok_i ( vcaon_pok_i ),
+/*I*/ .aon_en_i ( aon_en ),
+/*O*/ .aon_clk_o ( clk )
 );
 
-always_ff @( posedge clk, negedge rst_ni ) begin
-   if ( !rst_ni )  clk_en <= 1'b0;
-   else            clk_en <= aon_en;
-end
 
 // Clock & Valid
-assign clk_src_aon_o = clk_en ? ~clk : 1'b0;
-assign clk_src_aon_val_o = clk_en;
+assign clk_src_aon_o = clk;
+
+wire rst_val_n = rst_n;
+
+// 2-stage deassertion
+always_ff @( posedge clk, negedge rst_val_n ) begin
+  if ( !rst_val_n )  begin
+    aon_clk_val       <= 1'b0;
+    clk_src_aon_val_o <= 1'b0;
+  end else begin
+    aon_clk_val       <= 1'b1;
+    clk_src_aon_val_o <= aon_clk_val;
+  end
+end
 
 
 endmodule  // of aon_clk
diff --git a/hw/top_earlgrey/ip/ast/rtl/aon_osc.sv b/hw/top_earlgrey/ip/ast/rtl/aon_osc.sv
index cef8bbc..ac785f6 100644
--- a/hw/top_earlgrey/ip/ast/rtl/aon_osc.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/aon_osc.sv
@@ -2,56 +2,54 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: aon_osc
 // *Module Description: AON Clock Oscilator
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module aon_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time AON_EN_RDLY = 10us,
-   parameter time AON_EN_FDLY = 100ns
+  parameter time AON_EN_RDLY = 5us
 // synopsys translate_on
+`endif
 ) (
-   input aon_en_i,              // AON Source Clock Enable
-   output logic aon_clk_o,      // AON Clock Output
-   output logic aon_clk_en_o    // AON Clock Enable Output
+  input vcaon_pok_i,       // VCAON POK @1.1V
+  input aon_en_i,          // AON Source Clock Enable
+  output logic aon_clk_o   // AON Clock Output
 );
 
+`ifndef VERILATOR
 // synopsys translate_off
-
-// localparam real AON_CLK_PERIOD = 5000; // 5000ns (200Khz)
-// TBD
-// sped up to 200ns by default.
-// There should be a DV hook here so that the test can choose the actual frequency
-   localparam real AON_CLK_PERIOD = 200;
-
-logic init_start, clk;
+localparam time AON_CLK_PERIOD = 5000ns; // 5000ns (200Khz)
+logic clk, en_osc, en_osc_re, en_osc_fe;
 
 initial begin
-   clk = 1'b0;
-   $display("\nAON Clock Period: %0dns", AON_CLK_PERIOD);
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
+  clk = 1'b0;
+  $display("\nAON Clock Period: %0dns", AON_CLK_PERIOD);
 end
 
+always @( * ) begin
+  if ( !vcaon_pok_i )                 en_osc_re = 1'b0;
+  else if ( aon_en_i && vcaon_pok_i ) en_osc_re = #(AON_EN_RDLY) 1'b1;
+  else                                en_osc_re = 1'b0;
+end
+
+// Syncronize en_osc_fe to clk FE for glitch free disable
+always_ff @( negedge clk or negedge vcaon_pok_i ) begin
+  if ( !vcaon_pok_i ) en_osc_fe <= 1'b0;
+  else                en_osc_fe <= en_osc_re;
+end
+
+assign en_osc = en_osc_re || en_osc_fe;  // EN -> 1 || EN -> 0
+
 always begin
-   #(AON_CLK_PERIOD/2) clk = ~clk;
+  #(AON_CLK_PERIOD/2) clk = ~clk && en_osc;
 end
 
 assign aon_clk_o = clk;
-
-always_ff @( init_start, posedge aon_en_i, negedge aon_en_i ) begin
-    if ( init_start )
-       aon_clk_en_o <= 1'b0;
-    else if ( !init_start && aon_en_i )
-       aon_clk_en_o <= #(AON_EN_RDLY) aon_en_i;
-    else if ( !init_start && !aon_en_i )
-       aon_clk_en_o <= #(AON_EN_FDLY) aon_en_i;
-end
-
 // synopsys translate_on
+`endif
+
 
 endmodule  // of aon_osc
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast.sv b/hw/top_earlgrey/ip/ast/rtl/ast.sv
index 3ef2150..bbddd0d 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast.sv
@@ -2,203 +2,201 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: ast
 // *Module Description: Analog Sensors Top
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
-module ast #(
-   parameter int EntropyStreams  = 4,
-   parameter int EntropyInWidth  = 1,
-   parameter int AdcChannels     = 2,
-   parameter int AdcDataWidth    = 10,
-   parameter int Ast2PadOutWidth = 16,         // TBD
-   parameter int Pad2AstInWidth  = 16,         // TBD
-   parameter int JitCalibWidth   = 16,         // TBD
-   parameter int JitSRateWidth   = 16,         // TBD
-   parameter int UsbCalibWidth   = 16          // TBD
+module ast
+  import ana_pkg::*;
+  import lc_ctrl_pkg::*;
+#(
+  parameter int EntropyStreams  = 4,
+  parameter int AdcChannels     = 2,
+  parameter int AdcDataWidth    = 10,
+  parameter int Ast2PadOutWidth = 16,         // TBD
+  parameter int Pad2AstInWidth  = 16,         // TBD
+  parameter int UsbCalibWidth   = 16          // TBD
 ) (
-   // Power and IO pin connections
-   input main_iso_en_i,                        // Isolation enable for main core power (VCMAIN).
+ 
+  // tlul if
+  input  tlul_pkg::tl_h2d_t tl_i,             // TLUL H2D 
+  output tlul_pkg::tl_d2h_t tl_o,             // TLUL D2H
 
-   // tlul if
-   input  tlul_pkg::tl_h2d_t tl_i,             // TLUL H2D
-   output tlul_pkg::tl_d2h_t tl_o,             // TLUL D2H
+  // LC TX if
+  input lc_ctrl_pkg::lc_tx_t lc_root_clk_byp_i,  // External clock mux override for OTP bootstrap
+  input lc_ctrl_pkg::lc_tx_t lc_dft_en_i,     // DFT enable 
 
-   // clocks / rests
-   input clk_ast_adc_i,                        // Buffered AST ADC Clock
-   input rst_ast_adc_ni,                       // Buffered AST ADC Reset
-   input clk_ast_alert_i,                      // Buffered AST Alert Clock
-   input rst_ast_alert_ni,                     // Buffered AST Alert Reset
-   input clk_ast_es_i,                         // Buffered AST Entropy Source Clock
-   input rst_ast_es_ni,                        // Buffered AST Entropy Source Reset
-   input clk_ast_rng_i,                        // Buffered AST RNG Clock
-   input rst_ast_rng_ni,                       // Buffered AST RNG Reset
-   input clk_ast_tlul_i,                       // Buffered AST TLUL Clock
-   input rst_ast_tlul_ni,                      // Buffered AST TLUL Reset
-   input clk_ast_usb_i,                        // Buffered AST USB Clock
-   input rst_ast_usb_ni,                       // Buffered AST USB Reset
-   input clk_ast_ext_i,                        // Buffered AST External Clock
-   input por_ni,                               // Power ON Reset
+  // clocks / rests
+  input clk_ast_adc_i,                        // Buffered AST ADC Clock
+  input rst_ast_adc_ni,                       // Buffered AST ADC Reset
+  input clk_ast_alert_i,                      // Buffered AST Alert Clock
+  input rst_ast_alert_ni,                     // Buffered AST Alert Reset
+  input clk_ast_es_i,                         // Buffered AST Entropy Source Clock
+  input rst_ast_es_ni,                        // Buffered AST Entropy Source Reset
+  input clk_ast_rng_i,                        // Buffered AST RNG Clock
+  input rst_ast_rng_ni,                       // Buffered AST RNG Reset
+  input clk_ast_tlul_i,                       // Buffered AST TLUL Clock
+  input rst_ast_tlul_ni,                      // Buffered AST TLUL Reset
+  input clk_ast_usb_i,                        // Buffered AST USB Clock
+  input rst_ast_usb_ni,                       // Buffered AST USB Reset
+  input clk_ast_ext_i,                        // Buffered AST External Clock
+  input por_ni,                               // Power ON Reset
 
-   // power OK control
-   // In non-power aware DV environment, the <>_supp_i is for debug only!
-   // POK signal follow this input.
-   // In a power aware environment this signal should be connected to constant '1'
-   input vcc_supp_i,                           // VCC Supply Test
-   input vcaon_supp_i,                         // VCAON Supply Test
-   input vcmain_supp_i,                        // VCMAIN Supply Test
-   input vioa_supp_i,                          // VIOA Rail Supply Test
-   input viob_supp_i,                          // VIOB Rail Supply Test
-   output logic vcaon_pok_o,                   // VCAON Power OK
-   output logic vcmain_pok_o,                  // VCMAIN Power OK
-   output logic vioa_pok_o,                    // VIOA Rail Power OK
-   output logic viob_pok_o,                    // VIOB Rail Power OK
+  // power OK control 
+  // In non-power aware DV environment, the <>_supp_i is for debug only! 
+  // POK signal follow this input.
+  // In a power aware environment this signal should be connected to constant '1'
+  input vcc_supp_i,                           // VCC Supply Test for OS FPGA 
+  input vcaon_supp_i,                         // VCAON Supply Test for OS FPGA
+  input vcmain_supp_i,                        // VCMAIN Supply Test for OS FPGA
+  input vioa_supp_i,                          // VIOA Rail Supply Test for OS FPGA
+  input viob_supp_i,                          // VIOB Rail Supply Test for OS FPGA
+  output logic vcaon_pok_o,                   // VCAON Power OK
+  output logic vcmain_pok_o,                  // VCMAIN Power OK
+  output logic vioa_pok_o,                    // VIOA Rail Power OK
+  output logic viob_pok_o,                    // VIOB Rail Power OK
+ 
+  // Power and IO pin connections
+  input main_pd_ni,                           // MAIN Regulator Power Down
+  input main_iso_en_i,                        // Isolation enable for main core power (VCMAIN).
 
-   // main regulator
-   input main_pd_ni,                           // MAIN Regulator Power Down
+  // power down monitor logic - flash/otp related
+  output logic flash_power_down_h_o,          // Flash Power Down
+  output logic flash_power_ready_h_o,         // Flash Power Ready
+  input [1:0] otp_power_seq_i,                // MMR0,24 in (VDD)
+  output logic [1:0] otp_power_seq_h_o,       // MMR0,24 masked by PDM, out (VCC)
 
-   // power down monitor logic - flash related
-   output logic flash_power_down_h_o,          // Flash Power Down
-   output logic flash_power_ready_h_o,         // Flash Power Ready
+  // system source clock
+  input clk_src_sys_en_i,                     // SYS Source Clock Enable
+  input clk_src_sys_jen_i,                    // SYS Source Clock Jitter Enable
+  output logic clk_src_sys_o,                 // SYS Source Clock
+  output logic clk_src_sys_val_o,             // SYS Source Clock Valid
 
-   // system source clock
-   input clk_src_sys_en_i,                     // SYS Source Clock Enable
-   input clk_src_sys_jen_i,                    // SYS Source Clock Jitter Enable
-   output logic clk_src_sys_o,                 // SYS Source Clock
-   output logic clk_src_sys_val_o,             // SYS Source Clock Valid
+  // aon source clock
+  output logic clk_src_aon_o,                 // AON Source Clock
+  output logic clk_src_aon_val_o,             // AON Source Clock Valid
 
-   // aon source clock
-   output logic clk_src_aon_o,                 // AON Source Clock
-   output logic clk_src_aon_val_o,             // AON Source Clock Valid
+  // io source clock
+  input clk_src_io_en_i,                      // IO Source Clock Enable
+  output logic clk_src_io_o,                  // IO Source Clock
+  output logic clk_src_io_val_o,              // IO Source Clock Valid
 
-   // io source clock
-   input clk_src_io_en_i,                      // IO Source Clock Enable
-   output logic clk_src_io_o,                  // IO Source Clock
-   output logic clk_src_io_val_o,              // IO Source Clock Valid
+  // usb source clock
+  input usb_ref_pulse_i,                      // USB Reference Pulse
+  input usb_ref_val_i,                        // USB Reference Valid 
+  input clk_src_usb_en_i,                     // USB Source Clock Enable
+  output logic clk_src_usb_o,                 // USB Source Clock
+  output logic clk_src_usb_val_o,             // USB Source Clock Valid
+  output logic [UsbCalibWidth-1:0] usb_io_pu_cal_o,  // USB IO Pull-up Calibration Setting 
 
-   // usb source clock
-   input usb_ref_pulse_i,                      // USB Reference Pulse
-   input usb_ref_val_i,                        // USB Reference Valid
-   input clk_src_usb_en_i,                     // USB Source Clock Enable
-   output logic clk_src_usb_o,                 // USB Source Clock
-   output logic clk_src_usb_val_o,             // USB Source Clock Valid
-   output logic [UsbCalibWidth-1:0] usb_io_pu_cal_o,  // USB IO Pull-up Calibration Setting
+  // adc interface
+  input adc_pd_i,                             // ADC Power Down
+`ifndef VERILATOR
+`ifndef SYNTHESIS
+  input awire adc_a0_ai,                      // ADC A0 Analog Input
+  input awire adc_a1_ai,                      // ADC A1 Analog Input
+`else
+  input wire adc_a0_ai,                       // ADC A0 Analog Input
+  input wire adc_a1_ai,                       // ADC A1 Analog Input
+`endif
+`else
+  input wire adc_a0_ai,                       // ADC A0 Analog Input
+  input wire adc_a1_ai,                       // ADC A1 Analog Input
+`endif
+  input [AdcChannels-1:0] adc_chnsel_i,       // ADC Channel Select 
+  output [AdcDataWidth-1:0] adc_d_o,          // ADC Digital (per channel)
+  output adc_d_val_o,                         // ADC Digital Valid
 
-   // adc interface
-   input adc_pd_i,                             // ADC Power Down
-   input [AdcChannels-1:0] adc_ai,             // ADC Analog (per channel)
-   input [AdcChannels-1:0] adc_chnsel_i,       // ADC Channel Select
-   output [AdcDataWidth-1:0] adc_d_o,          // ADC Digital (per channel)
-   output adc_d_val_o,                         // ADC Digital Valid
+  // entropy source interface
+  input rng_en_i,                             // RNG Enable
+  output logic rng_val_o,                     // RNG Valid
+  output logic [EntropyStreams-1:0] rng_b_o,  // RNG Bit(s)
 
-   // entropy source interface
-   input rng_en_i,                             // RNG Enable
-   output logic rng_ok_o,                      // RNG OK
-   output logic [EntropyStreams-1:0] rng_b_o,  // RNG Bit(s)
+  // entropy distribution interface
+  input entropy_ack_i,                        // Entropy Acknowlage
+  input entropy_i,                            // Entropy
+  output logic entropy_req_o,                 // Entropy Request
 
-   // entropy distribution interface
-   input entropy_ack_i,                        // Entropy Acknowlage
-   input [EntropyInWidth-1:0] entropy_i,       // Entropy
-   output logic entropy_req_o,                 // Entropy Request
+  // alerts
+  input as_alert_trig_i,                      // Active Shield Alert Trigger
+  input as_alert_ack_i,                       // Active Shield Alert Acknowlage
+  output logic as_alert_po,                   // Active Shield Alert Positive
+  output logic as_alert_no,                   // Active Shield Alert Negative
 
-   // alerts
-   input as_alert_trig_i,                      // Active Shield Alert Trigger
-   input as_alert_ack_i,                       // Active Shield Alert Acknowlage
-   output logic as_alert_po,                   // Active Shield Alert Positive
-   output logic as_alert_no,                   // Active Shield Alert Negative
+  input cg_alert_trig_i,                      // CG Alert Trigger
+  input cg_alert_ack_i,                       // CG Alert Acknowlage
+  output logic cg_alert_po,                   // CG Alert Positive
+  output logic cg_alert_no,                   // CG Alert Negative
 
-   input cg_alert_trig_i,                      // CG Alert Trigger
-   input cg_alert_ack_i,                       // CG Alert Acknowlage
-   output logic cg_alert_po,                   // CG Alert Positive
-   output logic cg_alert_no,                   // CG Alert Negative
+  input gd_alert_trig_i,                      // GD Alert Trigger
+  input gd_alert_ack_i,                       // GD Alert Acknowlage
+  output logic gd_alert_po,                   // GD Alert Positive
+  output logic gd_alert_no,                   // GD Alert Negative
 
-   input gd_alert_trig_i,                      // GD Alert Trigger
-   input gd_alert_ack_i,                       // GD Alert Acknowlage
-   output logic gd_alert_po,                   // GD Alert Positive
-   output logic gd_alert_no,                   // GD Alert Negative
+  input ts_alert_hi_trig_i,                   // TS High Alert Trigger
+  input ts_alert_hi_ack_i,                    // TS High Alert Acknowlage
+  output logic ts_alert_hi_po,                // TS High Alert Positive
+  output logic ts_alert_hi_no,                // TS High Alert Negative
 
-   input ts_alert_hi_trig_i,                   // TS High Alert Trigger
-   input ts_alert_hi_ack_i,                    // TS High Alert Acknowlage
-   output logic ts_alert_hi_po,                // TS High Alert Positive
-   output logic ts_alert_hi_no,                // TS High Alert Negative
+  input ts_alert_lo_trig_i,                   // TS Low Alert Trigger
+  input ts_alert_lo_ack_i,                    // TS Low Alert Acknowlage
+  output logic ts_alert_lo_po,                // TS Low Alert Positive
+  output logic ts_alert_lo_no,                // TS Low Alert Negative
 
-   input ts_alert_lo_trig_i,                   // TS Low Alert Trigger
-   input ts_alert_lo_ack_i,                    // TS Low Alert Acknowlage
-   output logic ts_alert_lo_po,                // TS Low Alert Positive
-   output logic ts_alert_lo_no,                // TS Low Alert Negative
+  input ls_alert_trig_i,                      // LS Alert Trigger
+  input ls_alert_ack_i,                       // LS Alert Acknowlage
+  output logic ls_alert_po,                   // LS Alert Positive
+  output logic ls_alert_no,                   // LS Alert Negative
 
-   input ls_alert_trig_i,                      // LS Alert Trigger
-   input ls_alert_ack_i,                       // LS Alert Acknowlage
-   output logic ls_alert_po,                   // LS Alert Positive
-   output logic ls_alert_no,                   // LS Alert Negative
+  input ot_alert_trig_i,                      // OT Alert Trigger
+  input ot_alert_ack_i,                       // OT Alert Acknowlage
+  output logic ot_alert_po,                   // OT Alert Positive
+  output logic ot_alert_no,                   // OT Alert Negative
+  
+  // pad mux related - DFT
+  input [Pad2AstInWidth-1:0] padmux2ast_i,    // IO_2_DFT Input Signals
+  output logic [Ast2PadOutWidth-1:0] ast2padmux_o,   // DFT_2_IO Output Signals
+  inout wire ast2pad_a_io,                    // TODO: If needed, add width param
 
-   input ot_alert_trig_i,                      // OT Alert Trigger
-   input ot_alert_ack_i,                       // OT Alert Acknowlage
-   output logic ot_alert_po,                   // OT Alert Positive
-   output logic ot_alert_no,                   // OT Alert Negative
-
-   // pad mux related - DFT
-   input [Pad2AstInWidth-1:0] padmux2ast_i,    // IO_2_DFT Input Signals
-   output logic [Ast2PadOutWidth-1:0] ast2padmux_o,   // DFT_2_IO Output Signals
-   inout wire ast2pad_a_io,                    // TODO: If needed, add width param
-
-   // Scan
-   input scan_mode_i,                          // Scan Mode
-   input scan_reset_ni                         // Scan Reset
+  // Scan
+  input scan_mode_i,                          // Scan Mode
+  input scan_reset_ni                         // Scan Reset
 );
 
+import ast_pkg::*;
 import ast_reg_pkg::*;
 
-// To HW
-/*O*/ ast_reg_pkg::ast_reg2hw_t reg2hw; // Write
-
-logic vcaon_pok, vcaon_pok_h;
+logic vcaon_pok, vcaon_pok_h; 
 
 
 
 /////////////////////////////////
 // Power OK
 /////////////////////////////////
-// Local signals for testing hook
-logic vcc_a;     assign vcc_a = 1'b1;
-logic vioa_a;    assign vioa_a = 1'b1;
-logic viob_a;    assign viob_a = 1'b1;
-logic vcaon_a;   assign vcaon_a = 1'b1;
-logic vcmain_a;  assign vcmain_a = 1'b1;
-
-logic vcc_pok_h, vcc_pok;
 
 // VCC POK
+logic vcc_pok_h, vcc_pok;
 gen_pok #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .POK_RDLY ( 3us ),
-/*P*/ .POK_FDLY ( 500ns )
+/*P*/ .POK_RDLY ( VCC_POK_RDLY ), 
+/*P*/ .POK_FDLY ( VCC_POK_FDLY ) 
 // synopsys translate_on
+`endif
 ) i_vcc_pok (
-/*I*/ .gen_supp_a ( vcc_a ),
-/*I*/ .gen_supp_i ( vcc_supp_i ),
-/*O*/ .gen_pok_o ( vcc_pok_h )
+/*O*/ .gen_pok_o ( vcc_pok_int )
 );
 
-assign vcc_pok = vcc_pok_h;  // "Level Shifter"
-
-logic vcmain_pok, vcmain_pok_h;
+assign vcc_pok = vcc_pok_int && vcc_supp_i;
+assign vcc_pok_h = vcc_pok;     // "Level Shifter"
 
 
 // VCAON POK
-gen_pok #(
-// synopsys translate_off
-/*P*/ .POK_RDLY ( 3us ),
-/*P*/ .POK_FDLY ( 500ns )
-// synopsys translate_on
-) i_vcaon_pok (
-/*I*/ .gen_supp_a ( vcaon_a ),
-/*I*/ .gen_supp_i ( vcaon_supp_i ),
-/*O*/ .gen_pok_o ( vcaon_pok )
-);
+logic vcmain_pok, vcmain_pok_h; 
+logic vcaon_pok_int, vcaon_pok_int_h;
+assign vcaon_pok   = vcaon_pok_int && vcaon_supp_i;
+assign vcaon_pok_h = vcaon_pok_int_h && vcaon_supp_i;
 
 // 'por_sync_n' reset deasetion synchronizer output
 logic por_syn_rst_n, por_sync0_n, por_sync_n;
@@ -206,100 +204,104 @@
 assign por_syn_rst_n = por_ni && vcc_pok && vcaon_pok;
 
 always_ff @( posedge clk_src_aon_o, negedge por_syn_rst_n ) begin
-   if ( !por_syn_rst_n ) begin
-      por_sync0_n <= 1'b0;
-      por_sync_n  <= 1'b0;
-   end
-   else begin
-      por_sync0_n <= 1'b1;
-      por_sync_n  <= por_sync0_n;
-   end
+  if ( !por_syn_rst_n ) begin
+    por_sync0_n <= 1'b0;
+    por_sync_n  <= 1'b0;
+  end
+  else begin
+    por_sync0_n <= 1'b1;
+    por_sync_n  <= por_sync0_n;
+  end
 end
 
 assign vcaon_pok_o = por_sync_n && vcc_pok && vcaon_pok;
 
 
 // VCMAIN POK
-
 // Power up/down with rise/fall delays.
-logic main_pwr_dly;
+logic vcmain_pok_int, main_pwr_dly_o;
 
-gen_pok #(
+gen_pok #( 
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .POK_RDLY ( 3us ),
-/*P*/ .POK_FDLY ( 500ns )
+/*P*/ .POK_RDLY ( VCMAIN_POK_RDLY ), 
+/*P*/ .POK_FDLY ( VCMAIN_POK_FDLY ) 
 // synopsys translate_on
+`endif
 ) i_vcmain_pok (
-/*I*/ .gen_supp_a ( vcmain_a && main_pwr_dly ),
-/*I*/ .gen_supp_i ( vcmain_supp_i ),
-/*O*/ .gen_pok_o ( vcmain_pok )
+/*O*/ .gen_pok_o ( vcmain_pok_int )
 );
 
-assign vcmain_pok_o = vcaon_pok_o && vcmain_pok;
+assign vcmain_pok = vcmain_pok_int && vcmain_supp_i && main_pwr_dly_o ;
+assign vcmain_pok_h = vcmain_pok;   // Level Shifter
+assign vcmain_pok_o = vcaon_pok_o && vcmain_pok; 
 
 
 // VIOA POK
 logic vioa_pok;
+logic vioa_pok_int;
 
-gen_pok #(
+gen_pok #( 
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .POK_RDLY ( 3us ),
-/*P*/ .POK_FDLY ( 500ns )
+/*P*/ .POK_RDLY ( VIOA_POK_RDLY ), 
+/*P*/ .POK_FDLY ( VIOA_POK_FDLY ) 
 // synopsys translate_on
+`endif
 ) i_vioa_pok (
-/*I*/ .gen_supp_a ( vioa_a ),
-/*I*/ .gen_supp_i ( vioa_supp_i ),
-/*O*/ .gen_pok_o ( vioa_pok )
+/*O*/ .gen_pok_o ( vioa_pok_int )
 );
 
+assign vioa_pok = vioa_pok_int && vioa_supp_i;
+
 assign vioa_pok_o = vcaon_pok && vioa_pok;
 
 
 // VIOB POK
 logic viob_pok;
+logic viob_pok_int;
 
-gen_pok #(
+gen_pok #( 
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .POK_RDLY ( 3us ),
-/*P*/ .POK_FDLY ( 500ns )
+/*P*/ .POK_RDLY ( VIOB_POK_RDLY ), 
+/*P*/ .POK_FDLY ( VIOB_POK_FDLY ) 
 // synopsys translate_on
+`endif
 ) i_viob_pok (
-/*I*/ .gen_supp_a ( viob_a ),
-/*I*/ .gen_supp_i ( viob_supp_i ),
-/*O*/ .gen_pok_o ( viob_pok )
+/*O*/ .gen_pok_o ( viob_pok_int )
 );
 
+assign viob_pok = viob_pok_int && viob_supp_i;
+
 assign viob_pok_o = vcaon_pok && viob_pok;
 
 
 /////////////////////////////////
-// Main Regulator
+// Regulators & PDM Logic
 /////////////////////////////////
 
-// Main Regulator (VCC)
-main_rglt #(
+// Regulators (VCC)
+// Analog & Digital are 3.3v
+rglts_pdm_3p3v #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .MRVCC_RDLY ( 5us ),
-/*P*/ .MRVCC_FDLY ( 100ns ),
-/*P*/ .MRPD_RDLY ( 50us ),
-/*P*/ .MRPD_FDLY ( 1us )
+/*P*/ .MRVCC_RDLY ( MPVCC_RDLY ),
+/*P*/ .MRVCC_FDLY ( MPVCC_FDLY ),
+/*P*/ .MRPD_RDLY ( MPPD_RDLY ),
+/*P*/ .MRPD_FDLY ( MPPD_FDLY )
 // synopsys translate_on
-) i_main_rglt (
-/*I*/ .vcc_pok_i ( vcc_pok ),
+`endif
+) i_rglts_pdm_3p3v (
+/*I*/ .vcc_pok_h_i ( vcc_pok_h ),
+/*I*/ .vcmain_pok_h_i ( vcmain_pok_h ),
+/*I*/ .clk_src_aon_i ( clk_src_aon_o ),
 /*I*/ .main_pd_ni ( main_pd_ni ),
-/*O*/ .main_pwr_dly ( main_pwr_dly )
-);
-
-
-/////////////////////////////////
-// PDM (Power Down Mode) Logic
-/////////////////////////////////
-
-// Power Down Mode (VCC)
-pdm i_pdm (
-/*I*/ .vcc_pok_i ( vcc_pok_h ),
-/*I*/ .vcmain_pok_i ( vcmain_pok ),
-/*I*/ .main_pd_ni ( main_pd_ni ),
+/*I*/ .otp_power_seq_i ( otp_power_seq_i[1:0] ),
+/*O*/ .main_pwr_dly_o ( main_pwr_dly_o ),
+/*O*/ .vcaon_pok_o ( vcaon_pok_int ),
+/*O*/ .vcaon_pok_h_o ( vcaon_pok_int_h ),
+/*O*/ .otp_power_seq_h_o ( otp_power_seq_h_o[1:0] ),
 /*O*/ .flash_power_down_h_o ( flash_power_down_h_o ),
 /*O*/ .flash_power_ready_h_o ( flash_power_ready_h_o )
 );
@@ -311,31 +313,30 @@
 
 // System Clock (Always ON)
 sys_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .SYS_EN_RDLY ( 10us ),
-/*P*/ .SYS_EN_FDLY ( 100ns ),
-/*P*/ .SYS_JEN_RDLY ( 80ns ),
-/*P*/ .SYS_JEN_FDLY ( 80ns )
+/*P*/ .SYS_EN_RDLY ( SYS_EN_RDLY )
 // synopsys translate_on
+`endif
 ) i_sys_clk (
+/*I*/ .vcmain_pok_i ( vcmain_pok ),
 /*I*/ .clk_src_sys_en_i ( clk_src_sys_en_i ),
 /*I*/ .clk_src_sys_jen_i ( clk_src_sys_jen_i ),
-/*I*/ .rst_ni ( vcmain_pok_o ),
 /*O*/ .clk_src_sys_o ( clk_src_sys_o ),
 /*O*/ .clk_src_sys_val_o ( clk_src_sys_val_o )
 );
 
 // USB Clock (Always ON)
 usb_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .USB_EN_RDLY ( 10us ),
-/*P*/ .USB_EN_FDLY ( 100ns ),
-/*P*/ .USB_VAL_RDLY ( 80ns ),  // Reduced for simulation from 50ms
-/*P*/ .USB_VAL_FDLY ( 80ns ),
+/*P*/ .USB_EN_RDLY ( USB_EN_RDLY ),
+/*P*/ .USB_VAL_RDLY ( USB_VAL_RDLY ),
+/*P*/ .USB_VAL_FDLY ( USB_VAL_FDLY )
 // synopsys translate_on
-/*P*/ .UsbCalibWidth ( UsbCalibWidth )
+`endif
 ) i_usb_clk (
-/*I*/ .rst_ni ( vcmain_pok_o ),
+/*I*/ .vcmain_pok_i ( vcmain_pok ),
 /*I*/ .clk_src_usb_en_i ( clk_src_usb_en_i ),
 /*I*/ .usb_ref_pulse_i ( usb_ref_pulse_i ),
 /*I*/ .usb_ref_val_i ( usb_ref_val_i ),
@@ -345,27 +346,29 @@
 
 // AON Clock (Always ON)
 aon_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .AON_EN_RDLY ( 10us ),
-/*P*/ .AON_EN_FDLY ( 100ns )
+/*P*/ .AON_EN_RDLY ( AON_EN_RDLY )
 // synopsys translate_on
+`endif
 ) i_aon_clk (
-/*I*/ .rst_ni ( vcaon_pok ),
+/*I*/ .vcaon_pok_i ( vcaon_pok ),
 /*O*/ .clk_src_aon_o ( clk_src_aon_o ),
 /*O*/ .clk_src_aon_val_o ( clk_src_aon_val_o )
 );
 
 // IO Clock (Always ON)
 io_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .IO_EN_RDLY ( 10us ),
-/*P*/ .IO_EN_FDLY ( 100ns )
+/*P*/ .IO_EN_RDLY ( 5us )
 // synopsys translate_on
+`endif
 ) i_io_clk (
-/*O*/ .clk_src_io_o ( clk_src_io_o ),
-/*O*/ .clk_src_io_val_o ( clk_src_io_val_o ),
+/*I*/ .vcmain_pok_i ( vcmain_pok ),
 /*I*/ .clk_src_io_en_i ( clk_src_io_en_i ),
-/*I*/ .rst_ni ( vcmain_pok_o )
+/*O*/ .clk_src_io_o ( clk_src_io_o ),
+/*O*/ .clk_src_io_val_o ( clk_src_io_val_o )
 );
 
 
@@ -374,12 +377,13 @@
 /////////////////////////////////
 
 // ADC (Always ON)
-adc #(
+adc #( 
+/*P*/ .AdcCnvtClks ( AdcCnvtClks ),
 /*P*/ .AdcDataWidth ( AdcDataWidth ),
-/*P*/ .AdcChannels ( AdcChannels ),
-/*P*/ .AdcCnvtClks ( 44 )
+/*P*/ .AdcChannels ( AdcChannels )
 ) i_adc (
-/*I*/ .adc_ai ( adc_ai[AdcChannels-1:0] ),
+/*I*/ .adc_a0_ai ( adc_a0_ai ),
+/*I*/ .adc_a1_ai ( adc_a1_ai ),
 /*I*/ .adc_chnsel_i ( adc_chnsel_i[AdcChannels-1:0] ),
 /*I*/ .adc_pd_i ( adc_pd_i ),
 /*I*/ .clk_adc_i ( clk_ast_adc_i ),
@@ -395,19 +399,18 @@
 
 // Entropy (Always ON)
 localparam int EntropyRateWidth = 4;
-logic [EntropyRateWidth-1:0] entropy_rate_i;
+logic [EntropyRateWidth-1:0] entropy_rate_o; 
 
 entropy #(
-/*P*/ .EntropyInWidth ( EntropyInWidth ),
 /*P*/ .EntropyRateWidth ( EntropyRateWidth )
 ) i_entropy (
 /*I*/ .entropy_ack_i ( entropy_ack_i ),
-/*I*/ .entropy_i ( entropy_i[EntropyInWidth-1:0] ),
-/*I*/ .entropy_rate_i ( entropy_rate_i[EntropyRateWidth-1:0] ),
-/*I*/ .clk_src_sys_jen_i ( clk_src_sys_jen_i ),
-/*I*/ .clk_ast_es_i ( clk_ast_es_i ),
+/*I*/ .entropy_i ( entropy_i ),
+/*I*/ .entropy_rate_i ( entropy_rate_o[EntropyRateWidth-1:0] ),
+/*I*/ .clk_src_sys_jen_i ( clk_src_sys_jen_i ), 
+/*I*/ .clk_ast_es_i ( clk_ast_es_i ), 
 /*I*/ .rst_ast_es_ni ( rst_ast_es_ni ),
-/*I*/ .clk_src_sys_i ( clk_src_sys_o ),
+/*I*/ .clk_src_sys_i ( clk_src_sys_o ), 
 /*I*/ .rst_src_sys_ni ( vcmain_pok_o ),
 /*I*/ .scan_mode_i ( scan_mode_i ),
 /*O*/ .entropy_req_o ( entropy_req_o )
@@ -415,101 +418,92 @@
 
 // RNG (Always ON)
 rng #(
+`ifndef VERILATOR
+// synopsys translate_off
+/*P*/ .RNG_EN_RDLY ( RNG_EN_RDLY ),
+// synopsys translate_on
+`endif
 /*P*/ .EntropyStreams ( EntropyStreams )
 ) i_rng (
-/*O*/ .rng_ok_o ( rng_ok_o ),
-/*O*/ .rng_b_o ( rng_b_o[EntropyStreams-1:0] ),
-/*I*/ .rng_en_i ( rng_en_i ),
 /*I*/ .clk_i ( clk_ast_rng_i ),
-/*I*/ .rst_ni ( rst_ast_rng_ni )
+/*I*/ .rst_ni ( rst_ast_rng_ni ),
+/*I*/ .vcaon_pok_i ( vcaon_pok ),
+/*I*/ .rng_en_i ( rng_en_i ),
+/*O*/ .rng_b_o ( rng_b_o[EntropyStreams-1:0] ),
+/*O*/ .rng_val_o ( rng_val_o )
 );
 
 
 //////////////////////////////////
 // Alerts (Always ON)
 /////////////////////////////////
-// Local signals for testing hook
-logic as_alert_i;     assign as_alert_i = 1'b0;
-logic cg_alert_i;     assign cg_alert_i = 1'b0;
-logic gd_alert_i;     assign gd_alert_i = 1'b0;
-logic ts_alert_hi_i;  assign ts_alert_hi_i = 1'b0;
-logic ts_alert_lo_i;  assign ts_alert_lo_i = 1'b0;
-logic ls_alert_i;     assign ls_alert_i = 1'b0;
-logic ot_alert_i;     assign ot_alert_i = 1'b0;
 
 // Active Shield (AS)
-gen_alert i_as_alert (
-/*I*/ .gen_alert_i ( as_alert_i ),
-/*I*/ .gen_alert_trig_i ( as_alert_trig_i ),
-/*I*/ .gen_alert_ack_i ( as_alert_ack_i ),
+gen_alert i_alert_as (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( as_alert_trig_i ),
+/*I*/ .gen_alert_ack_i ( as_alert_ack_i ),
 /*O*/ .gen_alert_po ( as_alert_po ),
 /*O*/ .gen_alert_no ( as_alert_no )
 );
 
 // Clock Glitch (CG)
-gen_alert i_cg_alert (
-/*I*/ .gen_alert_i ( cg_alert_i ),
-/*I*/ .gen_alert_trig_i ( cg_alert_trig_i ),
-/*I*/ .gen_alert_ack_i ( cg_alert_ack_i ),
+gen_alert i_alert_cg (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( cg_alert_trig_i ),
+/*I*/ .gen_alert_ack_i ( cg_alert_ack_i ),
 /*O*/ .gen_alert_po ( cg_alert_po ),
 /*O*/ .gen_alert_no ( cg_alert_no )
 );
 
 // Glitch Detector (GD)
-gen_alert i_gd_alert (
-/*I*/ .gen_alert_i ( gd_alert_i ),
-/*I*/ .gen_alert_trig_i ( gd_alert_trig_i ),
-/*I*/ .gen_alert_ack_i ( gd_alert_ack_i ),
+gen_alert i_alert_gd (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( gd_alert_trig_i ),
+/*I*/ .gen_alert_ack_i ( gd_alert_ack_i ),
 /*O*/ .gen_alert_po ( gd_alert_po ),
 /*O*/ .gen_alert_no ( gd_alert_no )
 );
 
 // Temprature Sensor High (TS Hi)
-gen_alert i_ts_alert_hi (
-/*I*/ .gen_alert_i ( ts_alert_hi_i ),
-/*I*/ .gen_alert_trig_i ( ts_alert_hi_trig_i ),
-/*I*/ .gen_alert_ack_i ( ts_alert_hi_ack_i ),
+gen_alert i_alert_ts_hi (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( ts_alert_hi_trig_i ),
+/*I*/ .gen_alert_ack_i ( ts_alert_hi_ack_i ),
 /*O*/ .gen_alert_po ( ts_alert_hi_po ),
 /*O*/ .gen_alert_no ( ts_alert_hi_no )
 );
 
 // Temprature Sensor Low (TS Lo)
-gen_alert i_ts_alert_lo (
-/*I*/ .gen_alert_i ( ts_alert_lo_i ),
-/*I*/ .gen_alert_trig_i ( ts_alert_lo_trig_i ),
-/*I*/ .gen_alert_ack_i ( ts_alert_lo_ack_i ),
+gen_alert i_alert_ts_lo (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( ts_alert_lo_trig_i ),
+/*I*/ .gen_alert_ack_i ( ts_alert_lo_ack_i ),
 /*O*/ .gen_alert_po ( ts_alert_lo_po ),
 /*O*/ .gen_alert_no ( ts_alert_lo_no )
 );
 
 // Light Sensor (LS)
-gen_alert i_ls_alert (
-/*I*/ .gen_alert_i ( ls_alert_i ),
-/*I*/ .gen_alert_trig_i ( ls_alert_trig_i ),
-/*I*/ .gen_alert_ack_i ( ls_alert_ack_i ),
+gen_alert i_alert_ls (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( ls_alert_trig_i ),
+/*I*/ .gen_alert_ack_i ( ls_alert_ack_i ),
 /*O*/ .gen_alert_po ( ls_alert_po ),
 /*O*/ .gen_alert_no ( ls_alert_no )
 );
 
 // Other Alert (OT)
-gen_alert i_ot_alert (
-/*I*/ .gen_alert_i ( ot_alert_i ),
-/*I*/ .gen_alert_trig_i ( ot_alert_trig_i ),
-/*I*/ .gen_alert_ack_i ( ot_alert_ack_i ),
+gen_alert i_alert_ot (
 /*I*/ .clk_i ( clk_ast_alert_i ),
 /*I*/ .rst_ni ( rst_ast_alert_ni ),
+/*I*/ .gen_alert_trig_i ( ot_alert_trig_i ),
+/*I*/ .gen_alert_ack_i ( ot_alert_ack_i ),
 /*O*/ .gen_alert_po ( ot_alert_po ),
 /*O*/ .gen_alert_no ( ot_alert_no )
 );
@@ -520,29 +514,44 @@
 /////////////////////////////////
 
 // AST REGs (Always ON)
+ast_reg_pkg::ast_reg2hw_t reg2hw; // Write (To HW)
+ast_reg_pkg::ast_hw2reg_t hw2reg; // Read  (From HW)
+
 ast_reg_top i_ast_reg_top (
 /*I*/ .clk_i ( clk_ast_tlul_i ),
 /*I*/ .rst_ni ( rst_ast_tlul_ni ),
 /*I*/ .tl_i ( tl_i ),
 /*O*/ .tl_o ( tl_o ),
 /*O*/ .reg2hw ( reg2hw ),
+/*I*/ .hw2reg ( hw2reg ),
 /*I*/ .devmode_i ( 1'b0 )
 );
 
-// Register output to AST
+// Registers Output to AST
 logic [32-1:0] ast_rwtype0_q;
 logic [11-1:0] ast_rwtype1_q;
 
-assign ast_rwtype0_q = reg2hw.rwtype0.q;
+assign ast_rwtype0_q = reg2hw.rwtype0.q; 
 assign ast_rwtype1_q = { reg2hw.rwtype1.field15_8.q,
                          reg2hw.rwtype1.field4.q,
                          reg2hw.rwtype1.field1.q,
-                         reg2hw.rwtype1.field0.q };
+                         reg2hw.rwtype1.field0.q }; 
 
-// TODO: Temporrary outputs assignment
-assign entropy_rate_i = 4'd5;
-assign ast2padmux_o = {Ast2PadOutWidth{1'b0}};   // DFT from AST Analog/Digital
+// AST to Registers Input
+assign hw2reg.rwtype0.d = 32'h0000_0000;
+assign hw2reg.rwtype0.de = 1'b0;
+
+
+///////////////////////////////////////
+// DFT to PADs / PADs to DFT
+///////////////////////////////////////
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// TODO: Temporrary assignment
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+assign entropy_rate_o = 4'd5;
 assign usb_io_pu_cal_o = {UsbCalibWidth{1'b0}};  // From AST Regfile
 
+assign ast2padmux_o = {Ast2PadOutWidth{1'b0}};   // DFT from AST Analog/Digital
+
 
 endmodule // of ast
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv b/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
new file mode 100644
index 0000000..0add361
--- /dev/null
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_pkg.sv
@@ -0,0 +1,45 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//############################################################################
+// *Name: ast_pkg
+// *Module Description: AST Package
+//############################################################################
+
+package ast_pkg;
+
+`ifndef VERILATOR
+// synopsys translate_off
+/////////////////////////////////
+// Delay Parameters from Spec
+/////////////////////////////////
+// POKs
+parameter time VCC_POK_RDLY    = 3us;
+parameter time VCC_POK_FDLY    = 500ns;
+parameter time VCAON_POK_RDLY  = 3us;
+parameter time VCAON_POK_FDLY  = 500ns;
+parameter time VCMAIN_POK_RDLY = 3us;
+parameter time VCMAIN_POK_FDLY = 500ns;
+parameter time VIOA_POK_RDLY   = 3us;
+parameter time VIOA_POK_FDLY   = 500ns;
+parameter time VIOB_POK_RDLY   = 3us;
+parameter time VIOB_POK_FDLY   = 500ns;
+// Main Regulator
+parameter time MPVCC_RDLY      = 5us;
+parameter time MPVCC_FDLY      = 100ns;
+parameter time MPPD_RDLY       = 50us;
+parameter time MPPD_FDLY       = 1us;
+// Clocks
+parameter time SYS_EN_RDLY     = 5us;
+parameter time USB_EN_RDLY     = 5us;
+parameter time USB_VAL_RDLY    = 80ns;   // Reduced for simulation from 50ms 
+parameter time USB_VAL_FDLY    = 80ns; 
+parameter time IO_EN_RDLY      = 5us;
+parameter time AON_EN_RDLY     = 5us;
+parameter time RNG_EN_RDLY     = 5us;
+// synopsys translate_on
+`endif
+// ADC
+parameter int AdcCnvtClks      = 22;
+
+endpackage  // of ana_pkg
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_reg_pkg.sv b/hw/top_earlgrey/ip/ast/rtl/ast_reg_pkg.sv
index 58b8eaa..3a42b2d 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_reg_pkg.sv
@@ -29,6 +29,11 @@
   } ast_reg2hw_rwtype1_reg_t;
 
 
+  typedef struct packed {
+    logic [31:0] d;
+    logic        de;
+  } ast_hw2reg_rwtype0_reg_t;
+
 
   ///////////////////////////////////////
   // Register to internal design logic //
@@ -41,6 +46,9 @@
   ///////////////////////////////////////
   // Internal design logic to register //
   ///////////////////////////////////////
+  typedef struct packed {
+    ast_hw2reg_rwtype0_reg_t rwtype0; // [32:1]
+  } ast_hw2reg_t;
 
   // Register Address
   parameter logic [2:0] AST_RWTYPE0_OFFSET = 3'h 0;
diff --git a/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv b/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv
index 54933e8..e6bd8f3 100644
--- a/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/ast_reg_top.sv
@@ -15,6 +15,7 @@
   output tlul_pkg::tl_d2h_t tl_o,
   // To HW
   output ast_reg_pkg::ast_reg2hw_t reg2hw, // Write
+  input  ast_reg_pkg::ast_hw2reg_t hw2reg, // Read
 
   // Config
   input devmode_i // If 1, explicit error return for unmapped register access
@@ -102,8 +103,8 @@
     .wd     (rwtype0_wd),
 
     // from internal hardware
-    .de     (1'b0),
-    .d      ('0  ),
+    .de     (hw2reg.rwtype0.de),
+    .d      (hw2reg.rwtype0.d ),
 
     // to internal hardware
     .qe     (),
diff --git a/hw/top_earlgrey/ip/ast/rtl/entropy.sv b/hw/top_earlgrey/ip/ast/rtl/entropy.sv
index 13ff835..235ef8a 100644
--- a/hw/top_earlgrey/ip/ast/rtl/entropy.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/entropy.sv
@@ -2,148 +2,129 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: entropy
 // *Module Description:  Entropy
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module entropy #(
-   parameter int EntropyInWidth = 1,
-   parameter int EntropyRateWidth = 4
+  parameter int EntropyRateWidth = 4
 ) (
-   input entropy_ack_i,
-   input [EntropyInWidth-1:0] entropy_i,
-   input [EntropyRateWidth-1:0] entropy_rate_i,
-   input clk_src_sys_jen_i,                           // System Source Clock Jitter Enable
-   input clk_ast_es_i,
-   input rst_ast_es_ni,
-   input clk_src_sys_i,
-   input rst_src_sys_ni,
-   input scan_mode_i,
-   output logic entropy_req_o
+  input entropy_ack_i,
+  input entropy_i,
+  input [EntropyRateWidth-1:0] entropy_rate_i,
+  input clk_src_sys_jen_i,                         // System Source Clock Jitter Enable
+  input clk_ast_es_i,
+  input rst_ast_es_ni,
+  input clk_src_sys_i,
+  input rst_src_sys_ni,
+  input scan_mode_i,
+  output logic entropy_req_o
 );
 
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Entropy Logic @clk_ast_es_i clock domain 
 
-///////////////////////////////////
-// Entropy & Jitter
-///////////////////////////////////
 
+///////////////////////////////////////
 // Entropy Enable
+///////////////////////////////////////
 logic entropy_enable;
-
 assign entropy_enable = rst_ast_es_ni && clk_src_sys_jen_i;
 
 // Reset De-Assert syncronizer
+//JL TODO: Concider using Prim cell
+// prim_generic_flop_2sync #(
+//    .Width ( 1 )
+// ) rst_es_da_sync (
+//    .clk_i ( clk_ast_es_i ),
+//    .rst_ni ( entropy_enable ),
+//    .d_i ( 1'b1 ),
+//    .q_o ( rst_es_n )
+// );
 logic sync1_rst_es_n, sync2_rst_es_n, rst_es_n;
 
 always_ff @( posedge clk_ast_es_i, negedge entropy_enable ) begin
-   if ( !entropy_enable ) begin
-      sync1_rst_es_n <= 1'b0;
-      sync2_rst_es_n <= 1'b0;
-   end
-   else begin
-      sync1_rst_es_n <= 1'b1;
-      sync2_rst_es_n <= sync1_rst_es_n;
-   end
+  if ( !entropy_enable ) begin
+    sync1_rst_es_n <= 1'b0;
+    sync2_rst_es_n <= 1'b0;
+  end
+  else begin
+    sync1_rst_es_n <= 1'b1;
+    sync2_rst_es_n <= sync1_rst_es_n;
+  end
 end
 
 assign rst_es_n = scan_mode_i ? rst_ast_es_ni : sync2_rst_es_n;
 
+
+///////////////////////////////////////
 // Entropy Rate
-logic [(1<<EntropyRateWidth)-1:0] rate_cnt;
-logic [32-1:0] entropy_rate;
+///////////////////////////////////////
 logic read_entropy;
+logic [(1<<EntropyRateWidth)-1:0] erate_cnt;
+logic [32-1:0] entropy_rate;
 
 always_ff @( posedge clk_ast_es_i, negedge rst_es_n ) begin
-   if ( !rst_es_n )          rate_cnt <= {(1<<EntropyRateWidth){1'b0}};
-   else if ( read_entropy )  rate_cnt <= {(1<<EntropyRateWidth){1'b0}};
-   else                      rate_cnt <= rate_cnt + 1'b1;
+  if ( !rst_es_n )         erate_cnt <= {(1<<EntropyRateWidth){1'b0}};
+  else if ( read_entropy ) erate_cnt <= {(1<<EntropyRateWidth){1'b0}};
+  else                     erate_cnt <= erate_cnt + 1'b1;
 end
 
 assign entropy_rate = (1 << entropy_rate_i);
-assign read_entropy = (rate_cnt == entropy_rate[(1 << EntropyRateWidth)-1:0]);
+assign read_entropy = (erate_cnt == entropy_rate[(1<<EntropyRateWidth)-1:0]); 
 
+
+///////////////////////////////////////
+// Entropy FIFO 
+///////////////////////////////////////
 // FIFO RDP/WRP/Level
 logic [6-1:0] fifo_cnt;            // For 32 1-bit FIFO
 logic [5-1:0] fifo_rdp, fifo_wrp;  // FIFO read pointer & write pointer
-logic [32-1:0] fifo_data;          // 32 1-bi FIFOt
+logic [32-1:0] fifo_data;          // 32 1-bi FIFOt 
 logic inc_fifo_cnt, dec_fifo_cnt;
 
 assign inc_fifo_cnt = (fifo_cnt < 6'h20) && entropy_ack_i;
 assign dec_fifo_cnt = (fifo_cnt != 6'h00) && read_entropy;
 
 always_ff @( posedge clk_ast_es_i, negedge rst_es_n ) begin
-   if ( !rst_es_n ) begin
-      fifo_cnt <= 6'h00;
-      fifo_rdp <= 5'h00;
-      fifo_wrp <= 5'h00;
-   end
-   else if ( inc_fifo_cnt && dec_fifo_cnt ) begin
-      fifo_rdp <= fifo_rdp + 1'b1;
-      fifo_wrp <= fifo_wrp + 1'b1;
-   end
-   else if ( inc_fifo_cnt ) begin
-      fifo_cnt <= fifo_cnt + 1'b1;
-      fifo_wrp <= fifo_wrp + 1'b1;
-   end
-   else if ( dec_fifo_cnt ) begin
-      fifo_cnt <= fifo_cnt - 1'b1;
-      fifo_rdp <= fifo_rdp + 1'b1;
-   end
+  if ( !rst_es_n ) begin
+    fifo_cnt <= 6'h00;
+    fifo_rdp <= 5'h00;
+    fifo_wrp <= 5'h00;
+  end
+  else if ( inc_fifo_cnt && dec_fifo_cnt ) begin
+    fifo_rdp <= fifo_rdp + 1'b1;
+    fifo_wrp <= fifo_wrp + 1'b1;
+  end
+  else if ( inc_fifo_cnt ) begin
+    fifo_cnt <= fifo_cnt + 1'b1;
+    fifo_wrp <= fifo_wrp + 1'b1;
+  end
+  else if ( dec_fifo_cnt ) begin
+    fifo_cnt <= fifo_cnt - 1'b1;
+    fifo_rdp <= fifo_rdp + 1'b1;
+  end
 end
 
 // Request
 always_ff @( posedge clk_ast_es_i, negedge rst_es_n ) begin
-   if ( !rst_es_n )
-      entropy_req_o <= 1'b0;
-   else if ( fifo_cnt < 6'h10 )
-      entropy_req_o <= 1'b1;  // Half
-   else if ( (fifo_cnt == 6'h1f) && inc_fifo_cnt && ~dec_fifo_cnt )
-      entropy_req_o <= 1'b0;  // Full
+  if ( !rst_es_n )
+    entropy_req_o <= 1'b0;
+  else if ( fifo_cnt < 6'h10 )
+    entropy_req_o <= 1'b1;  // Half
+  else if ( (fifo_cnt == 6'h1f) && inc_fifo_cnt && ~dec_fifo_cnt )
+    entropy_req_o <= 1'b0;  // Full
 end
 
 // FIFO Write
 always_ff @( posedge clk_ast_es_i, negedge rst_es_n ) begin
-   if ( !rst_es_n )          fifo_data[32-1:0]   <= {32{1'b0}};
-   else if ( inc_fifo_cnt )  fifo_data[fifo_wrp] <= entropy_i[0];
+  if ( !rst_es_n )         fifo_data[32-1:0]   <= {32{1'b0}};
+  else if ( inc_fifo_cnt ) fifo_data[fifo_wrp] <= entropy_i;
 end
 
-// FIFO Read
+// FIFO Read Out
 wire fifo_entropy_out = fifo_data[fifo_rdp];
 
 
-// Sync to SYS clock
-logic lfsr_data_in;
-logic sync1_lfsr_data_in, sync2_lfsr_data_in;
-
-always_ff @( posedge clk_src_sys_i, negedge rst_src_sys_ni ) begin
-   if ( !rst_src_sys_ni ) begin
-      sync1_lfsr_data_in <= 1'b0;
-      sync2_lfsr_data_in <= 1'b0;
-   end
-   else begin
-      sync1_lfsr_data_in <= fifo_entropy_out;
-      sync2_lfsr_data_in <= sync1_lfsr_data_in;
-   end
-end
-
-assign lfsr_data_in = sync2_lfsr_data_in;
-
-// prim_generic_flop_2sync #(
-//    .Width ( 1 )
-// ) entropy_sync (
-//    .clk_i ( clk_src_sys_i ),
-//    .rst_ni ( rst_src_sys_ni ),
-//    .d_i ( fifo_entropy_out ),
-//    .q_o ( lfsr_data_in )
-// );
-
-
-// Jitter
-// random 0-2000ps (upto +20% of SYS clock)
-// jitter = sys_jen ? $urandom_range(2000, 0) : 0;
-
-
 endmodule  // of entropy
diff --git a/hw/top_earlgrey/ip/ast/rtl/gen_alert.sv b/hw/top_earlgrey/ip/ast/rtl/gen_alert.sv
index 0460204..044fd87 100644
--- a/hw/top_earlgrey/ip/ast/rtl/gen_alert.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/gen_alert.sv
@@ -2,37 +2,37 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: gen_alert
 // *Module Description:  Generic Alert
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module gen_alert (
-   input gen_alert_i,
-   input gen_alert_trig_i,
-   input gen_alert_ack_i,
-   input clk_i,
-   input rst_ni,
-   output logic gen_alert_po,
-   output logic gen_alert_no
+  input clk_i,
+  input rst_ni,
+  input gen_alert_trig_i,
+  input gen_alert_ack_i,
+  output logic gen_alert_po,
+  output logic gen_alert_no
 );
-
 // Behavioral Model
-logic gen_alert_ff, gen_alert_set, gen_alert_clr;
 
-assign gen_alert_set = gen_alert_i | gen_alert_trig_i;
+// Hook for testing
+logic gen_alert;
+assign gen_alert = 1'b0;
+
+logic gen_alert_set, gen_alert_clr;
+
+assign gen_alert_set = gen_alert | gen_alert_trig_i;
 assign gen_alert_clr = ~gen_alert_set & gen_alert_ack_i;
 
 always_ff @( posedge clk_i, negedge rst_ni ) begin
-   if ( !rst_ni )             gen_alert_ff <= 1'b0;
-   else if ( gen_alert_set )  gen_alert_ff <= 1'b1;
-   else if ( gen_alert_clr )  gen_alert_ff <= 1'b0;
+  if ( !rst_ni )            gen_alert_po <= 1'b0;
+  else if ( gen_alert_set ) gen_alert_po <= 1'b1;
+  else if ( gen_alert_clr ) gen_alert_po <= 1'b0;
 end
 
-assign gen_alert_po =  gen_alert_ff;
-assign gen_alert_no = ~gen_alert_ff;
+assign gen_alert_no = ~gen_alert_po;
 
 
 endmodule  // of gen_alert
diff --git a/hw/top_earlgrey/ip/ast/rtl/gen_pok.sv b/hw/top_earlgrey/ip/ast/rtl/gen_pok.sv
index 9cd74ab..aef18b9 100644
--- a/hw/top_earlgrey/ip/ast/rtl/gen_pok.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/gen_pok.sv
@@ -2,48 +2,47 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: gen_pok
 // *Module Description:  Generic Power OK
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module gen_pok #(
+`ifndef VERILATOR
 // synopsys translate_off
-  parameter time POK_RDLY = 3us,
-  parameter time POK_FDLY = 500ns
+ parameter time POK_RDLY = 3us,
+ parameter time POK_FDLY = 500ns
 // synopsys translate_on
+`endif
 ) (
-   input gen_supp_a,
-   input gen_supp_i,
-   output logic gen_pok_o
+  output logic gen_pok_o
 );
-// synopsys translate_off
-// Behavioral Model
-logic supp_a;
 
+// Behavioral Model
+
+`ifndef VERILATOR
+// synopsys translate_off
+// Local signal for testing hook
+logic gen_supp_a;
+assign gen_supp_a = 1'b1;
 
 // The initial is needed to clear the X of the delays at the start
 // Also to force a power-up effect at the bgining.
-logic init_start;
+logic init_start; 
 
 initial begin
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
+  init_start = 1'b1; #1;
+  init_start = 1'b0;
 end
 
-always_ff @( init_start, posedge gen_supp_a, negedge gen_supp_a ) begin
-    if ( init_start )
-       supp_a <= 1'b0;
-    else if ( !init_start && gen_supp_a )
-       supp_a <= #(POK_RDLY) gen_supp_a;
-    else if ( !init_start && !gen_supp_a )
-       supp_a <= #(POK_FDLY) gen_supp_a;
+always @( * ) begin
+  if ( init_start )                      gen_pok_o <= 1'b0;
+  else if ( !init_start && gen_supp_a )  gen_pok_o <= #(POK_RDLY) gen_supp_a;
+  else if ( !init_start && !gen_supp_a ) gen_pok_o <= #(POK_FDLY) gen_supp_a;
 end
-
-assign gen_pok_o = supp_a && gen_supp_i;
 // synopsys translate_on
+`endif
 
 
 endmodule  // of gen_pok
+
diff --git a/hw/top_earlgrey/ip/ast/rtl/io_clk.sv b/hw/top_earlgrey/ip/ast/rtl/io_clk.sv
index cbd1172..fafaedc 100644
--- a/hw/top_earlgrey/ip/ast/rtl/io_clk.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/io_clk.sv
@@ -2,49 +2,58 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: io_clk
 // *Module Description: IO Clock
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module io_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time IO_EN_RDLY = 10us,
-   parameter time IO_EN_FDLY = 100ns
+  parameter time IO_EN_RDLY = 5us
 // synopsys translate_on
+`endif
 ) (
-   input rst_ni,                  // Reset
-   input clk_src_io_en_i,         // IO Source Clock Enable
-   output logic clk_src_io_o,     // IO Source Clock
-   output logic clk_src_io_val_o  // IO Source Clock Valid
+  input vcmain_pok_i,              // VCMAIN POK @1.1V
+  input clk_src_io_en_i,           // IO Source Clock Enable
+  output logic clk_src_io_o,       // IO Source Clock
+  output logic clk_src_io_val_o    // IO Source Clock Valid
 );
 
-logic clk, io_en, clk_en;
+logic clk, io_clk_val, rst_n;
 
 // Behavioral Model
+assign rst_n = vcmain_pok_i;
 
 // Clock Oscilator
 io_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .IO_EN_RDLY ( IO_EN_RDLY ),
-/*P*/ .IO_EN_FDLY ( IO_EN_FDLY )
+/*P*/ .IO_EN_RDLY ( IO_EN_RDLY )
 // synopsys translate_on
+`endif
 ) i_io_osc (
+/*I*/ .vcmain_pok_i ( vcmain_pok_i ),
 /*I*/ .io_en_i ( clk_src_io_en_i ),
-/*O*/ .io_clk_o ( clk ),
-/*O*/ .io_clk_en_o ( io_en )
+/*O*/ .io_clk_o ( clk )
 );
 
-always_ff @( posedge clk, negedge rst_ni ) begin
-   if ( !rst_ni )  clk_en <= 1'b0;
-   else            clk_en <= io_en;
-end
 
 // Clock & Valid
-assign clk_src_io_o = clk_en ? ~clk : 1'b0;
-assign clk_src_io_val_o = clk_en;
+assign clk_src_io_o = clk;
+
+wire rst_val_n = rst_n && clk_src_io_en_i;
+
+// 2-stage deassertion
+always_ff @( posedge clk, negedge rst_val_n ) begin
+  if ( !rst_val_n )  begin
+    io_clk_val       <= 1'b0;
+    clk_src_io_val_o <= 1'b0;
+  end else begin
+    io_clk_val       <= 1'b1;
+    clk_src_io_val_o <= io_clk_val;
+  end
+end
 
 
 endmodule  // of io_clk
diff --git a/hw/top_earlgrey/ip/ast/rtl/io_osc.sv b/hw/top_earlgrey/ip/ast/rtl/io_osc.sv
index 848e969..7305148 100644
--- a/hw/top_earlgrey/ip/ast/rtl/io_osc.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/io_osc.sv
@@ -2,52 +2,56 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: io_osc
 // *Module Description: IO Clock Oscilator
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module io_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time IO_EN_RDLY = 10us,
-   parameter time IO_EN_FDLY = 100ns
+  parameter time IO_EN_RDLY = 10us
 // synopsys translate_on
+`endif
 ) (
-   input io_en_i,              // IO Source Clock Enable
-   output logic io_clk_o,      // IO Clock Output
-   output logic io_clk_en_o    // IO Clock Enable Output
+  input vcmain_pok_i,    // VCMAIN POK @1.1V
+  input io_en_i,         // IO Source Clock Enable
+  output logic io_clk_o  // IO Clock Output
 );
 
+// Behavioral Model
+
+`ifndef VERILATOR
 // synopsys translate_off
 localparam real IO_CLK_PERIOD = 1000000/96;  // ~10416.666667ps (96Mhz)
-
-logic init_start, clk;
+logic clk, en_osc, en_osc_re, en_osc_fe;
 
 initial begin
-   clk = 1'b0;
-   $display("\nIO Clock Period: %0dps", IO_CLK_PERIOD);
-   // init_start = 1'b0; #1;
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
+  clk = 1'b0;
+  $display("\nIO Clock Period: %0dps", IO_CLK_PERIOD);
 end
 
+always @( * ) begin
+  if ( !vcmain_pok_i )                en_osc_re = 1'b0;  // For Startup
+  else if ( io_en_i && vcmain_pok_i ) en_osc_re = #(IO_EN_RDLY) 1'b1;
+  else                                en_osc_re = 1'b0;
+end
+
+// Syncronize en_osc to clk FE for glitch free disable
+always_ff @( negedge clk or negedge vcmain_pok_i ) begin
+  if ( !vcmain_pok_i ) en_osc_fe <= 1'b0;
+  else                 en_osc_fe <= en_osc_re;
+end
+
+assign en_osc = en_osc_re || en_osc_fe;  // EN -> 1 || EN -> 0
+
 always begin
-   #(IO_CLK_PERIOD/2000) clk = ~clk;
+   #(IO_CLK_PERIOD/2000) clk = ~clk && en_osc;
 end
 
 assign io_clk_o = clk;
-
-always_ff @( init_start, posedge io_en_i, negedge io_en_i ) begin
-    if ( init_start )
-       io_clk_en_o <= 1'b0;
-    else if ( !init_start && io_en_i )
-       io_clk_en_o <= #(IO_EN_RDLY) io_en_i;
-    else if ( !init_start && !io_en_i )
-       io_clk_en_o <= #(IO_EN_FDLY) io_en_i;
-end
 // synopsys translate_on
+`endif
 
 
 endmodule  // of io_osc
diff --git a/hw/top_earlgrey/ip/ast/rtl/lc_ctrl_pkg.sv b/hw/top_earlgrey/ip/ast/rtl/lc_ctrl_pkg.sv
new file mode 100644
index 0000000..82b6ca7
--- /dev/null
+++ b/hw/top_earlgrey/ip/ast/rtl/lc_ctrl_pkg.sv
@@ -0,0 +1,58 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//
+
+package lc_ctrl_pkg;
+
+  /////////////////////////////////
+  // General Typedefs and Params //
+  /////////////////////////////////
+
+  parameter int LcValueWidth = 16;
+  parameter int LcTokenWidth = 128;
+  parameter int NumLcStateValues = 12;
+  parameter int LcStateWidth = NumLcStateValues * LcValueWidth;
+  parameter int NumLcCountValues = 32;
+
+  typedef enum logic [LcValueWidth-1:0] {
+    Blk = 16'h0000, // blank
+    Set = 16'hF5FA  // programmed
+  } lc_value_e;
+
+  typedef enum logic [LcStateWidth-1:0] {
+    // Halfword idx   :  11 | 10 |  9 |  8 |  7 |  6 |  5 |  4 |  3 |  2 |  1 |  0
+    LcStRaw           = {Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk},
+    LcStTestUnlocked0 = {Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Set},
+    LcStTestLocked0   = {Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Set, Set},
+    LcStTestUnlocked1 = {Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Set, Set, Set},
+    LcStTestLocked1   = {Blk, Blk, Blk, Blk, Blk, Blk, Blk, Blk, Set, Set, Set, Set},
+    LcStTestUnlocked2 = {Blk, Blk, Blk, Blk, Blk, Blk, Blk, Set, Set, Set, Set, Set},
+    LcStTestLocked2   = {Blk, Blk, Blk, Blk, Blk, Blk, Set, Set, Set, Set, Set, Set},
+    LcStTestUnlocked3 = {Blk, Blk, Blk, Blk, Blk, Set, Set, Set, Set, Set, Set, Set},
+    LcStDev           = {Blk, Blk, Blk, Blk, Set, Set, Set, Set, Set, Set, Set, Set},
+    LcStProd          = {Blk, Blk, Blk, Set, Blk, Set, Set, Set, Set, Set, Set, Set},
+    LcStProdEnd       = {Blk, Blk, Set, Blk, Blk, Set, Set, Set, Set, Set, Set, Set},
+    LcStRma           = {Set, Set, Blk, Set, Set, Set, Set, Set, Set, Set, Set, Set},
+    LcStScrap         = {Set, Set, Set, Set, Set, Set, Set, Set, Set, Set, Set, Set}
+  } lc_state_e;
+
+  typedef lc_value_e [NumLcCountValues-1:0] lc_cnt_t;
+
+  ////////////////////////////////
+  // Typedefs for LC Interfaces //
+  ////////////////////////////////
+
+  parameter int TxWidth = 4;
+  typedef enum logic [TxWidth-1:0] {
+    On  = 4'b1010,
+    Off = 4'b0101
+  } lc_tx_e;
+
+  typedef struct packed {
+    lc_tx_e state;
+  } lc_tx_t;
+
+  parameter lc_tx_t LC_TX_DEFAULT = Off;
+
+endpackage : lc_ctrl_pkg
diff --git a/hw/top_earlgrey/ip/ast/rtl/main_rglt.sv b/hw/top_earlgrey/ip/ast/rtl/main_rglt.sv
deleted file mode 100644
index 2a79810..0000000
--- a/hw/top_earlgrey/ip/ast/rtl/main_rglt.sv
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//############################################################################
-//
-// *Name: main_rglt
-// *Module Description: Main Regulator
-//
-//############################################################################
-`timescale 1ns/1ps
-
-module main_rglt #(
-// synopsys translate_off
-   parameter time MRVCC_RDLY = 5us,
-   parameter time MRVCC_FDLY = 100ns,
-   parameter time MRPD_RDLY = 50us,
-   parameter time MRPD_FDLY = 1us
-// synopsys translate_on
-) (
-   input vcc_pok_i,
-   input main_pd_ni,
-   output logic main_pwr_dly
-);
-
-// Behavioral Model
-// synopsys translate_off
-
-logic mr_vcc_dly, mr_pd_dly;
-
-// The initial is needed to clear the X of the delays at the start
-logic init_start;
-
-initial begin
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
-end
-
-always_ff @( init_start, posedge vcc_pok_i, negedge vcc_pok_i ) begin
-    if ( init_start )
-       mr_vcc_dly <= 1'b0;
-    else if ( !init_start && vcc_pok_i )
-       mr_vcc_dly <= #(MRVCC_RDLY) vcc_pok_i;
-    else if ( !init_start && !vcc_pok_i )
-       mr_vcc_dly <= #(MRVCC_FDLY) vcc_pok_i;
-end
-
-always_ff @( init_start, posedge main_pd_ni, negedge main_pd_ni ) begin
-    if ( init_start )
-       mr_pd_dly <= 1'b1;
-    else if ( !init_start && main_pd_ni && vcc_pok_i )
-       mr_pd_dly <= #(MRPD_RDLY) main_pd_ni && vcc_pok_i;
-    else if ( !init_start && !main_pd_ni && vcc_pok_i )
-       mr_pd_dly <= #(MRPD_FDLY) main_pd_ni && vcc_pok_i;
-end
-
-assign main_pwr_dly = mr_vcc_dly && mr_pd_dly;
-
-// synopsys translate_on
-
-endmodule  // of main_rglt
diff --git a/hw/top_earlgrey/ip/ast/rtl/pdm.sv b/hw/top_earlgrey/ip/ast/rtl/pdm.sv
deleted file mode 100644
index fb98631..0000000
--- a/hw/top_earlgrey/ip/ast/rtl/pdm.sv
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//############################################################################
-//
-// *Name: pdm
-// *Module Description: Power Down Mode
-//
-//############################################################################
-`timescale 1ns/1ps
-
-module pdm (
-   input vcc_pok_i,
-   input vcmain_pok_i,
-   input main_pd_ni,
-   output logic flash_power_down_h_o,
-   output logic flash_power_ready_h_o
-);
-
-// Behavioral Model
-
-assign flash_power_down_h_o  = ~(main_pd_ni && vcmain_pok_i);
-assign flash_power_ready_h_o = vcc_pok_i;
-
-
-endmodule  // of pdm
diff --git a/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv b/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv
new file mode 100644
index 0000000..4a24231
--- /dev/null
+++ b/hw/top_earlgrey/ip/ast/rtl/rglts_pdm_3p3v.sv
@@ -0,0 +1,106 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+//############################################################################
+// *Name: rglts_pdm_3p3v
+// *Module Description: Regulators (MAIN & AON) & PDM Logic @3.3V
+//############################################################################
+`timescale 1ns / 10ps
+
+module rglts_pdm_3p3v 
+#(
+`ifndef VERILATOR
+// synopsys translate_off
+  parameter time MRVCC_RDLY = 5us,
+  parameter time MRVCC_FDLY = 100ns,
+  parameter time MRPD_RDLY = 50us,
+  parameter time MRPD_FDLY = 1us
+// synopsys translate_on
+`endif
+) (
+  input vcc_pok_h_i,                     // VCC (3.3V) Exist @3.3v
+  input vcmain_pok_h_i,                  // VCMAIN (1.1v) Exist @3.3v
+  input clk_src_aon_i,                   // AON Clock @1.1v 
+  input main_pd_ni,                      // VCMAIN/Regulator Power Down @1.1v
+  input [1:0] otp_power_seq_i,           // MMR0,24 in (VDD)
+  output logic main_pwr_dly_o,           // For modeling only.
+  output logic vcaon_pok_o,              // VCAON (1.1v) Exist @1.1v
+  output logic vcaon_pok_h_o,            // VCAON (1.1v) Exist @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)
+);
+
+logic main_pd_h_n, clk_src_aon_h;
+logic [1:0] otp_power_seq_h;
+
+import ast_pkg::*;
+
+// Behavioral Model
+
+
+// Up Level Shefters
+assign main_pd_h_n = main_pd_ni;
+assign clk_src_aon = clk_src_aon_i;
+assign otp_power_seq_h = otp_power_seq_i;
+
+`ifndef VERILATOR
+// synopsys translate_off
+logic mr_vcc_dly, mr_pd_dly;
+
+// The initial is needed to clear the X of the delays at the start
+logic init_start;
+
+initial begin
+  init_start = 1'b1; #1; 
+  init_start = 1'b0;
+end
+
+always_ff @( init_start, posedge vcc_pok_h_i, negedge vcc_pok_h_i ) begin
+  if ( init_start )
+    mr_vcc_dly <= 1'b0;
+  else if ( !init_start && vcc_pok_h_i )
+    mr_vcc_dly <= #(MRVCC_RDLY) vcc_pok_h_i;
+  else if ( !init_start && !vcc_pok_h_i )
+    mr_vcc_dly <= #(MRVCC_FDLY) vcc_pok_h_i;
+end
+
+always_ff @( init_start, posedge main_pd_h_n, negedge main_pd_h_n ) begin
+  if ( init_start )        
+    mr_pd_dly <= 1'b1;
+  else if ( !init_start && main_pd_h_n && vcc_pok_h_i )
+    mr_pd_dly <= #(MRPD_RDLY) main_pd_h_n && vcc_pok_h_i;
+  else if ( !init_start && !main_pd_h_n && vcc_pok_h_i )
+    mr_pd_dly <= #(MRPD_FDLY) main_pd_h_n && vcc_pok_h_i;
+end
+
+assign main_pwr_dly_o = mr_vcc_dly && mr_pd_dly;
+
+gen_pok #( 
+// synopsys translate_off
+/*P*/ .POK_RDLY ( VCMAIN_POK_RDLY ), 
+/*P*/ .POK_FDLY ( VCMAIN_POK_FDLY ) 
+// synopsys translate_on
+) i_vcaon_pok (
+/*O*/ .gen_pok_o ( vcaon_pok_o )
+);
+assign vcaon_pok_h_o = vcaon_pok_o;  // Level Shifter
+// synopsys translate_on
+`endif
+
+
+///////////////////////////////////////
+// Flash
+///////////////////////////////////////
+assign flash_power_down_h_o  = ~(main_pd_h_n && vcmain_pok_h_i); 
+assign flash_power_ready_h_o = vcc_pok_h_i;
+
+
+///////////////////////////////////////
+// OTP
+///////////////////////////////////////
+assign otp_power_seq_h_o[0] = flash_power_down_h_o && otp_power_seq_h[0]; 
+assign otp_power_seq_h_o[1] = flash_power_down_h_o || otp_power_seq_h[1]; 
+
+
+endmodule  // of rglts_pdm_3p3v
diff --git a/hw/top_earlgrey/ip/ast/rtl/rng.sv b/hw/top_earlgrey/ip/ast/rtl/rng.sv
index dd964d6..72b9725 100644
--- a/hw/top_earlgrey/ip/ast/rtl/rng.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/rng.sv
@@ -2,45 +2,48 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: rng
 // *Module Description:  Random (bit/s) Generator
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module rng #(
-   parameter int EntropyStreams = 4
+`ifndef VERILATOR
+// synopsys translate_off
+  parameter time RNG_EN_RDLY = 5us,
+// synopsys translate_on
+`endif
+  parameter int EntropyStreams = 4
 ) (
-   output logic rng_ok_o,
-   output logic [EntropyStreams-1:0] rng_b_o,
-   input rng_en_i,
-   input clk_i,
-   input rst_ni
+  input clk_i,
+  input rst_ni,
+  input vcaon_pok_i,
+  input rng_en_i,
+  output logic [EntropyStreams-1:0] rng_b_o,
+  output logic rng_val_o
 );
 
 ///////////////////////////////////////
 // Clock Oscilator
 ///////////////////////////////////////
-logic clk, rng_clk_en;
+logic clk, rng_clk_en, rng_clk, rst_n;
+assign rst_n = vcaon_pok_i;
 
 // Behavioral Model
+
 // For FPGA, it can be replace with clk_src_aon_o/4 (200K/4=50K)
-rng_osc i_rng_osc (
-/*I*/ .en_i ( rng_en_i ),
-/*O*/ .clk_o ( clk ),
-/*O*/ .clk_en_o (rng_clk_en )
+rng_osc #(
+`ifndef VERILATOR
+// synopsys translate_off
+/*P*/ .RNG_EN_RDLY ( RNG_EN_RDLY )
+// synopsys translate_on
+`endif
+) i_rng_osc (
+/*I*/ .vcaon_pok_i ( vcaon_pok_i ),
+/*I*/ .rng_en_i ( rng_en_i ),
+/*O*/ .rng_clk_o ( rng_clk_o )
 );
 
-logic rng_clk, clk_en;
-
-always_ff @( posedge clk, negedge rst_ni ) begin
-   if ( !rst_ni )  clk_en <= 1'b0;
-   else            clk_en <= rng_clk_en;
-end
-
-assign rng_clk = clk_en ? ~clk : 1'b0;
-
 
 ///////////////////////////////////////
 // LFSR for Pseudo Random Numbers
@@ -50,13 +53,13 @@
 
 assign rng_rst_n = rst_ni && rng_en_i;
 
-always_ff @(posedge rng_clk, negedge rng_rst_n ) begin
-   if ( !rng_rst_n ) begin
-      lfsr_val       <= 32'h1234_5678;
-   end else begin
-      lfsr_val[31:1] <= lfsr_val[30:0];
-      lfsr_val[0]    <= ~(lfsr_val[31] ^ lfsr_val[21] ^ lfsr_val[1] ^ lfsr_val[0]);
-   end
+always_ff @(posedge rng_clk_o, negedge rng_rst_n ) begin
+  if ( !rng_rst_n ) begin
+    lfsr_val       <= 32'h1234_5678;
+  end else begin
+    lfsr_val[31:1] <= lfsr_val[30:0];
+    lfsr_val[0]    <= ~(lfsr_val[31] ^ lfsr_val[21] ^ lfsr_val[1] ^ lfsr_val[0]);
+  end
 end
 
 
@@ -66,46 +69,47 @@
 logic rng_rdy;
 logic [2-1:0] rng_rdy_cnt;
 
-always_ff @( posedge rng_clk, negedge rng_rst_n ) begin
-   if ( !rng_rst_n )     rng_rdy_cnt <= 2'b00;
-   else if ( !rng_rdy )  rng_rdy_cnt <= rng_rdy_cnt + 1'b1;
+always_ff @( posedge rng_clk_o, negedge rng_rst_n ) begin
+  if ( !rng_rst_n )    rng_rdy_cnt <= 2'b00;
+  else if ( !rng_rdy ) rng_rdy_cnt <= rng_rdy_cnt + 1'b1;
 end
 
 assign rng_rdy = (rng_rdy_cnt == 2'b11);
 
 logic [EntropyStreams-1:0] rng_b;
 
-always_ff @( posedge rng_clk, negedge rng_rst_n ) begin
-   if ( !rng_rst_n )  rng_b <= {EntropyStreams{1'b0}};
-   else               rng_b <= lfsr_val[EntropyStreams-1:0];
+always_ff @( posedge rng_clk_o, negedge rng_rst_n ) begin
+  if ( !rng_rst_n ) rng_b <= {EntropyStreams{1'b0}};
+  else              rng_b <= lfsr_val[EntropyStreams-1:0];
 end
 
-// RNG OK!
-logic rng_ok_r;
+
+// Sync RNG OK to clk_i
+logic rng_rdy_s;
 
 always_ff @( posedge clk_i, negedge rst_ni ) begin
-   if ( !rst_ni ) begin
-      rng_ok_r <= 1'b0;
-      rng_ok_o <= 1'b0;
-   end
-   else begin
-      rng_ok_r <= rng_rdy;
-      rng_ok_o <= rng_ok_r;
-   end
+  if ( !rst_ni ) begin
+    rng_rdy_s <= 1'b0;
+    rng_val_o <= 1'b0;
+  end
+  else begin
+    rng_rdy_s <= rng_rdy;
+    rng_val_o <= rng_rdy_s;
+  end
 end
 
 // Sync RNG Bits to clk_i
 logic [EntropyStreams-1:0] rng_b_r;
 
 always_ff @( posedge clk_i, negedge rst_ni ) begin
-   if ( !rst_ni ) begin
-      rng_b_r <= {EntropyStreams{1'b0}};
-      rng_b_o <= {EntropyStreams{1'b0}};
-   end
-   else begin
-      rng_b_r <= rng_b;
-      rng_b_o <= rng_b_r;
-   end
+  if ( !rst_ni ) begin
+    rng_b_r <= {EntropyStreams{1'b0}};
+    rng_b_o <= {EntropyStreams{1'b0}};
+  end
+  else begin
+    rng_b_r <= rng_b;
+    rng_b_o <= rng_b_r;
+  end
 end
 
 
diff --git a/hw/top_earlgrey/ip/ast/rtl/rng_osc.sv b/hw/top_earlgrey/ip/ast/rtl/rng_osc.sv
index 329d284..11f374e 100644
--- a/hw/top_earlgrey/ip/ast/rtl/rng_osc.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/rng_osc.sv
@@ -2,52 +2,58 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: rng_osc
 // *Module Description: RNG Clock Oscilator
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module rng_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time EN_RDLY = 10us,
-   parameter time EN_FDLY = 100ns
+  parameter time RNG_EN_RDLY = 5us
 // synopsys translate_on
+`endif
 ) (
-   input en_i,                 // RNG Source Clock Enable
-   output logic clk_o,         // RNG Clock Output
-   output logic clk_en_o       // RNG Clock Enable Output
+  input vcaon_pok_i,        // VCAON POK @1.1V
+  input rng_en_i,           // RNG Source Clock Enable
+  output logic rng_clk_o    // RNG Clock Output
 );
 
+// Behavioral Model
+
+`ifndef VERILATOR
 // synopsys translate_off
-logic init_start, clk;
 integer CLK_PERIOD;
+logic clk, en_osc, en_osc_re, en_osc_fe;
 
 initial begin
-   clk = 1'b0;
-   // Seed is set from the vcs run command
-   CLK_PERIOD = 10**9/$urandom_range(70000, 50000);  // ns (50Khz-70Khz)
-   $display( "\nRNG Internal Clock Period: %0dns", CLK_PERIOD);
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
+  clk = 1'b0;
+  // Seed is set from the vcs run command
+  CLK_PERIOD = 10**9/$urandom_range(70000, 50000);  // ns (50Khz-70Khz)
+  $display( "\nRNG Internal Clock Period: %0dns", CLK_PERIOD);
 end
 
+always @( * ) begin
+  if ( !vcaon_pok_i )                 en_osc_re = 1'b0;  // For Startup
+  else if ( rng_en_i && vcaon_pok_i ) en_osc_re = #(RNG_EN_RDLY) 1'b1;
+  else                                en_osc_re = 1'b0;
+end
+
+// Syncronize en_osc to clk FE for glitch free disable
+always_ff @( negedge clk or negedge vcaon_pok_i ) begin
+  if ( !vcaon_pok_i ) en_osc_fe <= 1'b0;
+  else                en_osc_fe <= en_osc_re;
+end
+
+assign en_osc = en_osc_re || en_osc_fe;  // EN -> 1 || EN -> 0
+
 always begin
-   #(CLK_PERIOD/2) clk = ~clk;
+  #(CLK_PERIOD/2) clk = ~clk && en_osc;
 end
 
-assign clk_o = clk;
-
-always_ff @( init_start, posedge en_i, negedge en_i ) begin
-    if ( init_start )
-       clk_en_o <= 1'b0;
-    else if ( !init_start && en_i )
-       clk_en_o <= #(EN_RDLY) en_i;
-    else if ( !init_start && !en_i )
-       clk_en_o <= #(EN_FDLY) en_i;
-end
+assign rng_clk_o = clk;
 // synopsys translate_on
+`endif
 
 
 endmodule  // of rng_osc
diff --git a/hw/top_earlgrey/ip/ast/rtl/sys_clk.sv b/hw/top_earlgrey/ip/ast/rtl/sys_clk.sv
index 103a38f..554ce71 100644
--- a/hw/top_earlgrey/ip/ast/rtl/sys_clk.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/sys_clk.sv
@@ -2,55 +2,60 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: sys_clk
 // *Module Description: System Clock
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module sys_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time SYS_EN_RDLY = 10us,
-   parameter time SYS_EN_FDLY = 100ns,
-   parameter time SYS_JEN_RDLY = 80ns,
-   parameter time SYS_JEN_FDLY = 80ns
+  parameter time SYS_EN_RDLY = 5us
 // synopsys translate_on
+`endif
 ) (
-   input clk_src_sys_en_i,                       // System Source Clock Enable
-   input clk_src_sys_jen_i,                      // System Source Clock Jitter Enable
-   input rst_ni,                                 // SYS Reset
-   output logic clk_src_sys_o,                   // System Source Clock
-   output logic clk_src_sys_val_o                // System Source Clock Valid
+  input vcmain_pok_i,               // VCMAIN POK @1.1V
+  input clk_src_sys_en_i,           // System Source Clock Enable
+  input clk_src_sys_jen_i,          // System Source Clock Jitter Enable
+  output logic clk_src_sys_o,       // System Source Clock
+  output logic clk_src_sys_val_o    // System Source Clock Valid
 );
 
-logic clk, sys_en, clk_en;
+logic clk, sys_clk_val, rst_n;
 
 // Behavioral Model
+assign rst_n = vcmain_pok_i;
 
 // Clock Oscilator
 sys_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-/*P*/ .SYS_EN_RDLY ( SYS_EN_RDLY ),
-/*P*/ .SYS_EN_FDLY ( SYS_EN_FDLY ),
-/*P*/ .SYS_JEN_RDLY ( SYS_JEN_RDLY ),
-/*P*/ .SYS_JEN_FDLY ( SYS_JEN_FDLY )
+/*P*/ .SYS_EN_RDLY ( SYS_EN_RDLY )
 // synopsys translate_on
+`endif
 ) i_sys_osc (
+/*I*/ .vcmain_pok_i ( vcmain_pok_i ),
 /*I*/ .sys_en_i ( clk_src_sys_en_i ),
 /*I*/ .sys_jen_i ( clk_src_sys_jen_i ),
-/*O*/ .sys_clk_o ( clk ),
-/*O*/ .sys_clk_en_o ( sys_en )
+/*O*/ .sys_clk_o ( clk )
 );
 
-always_ff @( posedge clk, negedge rst_ni ) begin
-   if ( !rst_ni )  clk_en <= 1'b0;
-   else            clk_en <= sys_en;
-end
 
 // Clock & Valid
-assign clk_src_sys_o = clk_en ? ~clk : 1'b0;
-assign clk_src_sys_val_o = clk_en;
+assign clk_src_sys_o = clk;
+
+wire rst_val_n = rst_n && clk_src_sys_en_i;
+
+// 2-stage deassertion
+always_ff @( posedge clk, negedge rst_val_n ) begin
+  if ( !rst_val_n ) begin
+    sys_clk_val       <= 1'b0;
+    clk_src_sys_val_o <= 1'b0;
+  end else begin
+    sys_clk_val       <= 1'b1;
+    clk_src_sys_val_o <= sys_clk_val;
+  end
+end
 
 
 endmodule  // of sys_clk
diff --git a/hw/top_earlgrey/ip/ast/rtl/sys_osc.sv b/hw/top_earlgrey/ip/ast/rtl/sys_osc.sv
index 26810fb..f5bca98 100644
--- a/hw/top_earlgrey/ip/ast/rtl/sys_osc.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/sys_osc.sv
@@ -2,59 +2,61 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-// 
 // *Name: sys_osc
 // *Module Description: System Clock Oscilator
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 1ps
 
 module sys_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time SYS_EN_RDLY = 10us,
-   parameter time SYS_EN_FDLY = 100ns,
-   parameter time SYS_JEN_RDLY = 80ns,
-   parameter time SYS_JEN_FDLY = 80ns
+  parameter time SYS_EN_RDLY = 5us
 // synopsys translate_on
+`endif
 ) (
-   input sys_en_i,              // System Source Clock Enable
-   input sys_jen_i,             // System Source Clock Jitter Enable
-   output logic sys_clk_o,      // System Clock Output
-   output logic sys_clk_en_o    // System Clock Enable Output
+  input vcmain_pok_i,     // VCMAIN POK @1.1V
+  input sys_en_i,         // System Source Clock Enable
+  input sys_jen_i,        // System Source Clock Jitter Enable
+  output logic sys_clk_o  // System Clock Output
 );
 
+// Behavioral Model
+
+`ifndef VERILATOR
 // synopsys translate_off
 localparam real SYS_CLK_PERIOD = 10000; // 10000ps (100Mhz)
 
-logic init_start, clk;
+logic clk, en_osc, en_osc_re, en_osc_fe;
 shortreal jitter;
 
 initial begin
-   clk  = 1'b0;
-   $display("\nSYS Clock Period: %0dps", SYS_CLK_PERIOD);
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
+  clk  = 1'b0;
+  $display("\nSYS Clock Period: %0dps", SYS_CLK_PERIOD);
 end
 
-wire #(SYS_JEN_RDLY, SYS_JEN_FDLY) sys_jen = sys_jen_i; 
+always @( * ) begin
+  if ( !vcmain_pok_i )                 en_osc_re = 1'b0;  // For Startup
+  else if ( sys_en_i && vcmain_pok_i ) en_osc_re = #(SYS_EN_RDLY) 1'b1;
+  else                                 en_osc_re = 1'b0;
+end
+
+// Syncronize en_osc to clk FE for glitch free disable
+always_ff @( negedge clk or negedge vcmain_pok_i ) begin
+  if ( !vcmain_pok_i ) en_osc_fe <= 1'b0;
+  else                 en_osc_fe <= en_osc_re;
+end
+
+assign en_osc = en_osc_re || en_osc_fe;  // EN -> 1 || EN -> 0
 
 always begin
-   // 0-2000ps is upto +20% Jitter
-   jitter = sys_jen ? $urandom_range(2000, 0) : 0; 
-   #((SYS_CLK_PERIOD+jitter)/2000) clk = ~clk;
+  // 0-2000ps is upto +20% Jitter
+  jitter = sys_jen_i ? $urandom_range(2000, 0) : 0; 
+  #((SYS_CLK_PERIOD+jitter)/2000) clk = ~clk && en_osc;
 end
 
 assign sys_clk_o = clk;
-
-always_ff @( init_start, posedge sys_en_i, negedge sys_en_i ) begin
-    if ( init_start )
-       sys_clk_en_o <= 1'b0;
-    else if ( !init_start && sys_en_i )
-       sys_clk_en_o <= #(SYS_EN_RDLY) sys_en_i;
-    else if ( !init_start && !sys_en_i )                  
-       sys_clk_en_o <= #(SYS_EN_FDLY) sys_en_i;
-end
 // synopsys translate_on
+`endif
 
 
 endmodule  // of sys_osc
diff --git a/hw/top_earlgrey/ip/ast/rtl/usb_clk.sv b/hw/top_earlgrey/ip/ast/rtl/usb_clk.sv
index d799ece..623db97 100644
--- a/hw/top_earlgrey/ip/ast/rtl/usb_clk.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/usb_clk.sv
@@ -2,58 +2,68 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-//
 // *Name: usb_clk
 // *Module Description: USB Clock
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 10ps
 
 module usb_clk #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time USB_EN_RDLY = 10us,
-   parameter time USB_EN_FDLY = 100ns,
-   parameter time USB_VAL_RDLY = 50ms,
-   parameter time USB_VAL_FDLY = 80ns,
+  parameter time USB_EN_RDLY = 5us,
+  parameter time USB_VAL_RDLY = 50ms,
+  parameter time USB_VAL_FDLY = 80ns
 // synopsys translate_on
-   parameter int UsbCalibWidth = 16
+`endif
 ) (
-   input rst_ni,                             // AST USB Reset
-   input clk_src_usb_en_i,                   // USB Source Clock Enable
-   input usb_ref_pulse_i,                    // USB Reference Pulse
-   input usb_ref_val_i,                      // USB Reference (Pulse) Valid
-   output logic clk_src_usb_o,               // USB Source Clock
-   output logic clk_src_usb_val_o            // USB Source Clock Valid
+  input vcmain_pok_i,              // VCMAIN POK @1.1V
+  input clk_src_usb_en_i,          // USB Source Clock Enable
+  input usb_ref_pulse_i,           // USB Reference Pulse
+  input usb_ref_val_i,             // USB Reference (Pulse) Valid
+  output logic clk_src_usb_o,      // USB Source Clock
+  output logic clk_src_usb_val_o   // USB Source Clock Valid
 );
 
-logic clk, usb_en, clk_en;
+logic clk, usb_clk_val, rst_n;
 
 // Behavioral Model
+assign rst_n = vcmain_pok_i;
 
 // Clock Oscilator
 usb_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
 /*P*/ .USB_EN_RDLY ( USB_EN_RDLY ),
-/*P*/ .USB_EN_FDLY ( USB_EN_FDLY ),
 /*P*/ .USB_VAL_RDLY ( USB_VAL_RDLY ),
 /*P*/ .USB_VAL_FDLY ( USB_VAL_FDLY )
 // synopsys translate_on
+`endif
 ) i_usb_osc (
+/*I*/ .vcmain_pok_i ( vcmain_pok_i ),
 /*I*/ .usb_en_i ( clk_src_usb_en_i ),
 /*I*/ .usb_ref_val_i ( usb_ref_val_i ),
-/*O*/ .usb_clk_o ( clk ),
-/*O*/ .usb_clk_en_o ( usb_en )
+/*O*/ .usb_clk_o ( clk )
 );
 
 
-always_ff @( posedge clk, negedge rst_ni ) begin
-   if ( !rst_ni )  clk_en <= 1'b0;
-   else            clk_en <= usb_en;
-end
-
 // Clock & Valid
-assign clk_src_usb_o = clk_en ? ~clk : 1'b0;
-assign clk_src_usb_val_o = clk_en;
+assign clk_src_usb_o = clk;
+
+// 2-stage assertion
+logic rst_val_n;
+
+assign rst_val_n = rst_n && clk_src_usb_en_i;
+
+always_ff @( posedge clk, negedge rst_val_n ) begin
+  if ( !rst_val_n )  begin
+    usb_clk_val       <= 1'b0;
+    clk_src_usb_val_o <= 1'b0;
+  end
+  else begin
+    usb_clk_val       <= 1'b1;
+    clk_src_usb_val_o <= usb_clk_val;
+  end
+end
 
 
 endmodule  // of usb_clk
diff --git a/hw/top_earlgrey/ip/ast/rtl/usb_osc.sv b/hw/top_earlgrey/ip/ast/rtl/usb_osc.sv
index 929c1be..62c075a 100644
--- a/hw/top_earlgrey/ip/ast/rtl/usb_osc.sv
+++ b/hw/top_earlgrey/ip/ast/rtl/usb_osc.sv
@@ -2,61 +2,66 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 //############################################################################
-// 
 // *Name: usb_osc
 // *Module Description: USB Clock Oscilator
-//
 //############################################################################
-`timescale 1ns/1ps
+`timescale 1ns / 1ps
 
 module usb_osc #(
+`ifndef VERILATOR
 // synopsys translate_off
-   parameter time USB_EN_RDLY = 10us,
-   parameter time USB_EN_FDLY = 100ns,
-   parameter time USB_VAL_RDLY = 80ns,
-   parameter time USB_VAL_FDLY = 80ns
+  parameter time USB_EN_RDLY = 5us,
+  parameter time USB_VAL_RDLY = 80ns,
+  parameter time USB_VAL_FDLY = 80ns
 // synopsys translate_on
+`endif
 ) (
-   input usb_en_i,              // USB Source Clock Enable
-   input usb_ref_val_i,         // USB Reference Valid
-   output logic usb_clk_o,      // USB Clock Output
-   output logic usb_clk_en_o    // USB Clock Enable Output
+  input vcmain_pok_i,      // VCMAIN POK @1.1V
+  input usb_en_i,          // USB Source Clock Enable
+  input usb_ref_val_i,     // USB Reference Valid
+  output logic usb_clk_o   // USB Clock Output
 );
 
+// Behavioral Model
+
+`ifndef VERILATOR
 // synopsys translate_off
 localparam real USB_CLK_PERIOD = 1000000/48;  // ~20833.33333ps (48Mhz)
-
-logic init_start, clk;
+logic clk, en_osc, en_osc_re, en_osc_fe;
 shortreal drift;
 integer rand32;
 
 initial begin
-   clk = 1'b0;
-   $display("\nUSB Clock Period: %0dps", USB_CLK_PERIOD);
-   rand32 = $urandom_range((9'd416), -(9'd416));  // +/-416ps (+/-2% max)
-   $display("USB Clock Drift: %0dps", rand32);
-   init_start = 1'b1; #1;
-   init_start = 1'b0;
+  clk = 1'b0;
+  $display("\nUSB Clock Period: %0dps", USB_CLK_PERIOD);
+  rand32 = $urandom_range((9'd416), -(9'd416));  // +/-416ps (+/-2% max)
+  $display("USB Clock Drift: %0dps", rand32);
 end
 
+always @( * ) begin
+  if ( !vcmain_pok_i )                 en_osc_re = 1'b0;  // For Startup
+  else if ( usb_en_i && vcmain_pok_i ) en_osc_re = #(USB_EN_RDLY) 1'b1;
+  else                                 en_osc_re = 1'b0;
+end
+
+// Syncronize en_osc to clk FE for glitch free disable
+always_ff @( negedge clk or negedge vcmain_pok_i ) begin
+  if ( !vcmain_pok_i ) en_osc_fe <= 1'b0;
+  else                 en_osc_fe <= en_osc_re;
+end
+
+assign en_osc = en_osc_re || en_osc_fe;  // EN -> 1 || EN -> 0
+
 wire #(USB_VAL_RDLY, USB_VAL_FDLY) ref_val = usb_ref_val_i;
 assign drift = ref_val ? 0 : rand32;
 
 always begin
-   #((USB_CLK_PERIOD+drift)/2000) clk = ~clk;
+  #((USB_CLK_PERIOD + drift)/2000) clk = ~clk && en_osc;
 end
 
 assign usb_clk_o = clk;
-
-always_ff @( init_start, posedge usb_en_i, negedge usb_en_i ) begin
-    if ( init_start )
-       usb_clk_en_o <= 1'b0;
-    else if ( !init_start && usb_en_i )
-       usb_clk_en_o <= #(USB_EN_RDLY) usb_en_i;
-    else if ( !init_start && !usb_en_i )                  
-       usb_clk_en_o <= #(USB_EN_FDLY) usb_en_i;
-end
 // synopsys translate_on
+`endif
 
 
 endmodule  // of usb_osc