[top] Ast updates
- connect jitter enable
- connect differential scanmode signal
Signed-off-by: Timothy Chen <timothytim@google.com>
fixup! [top] Ast updates
diff --git a/hw/ip/clkmgr/data/clkmgr.hjson.tpl b/hw/ip/clkmgr/data/clkmgr.hjson.tpl
index cddbb91..2e83927 100644
--- a/hw/ip/clkmgr/data/clkmgr.hjson.tpl
+++ b/hw/ip/clkmgr/data/clkmgr.hjson.tpl
@@ -62,6 +62,13 @@
package: "lc_ctrl_pkg",
},
+ { struct: "logic",
+ type: "uni",
+ name: "jitter_en",
+ act: "req",
+ package: ""
+ },
+
// All clock inputs
% for src in srcs:
{ struct: "logic",
@@ -99,6 +106,22 @@
registers: [
+ { name: "JITTER_ENABLE",
+ desc: '''
+ Enable jittery clock
+ ''',
+ swaccess: "rw",
+ hwaccess: "hro",
+ fields: [
+ {
+ bits: "0",
+ name: "VAL",
+ desc: "Enable jittery clock"
+ resval: "0"
+ }
+ ]
+ },
+
{ name: "CLK_ENABLES",
desc: '''
Clock enable for software gateable clocks.
diff --git a/hw/ip/clkmgr/data/clkmgr.sv.tpl b/hw/ip/clkmgr/data/clkmgr.sv.tpl
index 03c708f..84e03df 100644
--- a/hw/ip/clkmgr/data/clkmgr.sv.tpl
+++ b/hw/ip/clkmgr/data/clkmgr.sv.tpl
@@ -41,7 +41,7 @@
output pwrmgr_pkg::pwr_clk_rsp_t pwr_o,
// dft interface
- input scanmode_i,
+ input lc_ctrl_pkg::lc_tx_t scanmode_i,
// idle hints
input [${len(hint_clks)-1}:0] idle_i,
@@ -50,6 +50,9 @@
input lc_ctrl_pkg::lc_tx_t ast_clk_bypass_ack_i,
output lc_ctrl_pkg::lc_tx_t lc_clk_bypass_ack_o,
+ // jittery enable
+ output logic jitter_en_o,
+
// clock output interface
% for intf in export_clks:
output clkmgr_${intf}_out_t clocks_${intf}_o,
@@ -94,6 +97,18 @@
% endfor
% for src in div_srcs:
+
+ lc_ctrl_pkg::lc_tx_t ${src['name']}_div_scanmode;
+ prim_lc_sync #(
+ .NumCopies(1),
+ .AsyncOn(0)
+ ) u_${src['name']}_div_scanmode_sync (
+ .clk_i,
+ .rst_ni,
+ .lc_en_i(scanmode_i),
+ .lc_en_o(${src['name']}_div_scanmode)
+ );
+
prim_clock_div #(
.Divisor(${src['div']})
) u_${src['name']}_div (
@@ -101,7 +116,7 @@
.rst_ni(rst_${src['src']}_ni),
.step_down_req_i(step_down_req == lc_ctrl_pkg::On),
.step_down_ack_o(step_down_acks[${loop.index}]),
- .test_en_i(scanmode_i),
+ .test_en_i(${src['name']}_div_scanmode == lc_ctrl_pkg::On),
.clk_o(clk_${src['name']}_i)
);
% endfor
@@ -143,10 +158,21 @@
% endfor
% for src in rg_srcs:
+ lc_ctrl_pkg::lc_tx_t ${src}_scanmode;
+ prim_lc_sync #(
+ .NumCopies(1),
+ .AsyncOn(0)
+ ) u_${src}_scanmode_sync (
+ .clk_i,
+ .rst_ni,
+ .lc_en_i(scanmode_i),
+ .lc_en_o(${src}_scanmode)
+ );
+
prim_clock_gating_sync u_${src}_cg (
.clk_i(clk_${src}_i),
.rst_ni(rst_${src}_ni),
- .test_en_i(scanmode_i),
+ .test_en_i(${src}_scanmode == lc_ctrl_pkg::On),
.async_en_i(pwr_i.ip_clk_en),
.en_o(clk_${src}_en),
.clk_o(clk_${src}_root)
@@ -240,12 +266,23 @@
.q_o(${k}_sw_en)
);
+ lc_ctrl_pkg::lc_tx_t ${k}_scanmode;
+ prim_lc_sync #(
+ .NumCopies(1),
+ .AsyncOn(0)
+ ) u_${k}_scanmode_sync (
+ .clk_i,
+ .rst_ni,
+ .lc_en_i(scanmode_i),
+ .lc_en_o(${k}_scanmode)
+ );
+
prim_clock_gating #(
.NoFpgaGate(1'b1)
) u_${k}_cg (
.clk_i(clk_${v}_root),
.en_i(${k}_sw_en & clk_${v}_en),
- .test_en_i(scanmode_i),
+ .test_en_i(${k}_scanmode == lc_ctrl_pkg::On),
.clk_o(clocks_o.${k})
);
@@ -274,12 +311,23 @@
.q_o(${k}_hint)
);
+ lc_ctrl_pkg::lc_tx_t ${k}_scanmode;
+ prim_lc_sync #(
+ .NumCopies(1),
+ .AsyncOn(0)
+ ) u_${k}_scanmode_sync (
+ .clk_i,
+ .rst_ni,
+ .lc_en_i(scanmode_i),
+ .lc_en_o(${k}_scanmode)
+ );
+
prim_clock_gating #(
.NoFpgaGate(1'b1)
) u_${k}_cg (
.clk_i(clk_${v["src"]}_root),
.en_i(${k}_en & clk_${v["src"]}_en),
- .test_en_i(scanmode_i),
+ .test_en_i(${k}_scanmode == lc_ctrl_pkg::On),
.clk_o(clocks_o.${k})
);
@@ -291,6 +339,8 @@
assign hw2reg.clk_hints_status.${k}_val.d = ${k}_en;
% endfor
+ assign jitter_en_o = reg2hw.jitter_enable.q;
+
////////////////////////////////////////////////////
// Exported clocks
////////////////////////////////////////////////////