[dv/clkmgr] Enhance reset handling for stress test
Avoid most checking during reset.
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 788abfb..5d7a4e5 100644
--- a/hw/ip/clkmgr/dv/env/clkmgr_if.sv
+++ b/hw/ip/clkmgr/dv/env/clkmgr_if.sv
@@ -7,7 +7,9 @@
interface clkmgr_if (
input logic clk,
input logic rst_n,
- input logic rst_main_n
+ input logic rst_io_n,
+ input logic rst_main_n,
+ input logic rst_usb_n
);
import clkmgr_env_pkg::*;
@@ -141,16 +143,20 @@
logic [PIPELINE_DEPTH-1:0] clk_enable_div4_ffs;
logic [PIPELINE_DEPTH-1:0] clk_hint_otbn_div4_ffs;
logic [PIPELINE_DEPTH-1:0] ip_clk_en_div4_ffs;
- always @(posedge clocks_o.clk_io_div4_powerup) begin
- if (rst_n) begin
+ always @(posedge clocks_o.clk_io_div4_powerup or negedge rst_io_n) begin
+ if (rst_io_n) begin
clk_enable_div4_ffs <= {clk_enable_div4_ffs[PIPELINE_DEPTH-2:0], clk_enables.io_div4_peri_en};
clk_hint_otbn_div4_ffs <= {
clk_hint_otbn_div4_ffs[PIPELINE_DEPTH-2:0], clk_hints[TransOtbnIoDiv4]
};
ip_clk_en_div4_ffs <= {ip_clk_en_div4_ffs[PIPELINE_DEPTH-2:0], pwr_i.ip_clk_en};
+ end else begin
+ clk_enable_div4_ffs <= '0;
+ clk_hint_otbn_div4_ffs <= '0;
+ ip_clk_en_div4_ffs <= '0;
end
end
- clocking peri_div4_cb @(posedge clocks_o.clk_io_div4_powerup);
+ clocking peri_div4_cb @(posedge clocks_o.clk_io_div4_powerup or negedge rst_io_n);
input ip_clk_en = ip_clk_en_div4_ffs[PIPELINE_DEPTH-1];
input clk_enable = clk_enable_div4_ffs[PIPELINE_DEPTH-1];
input clk_hint_otbn = clk_hint_otbn_div4_ffs[PIPELINE_DEPTH-1];
@@ -159,39 +165,48 @@
logic [PIPELINE_DEPTH-1:0] clk_enable_div2_ffs;
logic [PIPELINE_DEPTH-1:0] ip_clk_en_div2_ffs;
- always @(posedge clocks_o.clk_io_div2_powerup) begin
- if (rst_n) begin
+ always @(posedge clocks_o.clk_io_div2_powerup or negedge rst_io_n) begin
+ if (rst_io_n) begin
clk_enable_div2_ffs <= {clk_enable_div2_ffs[PIPELINE_DEPTH-2:0], clk_enables.io_div2_peri_en};
ip_clk_en_div2_ffs <= {ip_clk_en_div2_ffs[PIPELINE_DEPTH-2:0], pwr_i.ip_clk_en};
+ end else begin
+ clk_enable_div2_ffs <= '0;
+ ip_clk_en_div2_ffs <= '0;
end
end
- clocking peri_div2_cb @(posedge clocks_o.clk_io_div2_powerup);
+ clocking peri_div2_cb @(posedge clocks_o.clk_io_div2_powerup or negedge rst_io_n);
input ip_clk_en = ip_clk_en_div2_ffs[PIPELINE_DEPTH-1];
input clk_enable = clk_enable_div2_ffs[PIPELINE_DEPTH-1];
endclocking
logic [PIPELINE_DEPTH-1:0] clk_enable_io_ffs;
logic [PIPELINE_DEPTH-1:0] ip_clk_en_io_ffs;
- always @(posedge clocks_o.clk_io_powerup) begin
- if (rst_n) begin
+ always @(posedge clocks_o.clk_io_powerup or negedge rst_io_n) begin
+ if (rst_io_n) begin
clk_enable_io_ffs <= {clk_enable_io_ffs[PIPELINE_DEPTH-2:0], clk_enables.io_peri_en};
ip_clk_en_io_ffs <= {ip_clk_en_io_ffs[PIPELINE_DEPTH-2:0], pwr_i.ip_clk_en};
+ end else begin
+ clk_enable_io_ffs <= '0;
+ ip_clk_en_io_ffs <= '0;
end
end
- clocking peri_io_cb @(posedge clocks_o.clk_io_powerup);
+ clocking peri_io_cb @(posedge clocks_o.clk_io_powerup or negedge rst_io_n);
input ip_clk_en = ip_clk_en_io_ffs[PIPELINE_DEPTH-1];
input clk_enable = clk_enable_io_ffs[PIPELINE_DEPTH-1];
endclocking
logic [PIPELINE_DEPTH-1:0] clk_enable_usb_ffs;
logic [PIPELINE_DEPTH-1:0] ip_clk_en_usb_ffs;
- always @(posedge clocks_o.clk_usb_powerup) begin
- if (rst_n) begin
+ always @(posedge clocks_o.clk_usb_powerup or negedge rst_usb_n) begin
+ if (rst_usb_n) begin
clk_enable_usb_ffs <= {clk_enable_usb_ffs[PIPELINE_DEPTH-2:0], clk_enables.usb_peri_en};
ip_clk_en_usb_ffs <= {ip_clk_en_usb_ffs[PIPELINE_DEPTH-2:0], pwr_i.ip_clk_en};
+ end else begin
+ clk_enable_usb_ffs <= '0;
+ ip_clk_en_usb_ffs <= '0;
end
end
- clocking peri_usb_cb @(posedge clocks_o.clk_usb_powerup);
+ clocking peri_usb_cb @(posedge clocks_o.clk_usb_powerup or negedge rst_usb_n);
input ip_clk_en = ip_clk_en_usb_ffs[PIPELINE_DEPTH-1];
input clk_enable = clk_enable_usb_ffs[PIPELINE_DEPTH-1];
endclocking
@@ -199,13 +214,16 @@
// Pipelining and clocking block for transactional unit clocks.
logic [PIPELINE_DEPTH-1:0][NUM_TRANS-1:0] clk_hints_ffs;
logic [PIPELINE_DEPTH-1:0] trans_clk_en_ffs;
- always @(posedge clocks_o.clk_main_powerup) begin
- if (rst_n) begin
+ always @(posedge clocks_o.clk_main_powerup or negedge rst_main_n) begin
+ if (rst_main_n) begin
clk_hints_ffs <= {clk_hints_ffs[PIPELINE_DEPTH-2:0], clk_hints};
trans_clk_en_ffs <= {trans_clk_en_ffs[PIPELINE_DEPTH-2:0], pwr_i.ip_clk_en};
+ end else begin
+ clk_hints_ffs <= '0;
+ trans_clk_en_ffs <= '0;
end
end
- clocking trans_cb @(posedge clocks_o.clk_main_powerup);
+ clocking trans_cb @(posedge clocks_o.clk_main_powerup or negedge rst_main_n);
input ip_clk_en = trans_clk_en_ffs[PIPELINE_DEPTH-1];
input clk_hints = clk_hints_ffs[PIPELINE_DEPTH-1];
input idle_i;
@@ -224,6 +242,8 @@
always @(posedge clk) begin
if (rst_n) begin
step_down_ff <= ast_clk_byp_ack == lc_ctrl_pkg::On;
+ end else begin
+ step_down_ff <= 1'b0;
end
end
clocking step_down_cb @(posedge clk);
diff --git a/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv b/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv
index b4bf9f3..9700946 100644
--- a/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv
+++ b/hw/ip/clkmgr/dv/env/clkmgr_scoreboard.sv
@@ -149,17 +149,24 @@
end
endfunction
+ // Clock monitors.
+ // Notice the clock gating condition is sampled at the clock edge from clocking blocks,
+ // but we add a #0 before the actual clock is checked. This is to be certain the clock
+ // has assumed its value in case some logic needs to settle.
+
task monitor_div4_peri_clock();
forever
@cfg.clkmgr_vif.peri_div4_cb begin
- logic enable = cfg.clkmgr_vif.peri_div4_cb.clk_enable;
- logic clk_en = cfg.clkmgr_vif.peri_div4_cb.ip_clk_en;
- logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
- logic gating_condition = enable && clk_en || scan_en;
- #0;
- check_clock("div4", gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_div4_peri);
- if (cfg.en_cov) begin
- cov.peri_cg_wrap[PeriDiv4].sample(enable, clk_en, scan_en);
+ if (cfg.io_clk_rst_vif.rst_n) begin
+ logic enable = cfg.clkmgr_vif.peri_div4_cb.clk_enable;
+ logic clk_en = cfg.clkmgr_vif.peri_div4_cb.ip_clk_en;
+ logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
+ logic gating_condition = enable && clk_en || scan_en;
+ #0;
+ check_clock("div4", gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_div4_peri);
+ if (cfg.en_cov) begin
+ cov.peri_cg_wrap[PeriDiv4].sample(enable, clk_en, scan_en);
+ end
end
end
endtask
@@ -167,14 +174,16 @@
task monitor_div2_peri_clock();
forever
@cfg.clkmgr_vif.peri_div2_cb begin
- logic enable = cfg.clkmgr_vif.peri_div2_cb.clk_enable;
- logic clk_en = cfg.clkmgr_vif.peri_div2_cb.ip_clk_en;
- logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
- logic gating_condition = enable && clk_en || scan_en;
- #0;
- check_clock("div2", gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_div2_peri);
- if (cfg.en_cov) begin
- cov.peri_cg_wrap[PeriDiv2].sample(enable, clk_en, scan_en);
+ if (cfg.io_clk_rst_vif.rst_n) begin
+ logic enable = cfg.clkmgr_vif.peri_div2_cb.clk_enable;
+ logic clk_en = cfg.clkmgr_vif.peri_div2_cb.ip_clk_en;
+ logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
+ logic gating_condition = enable && clk_en || scan_en;
+ #0;
+ check_clock("div2", gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_div2_peri);
+ if (cfg.en_cov) begin
+ cov.peri_cg_wrap[PeriDiv2].sample(enable, clk_en, scan_en);
+ end
end
end
endtask
@@ -182,14 +191,16 @@
task monitor_io_peri_clock();
forever
@cfg.clkmgr_vif.peri_io_cb begin
- logic enable = cfg.clkmgr_vif.peri_io_cb.clk_enable;
- logic clk_en = cfg.clkmgr_vif.peri_io_cb.ip_clk_en;
- logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
- logic gating_condition = enable && clk_en || scan_en;
- #0;
- check_clock("io", gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_peri);
- if (cfg.en_cov) begin
- cov.peri_cg_wrap[PeriIo].sample(enable, clk_en, scan_en);
+ if (cfg.io_clk_rst_vif.rst_n) begin
+ logic enable = cfg.clkmgr_vif.peri_io_cb.clk_enable;
+ logic clk_en = cfg.clkmgr_vif.peri_io_cb.ip_clk_en;
+ logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
+ logic gating_condition = enable && clk_en || scan_en;
+ #0;
+ check_clock("io", gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_peri);
+ if (cfg.en_cov) begin
+ cov.peri_cg_wrap[PeriIo].sample(enable, clk_en, scan_en);
+ end
end
end
endtask
@@ -197,14 +208,16 @@
task monitor_usb_peri_clock();
forever
@cfg.clkmgr_vif.peri_usb_cb begin
- logic enable = cfg.clkmgr_vif.peri_usb_cb.clk_enable;
- logic clk_en = cfg.clkmgr_vif.peri_usb_cb.ip_clk_en;
- logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
- logic gating_condition = enable && clk_en || scan_en;
- #0;
- check_clock("usb", gating_condition, cfg.clkmgr_vif.clocks_o.clk_usb_peri);
- if (cfg.en_cov) begin
- cov.peri_cg_wrap[PeriUsb].sample(enable, clk_en, scan_en);
+ if (cfg.usb_clk_rst_vif.rst_n) begin
+ logic enable = cfg.clkmgr_vif.peri_usb_cb.clk_enable;
+ logic clk_en = cfg.clkmgr_vif.peri_usb_cb.ip_clk_en;
+ logic scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
+ logic gating_condition = enable && clk_en || scan_en;
+ #0;
+ check_clock("usb", gating_condition, cfg.clkmgr_vif.clocks_o.clk_usb_peri);
+ if (cfg.en_cov) begin
+ cov.peri_cg_wrap[PeriUsb].sample(enable, clk_en, scan_en);
+ end
end
end
endtask
@@ -214,48 +227,51 @@
src_e src = cfg.trans_to_src[trans];
forever begin
- logic hint, idle, clk_en, scan_en, gating_condition;
+ logic hint, idle, clk_en, scan_en, src_rst_n, gating_condition;
// Wait for the correct clocking block (to ensure that we sample when the output clock should
// be high if enabled), then read the relevant signals from that clocking block.
case (src)
SrcMain: begin
@(cfg.clkmgr_vif.trans_cb);
- hint = cfg.clkmgr_vif.trans_cb.clk_hints[trans_index];
- idle = cfg.clkmgr_vif.trans_cb.idle_i[trans_index];
+ hint = cfg.clkmgr_vif.trans_cb.clk_hints[trans_index];
+ idle = cfg.clkmgr_vif.trans_cb.idle_i[trans_index];
clk_en = cfg.clkmgr_vif.trans_cb.ip_clk_en;
+ src_rst_n = cfg.main_clk_rst_vif.rst_n;
end
SrcIoDiv4: begin
@(cfg.clkmgr_vif.peri_div4_cb);
- hint = cfg.clkmgr_vif.peri_div4_cb.clk_hint_otbn;
- idle = cfg.clkmgr_vif.peri_div4_cb.otbn_idle;
+ hint = cfg.clkmgr_vif.peri_div4_cb.clk_hint_otbn;
+ idle = cfg.clkmgr_vif.peri_div4_cb.otbn_idle;
clk_en = cfg.clkmgr_vif.peri_div4_cb.ip_clk_en;
+ src_rst_n = cfg.io_clk_rst_vif.rst_n;
end
endcase
+ if (src_rst_n) begin
+ scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
+ gating_condition = (hint || !idle) && clk_en || scan_en;
- scan_en = cfg.clkmgr_vif.scanmode_i == lc_ctrl_pkg::On;
- gating_condition = (hint || !idle) && clk_en || scan_en;
-
- #0;
- case (trans)
- TransAes: begin
- check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_aes);
+ #0;
+ case (trans)
+ TransAes: begin
+ check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_aes);
+ end
+ TransHmac: begin
+ check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_hmac);
+ end
+ TransKmac: begin
+ check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_kmac);
+ end
+ TransOtbnIoDiv4: begin
+ check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_div4_otbn);
+ end
+ TransOtbnMain: begin
+ check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_otbn);
+ end
+ endcase
+ if (cfg.en_cov) begin
+ cov.trans_cg_wrap[trans].sample(hint, clk_en, scan_en, idle);
end
- TransHmac: begin
- check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_hmac);
- end
- TransKmac: begin
- check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_kmac);
- end
- TransOtbnIoDiv4: begin
- check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_io_div4_otbn);
- end
- TransOtbnMain: begin
- check_clock(trans.name(), gating_condition, cfg.clkmgr_vif.clocks_o.clk_main_otbn);
- end
- endcase
- if (cfg.en_cov) begin
- cov.trans_cg_wrap[trans].sample(hint, clk_en, scan_en, idle);
end
end
endtask
@@ -270,15 +286,17 @@
UVM_MEDIUM)
prev_lc_clk_byp_req = cfg.clkmgr_vif.lc_clk_byp_req;
end
- if (((cfg.clkmgr_vif.extclk_cb.extclk_sel == On) &&
- (cfg.clkmgr_vif.extclk_cb.lc_dft_en_i == On)) ||
- (cfg.clkmgr_vif.extclk_cb.lc_clk_byp_req == On)) begin
- `DV_CHECK_EQ(cfg.clkmgr_vif.ast_clk_byp_req, On, "Expected ast_clk_byp_req to be On")
- end
- if (cfg.en_cov) begin
- cov.extclk_cg.sample(cfg.clkmgr_vif.extclk_cb.extclk_sel,
- cfg.clkmgr_vif.extclk_cb.lc_dft_en_i,
- cfg.clkmgr_vif.extclk_cb.lc_clk_byp_req, cfg.clkmgr_vif.scanmode_i);
+ if (cfg.clk_rst_vif.rst_n) begin
+ if (((cfg.clkmgr_vif.extclk_cb.extclk_sel == On) &&
+ (cfg.clkmgr_vif.extclk_cb.lc_dft_en_i == On)) ||
+ (cfg.clkmgr_vif.extclk_cb.lc_clk_byp_req == On)) begin
+ `DV_CHECK_EQ(cfg.clkmgr_vif.ast_clk_byp_req, On, "Expected ast_clk_byp_req to be On")
+ end
+ if (cfg.en_cov) begin
+ cov.extclk_cg.sample(
+ cfg.clkmgr_vif.extclk_cb.extclk_sel, cfg.clkmgr_vif.extclk_cb.lc_dft_en_i,
+ cfg.clkmgr_vif.extclk_cb.lc_clk_byp_req, cfg.clkmgr_vif.scanmode_i);
+ end
end
end
endtask
@@ -286,12 +304,21 @@
task monitor_clk_dividers();
clock_dividers dividers = new();
clock_dividers::div_step_e prev_div_step = clock_dividers::DivStepUp;
+ // This controls the window for checking divided clocks. We open it after the
+ // first increment, and close it upon reset. Needed for tests that reset.
+ // May not be needed anymore since we reset the expected activity on reset
+ // active.
+ bit ok_to_check_dividers = 1'b0;
#1;
cfg.io_clk_rst_vif.wait_for_reset();
fork
forever
- @(posedge cfg.io_clk_rst_vif.rst_n) begin : handle_dividers_reset
+ @(negedge cfg.io_clk_rst_vif.rst_n) begin : handle_dividers_reset_start
+ ok_to_check_dividers = 1'b0;
+ end
+ forever
+ @(posedge cfg.io_clk_rst_vif.rst_n) begin : handle_dividers_reset_done
dividers.reset();
`uvm_info(`gfn, $sformatf("Reset divided clocks: %0s", dividers.show()), UVM_MEDIUM)
end
@@ -319,7 +346,7 @@
// Compare divided clocks, always based on values from clocking block (thus preponed).
forever
@cfg.clkmgr_vif.div_clks_cb begin : check_clocks
- if (cfg.io_clk_rst_vif.rst_n) begin
+ if (cfg.io_clk_rst_vif.rst_n && ok_to_check_dividers) begin
`DV_CHECK_EQ(cfg.clkmgr_vif.div_clks_cb.actual_clk_io_div4,
cfg.clkmgr_vif.div_clks_cb.exp_clk_io_div4, $sformatf(
"Mismatch for clk_io_div4_powerup, expected %b, got %b",
@@ -360,6 +387,10 @@
.actual_div2_value(cfg.clkmgr_vif.clocks_o.clk_io_div2_powerup),
.exp_div4_value(dividers.get_div4_clk()),
.actual_div4_value(cfg.clkmgr_vif.clocks_o.clk_io_div4_powerup));
+ if (ok_to_check_dividers == 1'b0) begin
+ ok_to_check_dividers = 1'b1;
+ `uvm_info(`gfn, "Ready to start checking divided clocks", UVM_LOW)
+ end
end else begin
`uvm_info(`gfn, "Clearing expectations because io rst_n is active", UVM_LOW)
// verilog_format: off // the args are aligned to the function parenthesis
@@ -409,6 +440,9 @@
// - For read, update predication at address phase and compare at data phase.
case (csr.get_name())
// add individual case item for each csr
+ "alert_test": begin
+ // FIXME
+ end
"intr_state": begin
// FIXME
do_read_check = 1'b0;
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 7ed6160..537ae6d 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
@@ -61,9 +61,6 @@
!(extclk_sel_other inside {On, Off});
}
- // various knobs to enable certain routines
- bit do_clkmgr_init = 1'b1;
-
`uvm_object_new
function void post_randomize();
@@ -80,15 +77,16 @@
// These are independent: do them in parallel since pre_start consumes time.
fork
begin
- cfg.clkmgr_vif.init(.idle('1), .ip_clk_en(ip_clk_en), .scanmode(scanmode), .lc_dft_en(Off));
+ cfg.clkmgr_vif.init(.idle('1), .ip_clk_en(1'b0), .scanmode(scanmode), .lc_dft_en(Off));
+ update_csrs_with_reset_values();
end
- if (do_clkmgr_init) clkmgr_init();
+ clkmgr_init();
super.pre_start();
join
endtask
virtual task dut_init(string reset_kind = "HARD");
- super.dut_init();
+ super.dut_init(reset_kind);
endtask
virtual task dut_shutdown();
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 d187e31..3e71060 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
@@ -49,7 +49,6 @@
rand int cycles_before_ast_clk_byp_ack;
rand int cycles_before_next_trans;
- constraint trans_large_c {num_trans == 16;}
constraint cycles_to_stim_c {
cycles_before_extclk_sel inside {[4 : 20]};
cycles_before_lc_clk_byp_req inside {[4 : 20]};
diff --git a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_peri_vseq.sv b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_peri_vseq.sv
index 7347f16..20333ef 100644
--- a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_peri_vseq.sv
+++ b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_peri_vseq.sv
@@ -26,5 +26,8 @@
flipped_enables = initial_enables ^ ((1 << ral.clk_enables.get_n_bits()) - 1);
csr_wr(.ptr(ral.clk_enables), .value(flipped_enables));
end
+ // And set it back to the reset value for stress tests.
+ cfg.clk_rst_vif.wait_clks(1);
+ csr_wr(.ptr(ral.clk_enables), .value(ral.clk_enables.get_reset()));
endtask : body
endclass : clkmgr_peri_vseq
diff --git a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_smoke_vseq.sv b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_smoke_vseq.sv
index c42a627..92e4622 100644
--- a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_smoke_vseq.sv
+++ b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_smoke_vseq.sv
@@ -10,7 +10,6 @@
constraint enable_ip_clk_en {ip_clk_en == 1'b1;}
constraint all_busy {idle == '0;}
- constraint scanmode_off {sel_scanmode == LcTxTSelOff;}
task body();
update_csrs_with_reset_values();
@@ -28,11 +27,17 @@
csr_rd(.ptr(ral.clk_enables), .value(value));
flipped_value = value ^ ((1 << ral.clk_enables.get_n_bits()) - 1);
csr_wr(.ptr(ral.clk_enables), .value(flipped_value));
+
+ // And set it back to the reset value for stress tests.
+ cfg.clk_rst_vif.wait_clks(1);
+ csr_wr(.ptr(ral.clk_enables), .value(ral.clk_enables.get_reset()));
endtask : test_peri_clocks
- // Starts with all units busy, and for each one this clears the hint and reads the
- // hint status, expecting it to remain at 1 since the unit is busy; then it sets
- // the corresponding idle bit and reads status again, expecting it to be low.
+ // Starts with all units busy, and for each one this clears the hint and reads the hint status,
+ // expecting it to remain at 1 since the unit is busy; then it sets the corresponding idle bit
+ // and reads status again, expecting it to be low.
+ //
+ // We disable the value checks when reset is active since the reads return unpredictable data.
task test_trans_clocks();
trans_e trans;
logic bit_value;
@@ -60,9 +65,10 @@
`uvm_info(`gfn, $sformatf("Clearing %s hint bit", descriptor.unit.name), UVM_MEDIUM)
csr_wr(.ptr(descriptor.hint_bit), .value(1'b0));
csr_rd(.ptr(descriptor.value_bit), .value(bit_value));
- `DV_CHECK_EQ(bit_value, 1'b1, $sformatf(
- "%s hint value cannot drop while busy", descriptor.unit.name()))
-
+ if (!cfg.under_reset) begin
+ `DV_CHECK_EQ(bit_value, 1'b1, $sformatf(
+ "%s hint value cannot drop while busy", descriptor.unit.name()))
+ end
`uvm_info(`gfn, $sformatf("Setting %s idle bit", descriptor.unit.name), UVM_MEDIUM)
cfg.clk_rst_vif.wait_clks(1);
idle[trans] = 1'b1;
@@ -70,10 +76,12 @@
// Some cycles for the logic to settle.
cfg.clk_rst_vif.wait_clks(3);
csr_rd(.ptr(descriptor.value_bit), .value(bit_value));
- `DV_CHECK_EQ(bit_value, 1'b0, $sformatf(
- "%s hint value should drop when idle", descriptor.unit.name()))
+ if (!cfg.under_reset) begin
+ `DV_CHECK_EQ(bit_value, 1'b0, $sformatf(
+ "%s hint value should drop when idle", descriptor.unit.name()))
+ end
trans = trans.next();
end while (trans != trans.first);
+ csr_wr(.ptr(ral.clk_hints), .value(ral.clk_hints.get_reset()));
endtask : test_trans_clocks
-
endclass : clkmgr_smoke_vseq
diff --git a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_trans_vseq.sv b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_trans_vseq.sv
index 58c0eb3..303c5e6 100644
--- a/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_trans_vseq.sv
+++ b/hw/ip/clkmgr/dv/env/seq_lib/clkmgr_trans_vseq.sv
@@ -55,6 +55,7 @@
csr_rd(.ptr(ral.clk_hints_status), .value(value));
// We expect all units to be on.
`DV_CHECK_EQ(value, '1, "All idle and all hints high: units status should be high")
+ // Set hints to the reset value for stress tests.
csr_wr(.ptr(ral.clk_hints), .value(ral.clk_hints.get_reset()));
end
endtask : body
diff --git a/hw/ip/clkmgr/dv/tb.sv b/hw/ip/clkmgr/dv/tb.sv
index d0725ae..97b52a4 100644
--- a/hw/ip/clkmgr/dv/tb.sv
+++ b/hw/ip/clkmgr/dv/tb.sv
@@ -53,7 +53,9 @@
clkmgr_if clkmgr_if (
.clk(clk),
.rst_n(rst_n),
- .rst_main_n(rst_main_n)
+ .rst_io_n(rst_io_n),
+ .rst_main_n(rst_main_n),
+ .rst_usb_n(rst_usb_n)
);
initial begin