[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> </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> </td>
+<td class="fname" colspan=1 style="font-size:50.0%">FIELD4</td>
+<td class="unused" colspan=2> </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