[dv/clkmgr] Fix external clock handling
The RTL handling of external clock was recently changed.
Update DV to match interface changes.
Signed-off-by: Guillermo Maturana <maturana@google.com>
diff --git a/hw/ip/clkmgr/dv/env/clkmgr_if.sv b/hw/ip/clkmgr/dv/env/clkmgr_if.sv
index 5e8d33d..faffb6e 100644
--- a/hw/ip/clkmgr/dv/env/clkmgr_if.sv
+++ b/hw/ip/clkmgr/dv/env/clkmgr_if.sv
@@ -44,6 +44,8 @@
prim_mubi_pkg::mubi4_t all_clk_byp_req;
prim_mubi_pkg::mubi4_t all_clk_byp_ack;
+ prim_mubi_pkg::mubi4_t div_step_down_req;
+
prim_mubi_pkg::mubi4_t jitter_en_o;
clkmgr_pkg::clkmgr_out_t clocks_o;
@@ -81,9 +83,8 @@
prim_mubi_pkg::mubi4_t extclk_ctrl_csr_step_down;
always_comb begin
- extclk_ctrl_csr_step_down = (`CLKMGR_HIER.hi_speed_sel_o == prim_mubi_pkg::MuBi4False) ?
- prim_mubi_pkg::MuBi4True :
- prim_mubi_pkg::MuBi4False;
+ extclk_ctrl_csr_step_down = prim_mubi_pkg::mubi4_t'(
+ `CLKMGR_HIER.reg2hw.extclk_ctrl.hi_speed_sel.q);
end
prim_mubi_pkg::mubi4_t jitter_enable_csr;
@@ -190,6 +191,12 @@
all_clk_byp_ack = value;
endfunction
+ function automatic void update_div_step_down_req(prim_mubi_pkg::mubi4_t value);
+ `uvm_info("clkmgr_if", $sformatf("In clkmgr_if update_div_step_down_req with %b", value),
+ UVM_MEDIUM)
+ div_step_down_req = value;
+ endfunction
+
function automatic void update_io_clk_byp_ack(prim_mubi_pkg::mubi4_t value);
io_clk_byp_ack = value;
endfunction
diff --git a/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv b/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv
index 5d5741e..a4b555f 100644
--- a/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv
+++ b/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv
@@ -54,11 +54,6 @@
prev_all_clk_byp_req = cfg.clkmgr_vif.all_clk_byp_req;
end
if (cfg.clk_rst_vif.rst_n) begin
- if ((cfg.clkmgr_vif.clk_cb.extclk_ctrl_csr_sel == MuBi4True) &&
- (cfg.clkmgr_vif.clk_cb.lc_hw_debug_en_i == On)) begin
- `DV_CHECK_EQ(cfg.clkmgr_vif.all_clk_byp_req, MuBi4True,
- "Expected all_clk_byp_req to be On")
- end
if (cfg.en_cov) begin
cov.extclk_cg.sample(cfg.clkmgr_vif.clk_cb.extclk_ctrl_csr_sel == MuBi4True,
cfg.clkmgr_vif.clk_cb.extclk_ctrl_csr_step_down == MuBi4True,
@@ -81,10 +76,6 @@
prev_lc_clk_byp_req = cfg.clkmgr_vif.lc_clk_byp_req;
end
if (cfg.clk_rst_vif.rst_n) begin
- if (cfg.clkmgr_vif.clk_cb.lc_clk_byp_req == On) begin
- `DV_CHECK_EQ(cfg.clkmgr_vif.io_clk_byp_req, MuBi4True,
- "Expected io_clk_byp_req to be True")
- end
if (cfg.en_cov) begin
cov.extclk_cg.sample(cfg.clkmgr_vif.clk_cb.extclk_ctrl_csr_sel == MuBi4True,
cfg.clkmgr_vif.clk_cb.extclk_ctrl_csr_step_down == MuBi4True,
@@ -276,9 +267,13 @@
})
end
end
+ "jitter_regwen": begin
+ end
"jitter_enable": begin
if (addr_phase_write) begin
- `DV_CHECK_EQ(prim_mubi_pkg::mubi4_t'(item.a_data), cfg.clkmgr_vif.jitter_enable_csr)
+ if (`gmv(ral.jitter_regwen)) begin
+ `DV_CHECK_EQ(prim_mubi_pkg::mubi4_t'(item.a_data), cfg.clkmgr_vif.jitter_enable_csr)
+ end
end
end
"clk_enables": begin
diff --git a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_base_vseq.sv b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_base_vseq.sv
index e53088a..297b38d 100644
--- a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_base_vseq.sv
+++ b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_base_vseq.sv
@@ -88,6 +88,7 @@
cfg.clkmgr_vif.update_main_ip_clk_en(1'b0);
cfg.clkmgr_vif.update_usb_ip_clk_en(1'b0);
cfg.clkmgr_vif.update_all_clk_byp_ack(MuBi4False);
+ cfg.clkmgr_vif.update_div_step_down_req(MuBi4False);
cfg.clkmgr_vif.update_io_clk_byp_ack(MuBi4False);
disable_unnecessary_exclusions();
diff --git a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_extclk_vseq.sv b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_extclk_vseq.sv
index b8ddac3..87a4f6e 100644
--- a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_extclk_vseq.sv
+++ b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_extclk_vseq.sv
@@ -24,24 +24,33 @@
rand int cycles_before_lc_clk_byp_req;
rand int cycles_before_lc_clk_byp_ack;
rand int cycles_before_all_clk_byp_ack;
+ rand int cycles_before_div_step_down_req;
rand int cycles_before_io_clk_byp_ack;
rand int cycles_before_next_trans;
constraint cycles_to_stim_c {
cycles_before_extclk_ctrl_sel inside {[4 : 20]};
cycles_before_lc_clk_byp_req inside {[4 : 20]};
- cycles_before_lc_clk_byp_ack inside {[12 : 20]};
+ cycles_before_lc_clk_byp_ack inside {[16 : 30]};
cycles_before_all_clk_byp_ack inside {[3 : 11]};
+ cycles_before_div_step_down_req inside {[3 : 11]};
cycles_before_io_clk_byp_ack inside {[3 : 11]};
- cycles_before_next_trans inside {[15 : 25]};
+ cycles_before_next_trans inside {[15 : 35]};
}
lc_tx_t lc_clk_byp_req;
lc_tx_t lc_debug_en;
+ mubi4_t io_clk_byp_ack_non_true;
+ mubi4_t all_clk_byp_ack_non_true;
+ mubi4_t div_step_down_req_non_true;
function void post_randomize();
lc_clk_byp_req = get_rand_lc_tx_val(8, 2, 2);
lc_debug_en = get_rand_lc_tx_val(8, 2, 2);
+ io_clk_byp_ack_non_true = get_rand_mubi4_val(0, 2, 8);
+ all_clk_byp_ack_non_true = get_rand_mubi4_val(0, 2, 8);
+ div_step_down_req_non_true = get_rand_mubi4_val(0, 2, 8);
+
`uvm_info(`gfn, $sformatf(
"randomize gives lc_clk_byp_req=0x%x, lc_debug_en=0x%x", lc_clk_byp_req, lc_debug_en),
UVM_MEDIUM)
@@ -50,17 +59,39 @@
// Notice only all_clk_byp_req and io_clk_byp_req Mubi4True and Mubi4False cause transitions.
+ local task delayed_update_all_clk_byp_ack(mubi4_t value, int cycles);
+ cfg.clk_rst_vif.wait_clks(cycles);
+ cfg.clkmgr_vif.update_all_clk_byp_ack(value);
+ endtask
+
+ local task delayed_update_div_step_down_req(mubi4_t value, int cycles);
+ cfg.clk_rst_vif.wait_clks(cycles);
+ cfg.clkmgr_vif.update_div_step_down_req(value);
+ endtask
+
+ local task delayed_update_io_clk_byp_ack(mubi4_t value, int cycles);
+ cfg.clk_rst_vif.wait_clks(cycles);
+ cfg.clkmgr_vif.update_io_clk_byp_ack(value);
+ endtask
+
local task all_clk_byp_handshake();
forever
@cfg.clkmgr_vif.all_clk_byp_req begin : all_clk_byp_ack
if (cfg.clkmgr_vif.all_clk_byp_req == prim_mubi_pkg::MuBi4True) begin
`uvm_info(`gfn, "Got all_clk_byp_req on", UVM_MEDIUM)
- cfg.clk_rst_vif.wait_clks(cycles_before_all_clk_byp_ack);
- cfg.clkmgr_vif.update_all_clk_byp_ack(prim_mubi_pkg::MuBi4True);
- end else if (cfg.clkmgr_vif.all_clk_byp_req == prim_mubi_pkg::MuBi4False) begin
+ fork
+ delayed_update_all_clk_byp_ack(MuBi4True, cycles_before_all_clk_byp_ack);
+ delayed_update_div_step_down_req(MuBi4True, cycles_before_div_step_down_req);
+ join
+ end else begin
`uvm_info(`gfn, "Got all_clk_byp_req off", UVM_MEDIUM)
- cfg.clk_rst_vif.wait_clks(cycles_before_all_clk_byp_ack);
- cfg.clkmgr_vif.update_all_clk_byp_ack(prim_mubi_pkg::MuBi4False);
+ // Set inputs to mubi4 non-True.
+ fork
+ delayed_update_all_clk_byp_ack(all_clk_byp_ack_non_true,
+ cycles_before_all_clk_byp_ack);
+ delayed_update_div_step_down_req(div_step_down_req_non_true,
+ cycles_before_div_step_down_req);
+ join
end
end
endtask
@@ -68,14 +99,21 @@
local task io_clk_byp_handshake();
forever
@cfg.clkmgr_vif.io_clk_byp_req begin : io_clk_byp_ack
- if (cfg.clkmgr_vif.io_clk_byp_req == prim_mubi_pkg::MuBi4True) begin
- `uvm_info(`gfn, "Got io_clk_byp_req on", UVM_MEDIUM)
- cfg.clk_rst_vif.wait_clks(cycles_before_io_clk_byp_ack);
- cfg.clkmgr_vif.update_io_clk_byp_ack(prim_mubi_pkg::MuBi4True);
+ if (cfg.clkmgr_vif.io_clk_byp_req == MuBi4True) begin
+ `uvm_info(`gfn, "Got io_clk_byp_req True", UVM_MEDIUM)
+ fork
+ delayed_update_io_clk_byp_ack(MuBi4True, cycles_before_io_clk_byp_ack);
+ delayed_update_div_step_down_req(MuBi4True, cycles_before_div_step_down_req);
+ join
end else begin
- `uvm_info(`gfn, "Got io_clk_byp_req off", UVM_MEDIUM)
- cfg.clk_rst_vif.wait_clks(cycles_before_io_clk_byp_ack);
- cfg.clkmgr_vif.update_io_clk_byp_ack(prim_mubi_pkg::MuBi4False);
+ `uvm_info(`gfn, "Got io_clk_byp_req non True", UVM_MEDIUM)
+ // Set inputs to mubi4 non-True.
+ fork
+ delayed_update_io_clk_byp_ack(io_clk_byp_ack_non_true,
+ cycles_before_io_clk_byp_ack);
+ delayed_update_div_step_down_req(div_step_down_req_non_true,
+ cycles_before_div_step_down_req);
+ join
end
end
endtask
diff --git a/hw/ip/clkmgr/dv/sva/clkmgr_bind.sv b/hw/ip/clkmgr/dv/sva/clkmgr_bind.sv
index 2458304..6c9b977 100644
--- a/hw/ip/clkmgr/dv/sva/clkmgr_bind.sv
+++ b/hw/ip/clkmgr/dv/sva/clkmgr_bind.sv
@@ -10,9 +10,9 @@
// In top-level testbench, do not bind the csr_assert_fpv to reduce simulation time.
- `ifndef TOP_LEVEL_DV
+`ifndef TOP_LEVEL_DV
bind clkmgr clkmgr_csr_assert_fpv clkmgr_csr_assert (.clk_i, .rst_ni, .h2d(tl_i), .d2h(tl_o));
- `endif
+`endif
bind clkmgr clkmgr_pwrmgr_sva_if clkmgr_pwrmgr_sva_if (
.clk_i,
@@ -97,19 +97,25 @@
.gated_clk(clocks_o.clk_main_otbn)
);
+ bind clkmgr clkmgr_extclk_sva_if clkmgr_extclk_sva_if (
+ .clk_i,
+ .rst_ni,
+ .extclk_ctrl_sel(mubi4_t'(reg2hw.extclk_ctrl.sel.q)),
+ .extclk_ctrl_hi_speed_sel(mubi4_t'(reg2hw.extclk_ctrl.hi_speed_sel.q)),
+ .lc_hw_debug_en_i,
+ .lc_clk_byp_req_i,
+ .io_clk_byp_req_o,
+ .all_clk_byp_req_o,
+ .hi_speed_sel_o
+ );
+
bind clkmgr clkmgr_div_sva_if #(
.DIV(2)
) clkmgr_div2_sva_if (
.clk(clocks_o.clk_io_powerup),
.rst_n(rst_ni),
.maybe_divided_clk(clocks_o.clk_io_div2_powerup),
- .lc_step_down_ctrl(lc_clk_byp_req_i == lc_ctrl_pkg::On),
- .lc_step_down_ack(io_clk_byp_ack_i == prim_mubi_pkg::MuBi4True),
- .sw_step_down_ctrl(lc_hw_debug_en_i == lc_ctrl_pkg::On &&
- reg2hw.extclk_ctrl.sel.q == prim_mubi_pkg::MuBi4True &&
- reg2hw.extclk_ctrl.hi_speed_sel.q == prim_mubi_pkg::MuBi4False),
- .sw_step_down_ack(all_clk_byp_ack_i == prim_mubi_pkg::MuBi4True),
- .sw_step_up_ack(all_clk_byp_ack_i == prim_mubi_pkg::MuBi4False),
+ .div_step_down_req_i(div_step_down_req_i == prim_mubi_pkg::MuBi4True),
.scanmode(scanmode_i == prim_mubi_pkg::MuBi4True)
);
@@ -120,13 +126,7 @@
.clk(clocks_o.clk_io_div2_powerup),
.rst_n(rst_ni),
.maybe_divided_clk(clocks_o.clk_io_div4_powerup),
- .lc_step_down_ctrl(lc_clk_byp_req_i == lc_ctrl_pkg::On),
- .lc_step_down_ack(io_clk_byp_ack_i == prim_mubi_pkg::MuBi4True),
- .sw_step_down_ctrl(lc_hw_debug_en_i == lc_ctrl_pkg::On &&
- reg2hw.extclk_ctrl.sel.q == prim_mubi_pkg::MuBi4True &&
- reg2hw.extclk_ctrl.hi_speed_sel.q == prim_mubi_pkg::MuBi4False),
- .sw_step_down_ack(all_clk_byp_ack_i == prim_mubi_pkg::MuBi4True),
- .sw_step_up_ack(all_clk_byp_ack_i == prim_mubi_pkg::MuBi4False),
+ .div_step_down_req_i(div_step_down_req_i == prim_mubi_pkg::MuBi4True),
.scanmode(scanmode_i == prim_mubi_pkg::MuBi4True)
);
@@ -288,8 +288,7 @@
.clk(clk_main_i),
.rst_n(rst_main_ni),
.ip_clk_en(clk_main_en),
- .sw_clk_en(u_clk_main_aes_trans.sw_hint_synced ||
- !u_clk_main_aes_trans.idle_valid),
+ .sw_clk_en(u_clk_main_aes_trans.sw_hint_synced || !u_clk_main_aes_trans.idle_valid),
.scanmode(prim_mubi_pkg::MuBi4False),
.cg_en(cg_en_o.main_aes == prim_mubi_pkg::MuBi4True)
);
@@ -298,8 +297,7 @@
.clk(clk_main_i),
.rst_n(rst_main_ni),
.ip_clk_en(clk_main_en),
- .sw_clk_en(u_clk_main_hmac_trans.sw_hint_synced ||
- !u_clk_main_hmac_trans.idle_valid),
+ .sw_clk_en(u_clk_main_hmac_trans.sw_hint_synced || !u_clk_main_hmac_trans.idle_valid),
.scanmode(prim_mubi_pkg::MuBi4False),
.cg_en(cg_en_o.main_hmac == prim_mubi_pkg::MuBi4True)
);
@@ -308,8 +306,7 @@
.clk(clk_main_i),
.rst_n(rst_main_ni),
.ip_clk_en(clk_main_en),
- .sw_clk_en(u_clk_main_kmac_trans.sw_hint_synced ||
- !u_clk_main_kmac_trans.idle_valid),
+ .sw_clk_en(u_clk_main_kmac_trans.sw_hint_synced || !u_clk_main_kmac_trans.idle_valid),
.scanmode(prim_mubi_pkg::MuBi4False),
.cg_en(cg_en_o.main_kmac == prim_mubi_pkg::MuBi4True)
);
@@ -318,8 +315,7 @@
.clk(clk_main_i),
.rst_n(rst_main_ni),
.ip_clk_en(clk_main_en),
- .sw_clk_en(u_clk_main_otbn_trans.sw_hint_synced ||
- !u_clk_main_otbn_trans.idle_valid),
+ .sw_clk_en(u_clk_main_otbn_trans.sw_hint_synced || !u_clk_main_otbn_trans.idle_valid),
.scanmode(prim_mubi_pkg::MuBi4False),
.cg_en(cg_en_o.main_otbn == prim_mubi_pkg::MuBi4True)
);
diff --git a/hw/ip/clkmgr/dv/sva/clkmgr_div_sva_if.sv b/hw/ip/clkmgr/dv/sva/clkmgr_div_sva_if.sv
index 033dce8..1940a91 100644
--- a/hw/ip/clkmgr/dv/sva/clkmgr_div_sva_if.sv
+++ b/hw/ip/clkmgr/dv/sva/clkmgr_div_sva_if.sv
@@ -16,30 +16,16 @@
input logic clk,
input logic rst_n,
input logic maybe_divided_clk,
- input logic lc_step_down_ctrl,
- input logic lc_step_down_ack,
- input logic sw_step_down_ctrl,
- input logic sw_step_down_ack,
- input logic sw_step_up_ack,
+ input logic div_step_down_req_i,
input logic scanmode
);
localparam int WAIT_CYCLES = 20;
-
- logic lc_step_down;
- always_comb lc_step_down = lc_step_down_ctrl && lc_step_down_ack;
- logic lc_step_up;
- always_comb lc_step_up = !lc_step_down_ctrl && !lc_step_down_ack;
- logic sw_step_down;
- always_comb sw_step_down = sw_step_down_ctrl && sw_step_down_ack;
- logic sw_step_up;
- always_comb sw_step_up = !sw_step_down_ctrl && sw_step_up_ack;
-
logic step_down;
- always_comb step_down = (lc_step_down || sw_step_down) && !scanmode;
+ always_comb step_down = div_step_down_req_i && !scanmode;
logic step_up;
- always_comb step_up = (lc_step_up && sw_step_up) || scanmode;
+ always_comb step_up = !step_down;
sequence WholeLeadHigh_S;
step_down || maybe_divided_clk ##1 step_down || !maybe_divided_clk;
@@ -58,8 +44,8 @@
`ASSERT(Div2Stepped_A, $rose(step_down) ##1 step_down [* WAIT_CYCLES] |-> TracksClk_S, !clk,
!rst_n)
`ASSERT(Div2Whole_A,
- $rose(step_up) ##1 step_up [* WAIT_CYCLES] |-> WholeLeadLow_S or WholeLeadHigh_S, !clk,
- !rst_n)
+ $fell(step_down) ##1 !step_down [* WAIT_CYCLES] |-> WholeLeadLow_S or WholeLeadHigh_S,
+ !clk, !rst_n)
end else begin : g_div4
@@ -75,8 +61,8 @@
$rose(step_down) ##1 step_down [* WAIT_CYCLES] |-> StepLeadLow_S or StepLeadHigh_S,
!clk, !rst_n)
`ASSERT(Div4Whole_A,
- $rose(step_up) ##1 step_up [* WAIT_CYCLES] |-> WholeLeadLow_S or WholeLeadHigh_S, !clk,
- !rst_n)
+ $fell(step_down) ##1 !step_down [* WAIT_CYCLES] |-> WholeLeadLow_S or WholeLeadHigh_S,
+ !clk, !rst_n)
end
endinterface
diff --git a/hw/ip/clkmgr/dv/sva/clkmgr_extclk_sva_if.sv b/hw/ip/clkmgr/dv/sva/clkmgr_extclk_sva_if.sv
new file mode 100644
index 0000000..fae8ec3
--- /dev/null
+++ b/hw/ip/clkmgr/dv/sva/clkmgr_extclk_sva_if.sv
@@ -0,0 +1,81 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+// This contains SVA assertions to check the external clock bypass control outputs.
+//
+// Notice when a condition fails we allow the logic to generate non strict mubi values. Ideally it
+// would generate mubi False: see https://github.com/lowRISC/opentitan/issues/11400.
+interface clkmgr_extclk_sva_if
+ import prim_mubi_pkg::*, lc_ctrl_pkg::*;
+(
+ input logic clk_i,
+ input logic rst_ni,
+ input mubi4_t extclk_ctrl_sel,
+ input mubi4_t extclk_ctrl_hi_speed_sel,
+ input lc_tx_t lc_hw_debug_en_i,
+ input lc_tx_t lc_clk_byp_req_i,
+ input mubi4_t io_clk_byp_req_o,
+ input mubi4_t all_clk_byp_req_o,
+ input mubi4_t hi_speed_sel_o
+);
+
+ // The times are to cover the clock domain synchronizers.
+ localparam int FallCyclesMin = 1;
+ localparam int FallCyclesMax = 3;
+
+ localparam int RiseCyclesMin = 1;
+ localparam int RiseCyclesMax = 3;
+
+ bit disable_sva;
+
+ // Check lc_clk_byp_req_i triggers io_clk_byp_req_o.
+ logic lc_clk_byp_req;
+ always_comb lc_clk_byp_req = lc_clk_byp_req_i == On;
+
+ `ASSERT(IoClkBypReqRise_A,
+ $rose(
+ lc_clk_byp_req
+ ) |=> ##[RiseCyclesMin:RiseCyclesMax] !lc_clk_byp_req || (io_clk_byp_req_o == MuBi4True),
+ clk_i, !rst_ni || disable_sva)
+ `ASSERT(IoClkBypReqFall_A,
+ $fell(
+ lc_clk_byp_req
+ ) |=> ##[FallCyclesMin:FallCyclesMax] lc_clk_byp_req || (io_clk_byp_req_o != MuBi4False),
+ clk_i, !rst_ni || disable_sva)
+
+ // Check extclk_ctrl triggers all_clk_byp_req_o and hi_speed_sel_o.
+ logic extclk_sel_enabled;
+ always_comb extclk_sel_enabled = extclk_ctrl_sel == MuBi4True && lc_hw_debug_en_i == On;
+
+ `ASSERT(AllClkBypReqRise_A,
+ $rose(
+ extclk_sel_enabled
+ ) |=> ##[RiseCyclesMin:RiseCyclesMax]
+ !extclk_sel_enabled || (all_clk_byp_req_o == MuBi4True),
+ clk_i, !rst_ni || disable_sva)
+ `ASSERT(AllClkBypReqFall_A,
+ $fell(
+ extclk_sel_enabled
+ ) |=> ##[FallCyclesMin:FallCyclesMax]
+ extclk_sel_enabled || (all_clk_byp_req_o != MuBi4False),
+ clk_i, !rst_ni || disable_sva)
+
+ logic hi_speed_enabled;
+ always_comb begin
+ hi_speed_enabled = extclk_ctrl_sel == MuBi4True && extclk_ctrl_hi_speed_sel == MuBi4True &&
+ lc_hw_debug_en_i == On;
+ end
+
+ `ASSERT(HiSpeedSelRise_A,
+ $rose(
+ hi_speed_enabled
+ ) |=> ##[RiseCyclesMin:RiseCyclesMax] !hi_speed_enabled || (hi_speed_sel_o == MuBi4True),
+ clk_i, !rst_ni || disable_sva)
+ `ASSERT(HiSpeedSelFall_A,
+ $fell(
+ hi_speed_enabled
+ ) |=> ##[FallCyclesMin:FallCyclesMax] hi_speed_enabled || (hi_speed_sel_o != MuBi4True),
+ clk_i, !rst_ni || disable_sva)
+
+endinterface
diff --git a/hw/ip/clkmgr/dv/sva/clkmgr_sva_ifs.core b/hw/ip/clkmgr/dv/sva/clkmgr_sva_ifs.core
index c8cca64..1a85f41 100644
--- a/hw/ip/clkmgr/dv/sva/clkmgr_sva_ifs.core
+++ b/hw/ip/clkmgr/dv/sva/clkmgr_sva_ifs.core
@@ -8,12 +8,15 @@
files_dv:
depend:
- lowrisc:prim:assert
+ - lowrisc:prim:mubi
+ - lowrisc:ip:lc_ctrl_pkg
- lowrisc:dv:clkmgr_pwrmgr_sva_if
files:
- clkmgr_div_sva_if.sv
- clkmgr_gated_clock_sva_if.sv
- clkmgr_aon_cg_en_sva_if.sv
- clkmgr_cg_en_sva_if.sv
+ - clkmgr_extclk_sva_if.sv
file_type: systemVerilogSource
targets:
diff --git a/hw/ip/clkmgr/dv/tb.sv b/hw/ip/clkmgr/dv/tb.sv
index ab8d1e1..1ca05ba 100644
--- a/hw/ip/clkmgr/dv/tb.sv
+++ b/hw/ip/clkmgr/dv/tb.sv
@@ -72,7 +72,7 @@
// dut
clkmgr dut (
- .clk_i (clk),
+ .clk_i(clk),
.rst_ni(rst_n),
.rst_shadowed_ni(rst_n),
@@ -100,15 +100,14 @@
.scanmode_i(clkmgr_if.scanmode_i),
.idle_i (clkmgr_if.idle_i),
- .lc_hw_debug_en_i (clkmgr_if.lc_hw_debug_en_i),
+ .lc_hw_debug_en_i(clkmgr_if.lc_hw_debug_en_i),
.all_clk_byp_req_o(clkmgr_if.all_clk_byp_req),
.all_clk_byp_ack_i(clkmgr_if.all_clk_byp_ack),
- .io_clk_byp_req_o (clkmgr_if.io_clk_byp_req),
- .io_clk_byp_ack_i (clkmgr_if.io_clk_byp_ack),
- .lc_clk_byp_req_i (clkmgr_if.lc_clk_byp_req),
- .lc_clk_byp_ack_o (clkmgr_if.lc_clk_byp_ack),
- // TODO: The new external step down signal must be verified
- .div_step_down_req_i (prim_mubi_pkg::MuBi4False),
+ .io_clk_byp_req_o(clkmgr_if.io_clk_byp_req),
+ .io_clk_byp_ack_i(clkmgr_if.io_clk_byp_ack),
+ .lc_clk_byp_req_i(clkmgr_if.lc_clk_byp_req),
+ .lc_clk_byp_ack_o(clkmgr_if.lc_clk_byp_ack),
+ .div_step_down_req_i(clkmgr_if.div_step_down_req),
.cg_en_o(),