Skip to content

Commit 39d3351

Browse files
committed
[hw,rstmgr,dv] More templating for preferred IO clock
Signed-off-by: Robert Schilling <[email protected]>
1 parent 6966681 commit 39d3351

20 files changed

+158
-69
lines changed

hw/ip_templates/rstmgr/dv/env/rstmgr_if.sv renamed to hw/ip_templates/rstmgr/dv/env/rstmgr_if.sv.tpl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,18 @@
33
// SPDX-License-Identifier: Apache-2.0
44
//
55
// clkmgr interface.
6+
<%
7+
all_clks = set(clk_freqs.keys())
8+
9+
if "io_div4" in all_clks:
10+
preferred_domain = "io_div4"
11+
elif "io" in all_clks:
12+
preferred_domain = "io"
13+
else:
14+
assert 0, "No preferred clock available"
15+
16+
preferred_rst_n = f"rst_lc_{preferred_domain}_n"
17+
%>\
618

719
interface rstmgr_if (
820
input logic clk_aon,
@@ -65,5 +77,5 @@ interface rstmgr_if (
6577
always_comb cpu_info_en = `PATH_TO_DUT.reg2hw.cpu_info_ctrl.en.q;
6678

6779
bit rst_ni_inactive;
68-
always_comb rst_ni_inactive = resets_o.rst_lc_io_div4_n[rstmgr_pkg::Domain0Sel];
80+
always_comb rst_ni_inactive = resets_o.${preferred_rst_n}[rstmgr_pkg::Domain0Sel];
6981
endinterface

hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv.tpl

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
<%
55
sorted_clks = sorted(list(clk_freqs.keys()))
66

7-
def preferred_clk():
8-
if "io_div4" in sorted_clks:
9-
return "io_div4"
7+
def preferred_clk(preferred):
8+
if preferred in sorted_clks:
9+
return preferred
1010
elif "io" in sorted_clks:
1111
return "io"
1212
else:
@@ -280,7 +280,7 @@ class rstmgr_base_vseq extends cip_base_vseq #(
280280
virtual protected task clear_alert_and_cpu_info();
281281
set_alert_and_cpu_info_for_capture('0, '0);
282282
send_sw_reset();
283-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(20); // # of lc reset cycles measured from waveform
283+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(20); // # of lc reset cycles measured from waveform
284284
check_alert_and_cpu_info_after_reset(.alert_dump('0), .cpu_dump('0), .enable(0));
285285
endtask
286286

@@ -332,7 +332,7 @@ class rstmgr_base_vseq extends cip_base_vseq #(
332332
csr_wr(.ptr(ral.sw_rst_ctrl_n[entry]), .value(sw_rst_ctrl_n[entry]));
333333
// And check that the reset outputs match the actual ctrl_n settings.
334334
// Allow for domain crossing delay.
335-
cfg.io_div2_clk_rst_vif.wait_clks(3);
335+
cfg.${preferred_clk("io_div2")}_clk_rst_vif.wait_clks(3);
336336
exp_ctrl_n = ~sw_rst_regwen | sw_rst_ctrl_n;
337337
`uvm_info(`gfn, $sformatf(
338338
"regwen=%b, ctrl_n=%b, expected=%b", sw_rst_regwen, sw_rst_ctrl_n, exp_ctrl_n),
@@ -368,7 +368,7 @@ class rstmgr_base_vseq extends cip_base_vseq #(
368368
set_reset_cause(reset_cause);
369369
// These lag the reset requests since they are set after the pwrmgr fast fsm has made some
370370
// state transitions.
371-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(rst_to_req_cycles);
371+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(rst_to_req_cycles);
372372
set_pwrmgr_rst_reqs(.rst_lc_req('1), .rst_sys_req('1));
373373
cfg.clk_rst_vif.stop_clk();
374374
if (reset_cause == pwrmgr_pkg::LowPwrEntry) begin
@@ -380,7 +380,7 @@ class rstmgr_base_vseq extends cip_base_vseq #(
380380
// And wait for the main reset to be done.
381381
`DV_WAIT(cfg.rstmgr_vif.rst_ni_inactive, "Time-out waiting for rst_ni becoming inactive");
382382
// And wait a few cycles for settling before allowing the sequences to start.
383-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(8);
383+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(8);
384384
endtask
385385

386386
protected task reset_done();
@@ -391,10 +391,10 @@ class rstmgr_base_vseq extends cip_base_vseq #(
391391
control_all_clocks(.enable(1));
392392
end
393393
cfg.clk_rst_vif.start_clk();
394-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(10);
394+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(10);
395395
set_reset_cause(pwrmgr_pkg::ResetNone);
396396
set_pwrmgr_rst_reqs(.rst_lc_req('0), .rst_sys_req('1));
397-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(release_lc_to_release_sys_cycles);
397+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(release_lc_to_release_sys_cycles);
398398
set_pwrmgr_rst_reqs(.rst_lc_req('0), .rst_sys_req('0));
399399
set_rstreqs(0);
400400
wait_till_active();
@@ -414,7 +414,7 @@ class rstmgr_base_vseq extends cip_base_vseq #(
414414
automatic int index = i;
415415
automatic bit [2:0] cycles;
416416
`DV_CHECK_STD_RANDOMIZE_FATAL(cycles)
417-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(cycles);
417+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(cycles);
418418
add_rstreqs(rstreqs & (1 << index));
419419
join_none
420420
end
@@ -438,11 +438,11 @@ class rstmgr_base_vseq extends cip_base_vseq #(
438438
`uvm_info(`gfn, "Sending scan reset", UVM_MEDIUM)
439439
fork
440440
begin
441-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(scan_rst_cycles);
441+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(scan_rst_cycles);
442442
update_scan_rst_n(1'b0);
443443
end
444444
begin
445-
cfg.${preferred_clk()}_clk_rst_vif.wait_clks(scanmode_cycles);
445+
cfg.${preferred_clk("io_div4")}_clk_rst_vif.wait_clks(scanmode_cycles);
446446
update_scanmode(prim_mubi_pkg::MuBi4True);
447447
end
448448
join
@@ -528,10 +528,10 @@ class rstmgr_base_vseq extends cip_base_vseq #(
528528

529529
// setup basic rstmgr features
530530
virtual task rstmgr_init();
531-
// Must set clk_rst_vif frequency to IO_DIV4_FREQ_MHZ since they are gated
531+
// Must set clk_rst_vif frequency to ${preferred_clk("io_div4").upper()}_FREQ_MHZ since they are gated
532532
// versions of each other and have no clock domain crossings.
533533
// Notice they may still end up out of phase due to the way they get started.
534-
cfg.clk_rst_vif.set_freq_mhz(IO_DIV4_FREQ_MHZ);
534+
cfg.clk_rst_vif.set_freq_mhz(${preferred_clk("io_div4").upper()}_FREQ_MHZ);
535535
% for clk in sorted_clks:
536536
cfg.${clk}_clk_rst_vif.set_freq_mhz(${clk.upper()}_FREQ_MHZ);
537537
% endfor

hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_leaf_rst_cnsty_vseq.sv renamed to hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_leaf_rst_cnsty_vseq.sv.tpl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@
1010
// 3 - sw reset
1111
// Create reset consistency errors in the current leaf, and check that a
1212
// fatal_cnsty_fault alert is generated.
13+
<%
14+
all_clks = set(clk_freqs.keys())
15+
16+
if "io_div4" in all_clks:
17+
preferred_domain = "io_div4"
18+
elif "io" in all_clks:
19+
preferred_domain = "io"
20+
else:
21+
assert 0, "No preferred clock available"
22+
23+
preferred_clk_vif = f"{preferred_domain}_clk_rst_vif"
24+
%>\
1325
class rstmgr_leaf_rst_cnsty_vseq extends rstmgr_base_vseq;
1426
`uvm_object_utils(rstmgr_leaf_rst_cnsty_vseq)
1527

@@ -68,7 +80,7 @@ class rstmgr_leaf_rst_cnsty_vseq extends rstmgr_base_vseq;
6880
check_alert_and_cpu_info_after_reset(alert_dump, cpu_dump, 1'b1);
6981

7082
csr_wr(.ptr(ral.reset_info), .value('1));
71-
cfg.io_div4_clk_rst_vif.wait_clks(10);
83+
cfg.${preferred_clk_vif}.wait_clks(10);
7284

7385
// Send HwReq.
7486
// Enable alert_info and cpu_info capture.

hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_leaf_rst_shadow_attack_vseq.sv.tpl

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,20 @@
44
// Description:
55
// Test assert glitch to shadow leaf reset module and
66
// check if nomal reset module got affected or vice versa
7-
<% has_sys_io_div4 = any(d.get('name') == 'sys_io_div4' for d in output_rsts) if output_rsts else False %>\
7+
<%
8+
all_clks = set(clk_freqs.keys())
9+
has_sys_io = any("sys_io" in d.get('name') for d in output_rsts) if output_rsts else False
10+
11+
if "io_div4" in all_clks:
12+
preferred_domain = "io_div4"
13+
elif "io" in all_clks:
14+
preferred_domain = "io"
15+
else:
16+
assert 0, "No preferred clock available"
17+
18+
preferred_clk_rst_vif = f"{preferred_domain}_clk_rst_vif"
19+
preferred_rst_n = f"rst_sys_{preferred_domain}_n"
20+
%>\
821
class rstmgr_leaf_rst_shadow_attack_vseq extends rstmgr_base_vseq;
922
`uvm_object_utils(rstmgr_leaf_rst_shadow_attack_vseq)
1023

@@ -23,9 +36,9 @@ class rstmgr_leaf_rst_shadow_attack_vseq extends rstmgr_base_vseq;
2336
endtask : body
2437

2538
task leaf_rst_attack(string npath, string gpath);
26-
% if has_sys_io_div4:
39+
% if has_sys_io:
2740
// Wait for any bit in rst_sys_io_div4_n to become inactive.
28-
wait(|cfg.rstmgr_vif.resets_o.rst_sys_io_div4_n);
41+
wait(|cfg.rstmgr_vif.resets_o.${preferred_rst_n});
2942
% endif
3043
// Disable cascading reset assertions, since forcing related signals causes failures.
3144
cfg.rstmgr_cascading_sva_vif.disable_sva = 1'b1;
@@ -59,7 +72,7 @@ class rstmgr_leaf_rst_shadow_attack_vseq extends rstmgr_base_vseq;
5972

6073
// Wait enough cycles to allow the uvm_hdl_force to take effect, since it is not instantaneous,
6174
// and for side-effects to propagate.
62-
cfg.io_div4_clk_rst_vif.wait_clks(10);
75+
cfg.${preferred_clk_rst_vif}.wait_clks(10);
6376

6477
`uvm_info(`gfn, $sformatf("Checking rst and en for %s", path), UVM_MEDIUM)
6578
`DV_CHECK(uvm_hdl_read(epath, rst_en), $sformatf("Path %0s has problem", epath))

hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_por_stretcher_vseq.sv renamed to hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_por_stretcher_vseq.sv.tpl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66
// the test, and randomly glitches it for a few cycles at intervals less than the stretch cycle
77
// count, which is at least 32 cycles, to make sure the internal and output resets won't be
88
// released until the input is held steady for a sufficient number of cycles.
9+
<%
10+
all_clks = set(clk_freqs.keys())
11+
12+
if "io_div4" in all_clks:
13+
preferred_domain = "io_div4"
14+
elif "io" in all_clks:
15+
preferred_domain = "io"
16+
else:
17+
assert 0, "No preferred clock available"
18+
19+
preferred_por_n = f"rst_por_{preferred_domain}_n"
20+
%>\
921
class rstmgr_por_stretcher_vseq extends rstmgr_base_vseq;
1022
`uvm_object_utils(rstmgr_por_stretcher_vseq)
1123

@@ -34,7 +46,7 @@ class rstmgr_por_stretcher_vseq extends rstmgr_base_vseq;
3446
cfg.aon_clk_rst_vif.wait_clks(glitch_separation_cycles);
3547
cfg.rstmgr_vif.por_n = 1'b0;
3648
cfg.aon_clk_rst_vif.wait_clks(glitch_duration_cycles);
37-
`DV_CHECK_EQ(cfg.rstmgr_vif.resets_o.rst_por_io_div4_n[rstmgr_pkg::DomainAonSel], 1'b0)
49+
`DV_CHECK_EQ(cfg.rstmgr_vif.resets_o.${preferred_por_n}[rstmgr_pkg::DomainAonSel], 1'b0)
3850
end
3951
por_reset_done(.complete_it(1));
4052
csr_rd_check(.ptr(ral.reset_info.por), .compare_value(1'b1),

hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_reset_vseq.sv renamed to hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_reset_vseq.sv.tpl

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66
// resets.
77
//
88
// Notice that for rstmgr both POR and scan reset have identical side-effects.
9+
<%
10+
all_clks = set(clk_freqs.keys())
11+
12+
if "io_div4" in all_clks:
13+
preferred_domain = "io_div4"
14+
elif "io" in all_clks:
15+
preferred_domain = "io"
16+
else:
17+
assert 0, "No preferred clock available"
18+
19+
preferred_clk_rst_vif = f"{preferred_domain}_clk_rst_vif"
20+
%>\
921
class rstmgr_reset_vseq extends rstmgr_base_vseq;
1022
`uvm_object_utils(rstmgr_reset_vseq)
1123

@@ -156,22 +168,22 @@ class rstmgr_reset_vseq extends rstmgr_base_vseq;
156168
if (which_resets[ResetPOR]) por_reset(.complete_it(0));
157169
if (which_resets[ResetScan]) send_scan_reset(.complete_it(0));
158170
if (which_resets[ResetLowPower]) begin
159-
cfg.io_div4_clk_rst_vif.wait_clks(lowpower_rst_cycles);
171+
cfg.${preferred_clk_rst_vif}.wait_clks(lowpower_rst_cycles);
160172
send_lowpower_reset(.complete_it(0));
161173
end
162174
if (which_resets[ResetSw]) begin
163-
cfg.io_div4_clk_rst_vif.wait_clks(sw_rst_cycles);
175+
cfg.${preferred_clk_rst_vif}.wait_clks(sw_rst_cycles);
164176
send_sw_reset(.complete_it(0));
165177
end
166178
if (which_resets[ResetHw]) begin
167-
cfg.io_div4_clk_rst_vif.wait_clks(hw_rst_cycles);
179+
cfg.${preferred_clk_rst_vif}.wait_clks(hw_rst_cycles);
168180
send_hw_reset(rstreqs, .complete_it(0));
169181
end
170182
join
171183
#(reset_us * 1us);
172184
reset_done();
173185

174-
cfg.io_div4_clk_rst_vif.wait_clks(8);
186+
cfg.${preferred_clk_rst_vif}.wait_clks(8);
175187
wait(cfg.rstmgr_vif.resets_o.rst_lc_n[1]);
176188
check_reset_info(expected_reset_info_code);
177189
check_alert_info_after_reset(.alert_dump(expected_alert_dump),

hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv renamed to hw/ip_templates/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv.tpl

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@
44

55
// Tests the different kinds of reset: POR, low power wakeup, hardware reset, debug_mode reset,
66
// and software initiated peripheral resets.
7+
<%
8+
all_clks = set(clk_freqs.keys())
9+
10+
if "io_div4" in all_clks:
11+
preferred_domain = "io_div4"
12+
elif "io" in all_clks:
13+
preferred_domain = "io"
14+
else:
15+
assert 0, "No preferred clock available"
16+
17+
preferred_clk_rst_vif = f"{preferred_domain}_clk_rst_vif"
18+
%>\
719
class rstmgr_smoke_vseq extends rstmgr_base_vseq;
820

921
`uvm_object_utils(rstmgr_smoke_vseq)
@@ -15,7 +27,7 @@ class rstmgr_smoke_vseq extends rstmgr_base_vseq;
1527
constraint sw_rst_some_reset_c {sw_rst_regwen & ~sw_rst_ctrl_n != '0;}
1628

1729
local task wait_between_resets();
18-
cfg.io_div4_clk_rst_vif.wait_clks(10);
30+
cfg.${preferred_clk_rst_vif}.wait_clks(10);
1931
endtask
2032

2133
task body();

hw/ip_templates/rstmgr/dv/sva/rstmgr_cascading_sva_if.sv.tpl

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@
22
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
33
// SPDX-License-Identifier: Apache-2.0
44

5-
<%
6-
sorted_clks = sorted(list(clk_freqs.keys()))
5+
<%
6+
sorted_clks = sorted(list(clk_freqs.keys()))
77
has_sys_io = any("sys_io" in d.get('name') for d in output_rsts) if output_rsts else False
88

9-
def preferred_domain():
10-
if "io_div4" in sorted_clks:
11-
return "io_div4"
12-
elif "io" in sorted_clks:
13-
return "io"
14-
else:
15-
assert 0, "No preferred clock available"
9+
if "io_div4" in sorted_clks:
10+
preferred_domain = "io_div4"
11+
elif "io" in sorted_clks:
12+
preferred_domain = "io"
13+
else:
14+
assert 0, "No preferred clock available"
15+
16+
preferred_por_n = f"rst_por_{preferred_domain}_n"
17+
preferred_rst_n = f"rst_sys_{preferred_domain}_n"
18+
preferred_clk_i = f"clk_{preferred_domain}_i"
1619
%>\
1720
// This has assertions that check the reset outputs of rstmgr cascade properly.
1821
// This means higher level resets always cause the lower level ones to assert.
@@ -137,10 +140,10 @@ interface rstmgr_cascading_sva_if (
137140

138141
// The AON reset triggers the various POR reset for the different clock domains through
139142
// synchronizers.
140-
// The current system doesn't have any consumers of domain 1 por_${preferred_domain()}, and thus only domain 0
141-
// cascading is checked here.
143+
// Only domain 0 cascading is checked here, because the current system doesn't have any consumers
144+
// of ${preferred_por_n}.
142145
`CASCADED_ASSERTS(CascadeEffAonToRstPorIoDiv4, effective_aon_rst_n[0],
143-
resets_o.rst_por_${preferred_domain()}_n[0], SyncCycles, clk_${preferred_domain()}_i)
146+
resets_o.${preferred_por_n}[0], SyncCycles, ${preferred_clk_i})
144147

145148
// The internal reset is triggered by one of synchronized por.
146149
logic [rstmgr_pkg::PowerDomains-1:0] por_rst_n;
@@ -164,9 +167,9 @@ interface rstmgr_cascading_sva_if (
164167

165168
% if has_sys_io:
166169
// Controlled by rst_sys_src_n.
167-
if (pd == rstmgr_pkg::DomainAonSel) begin : gen_sys_${preferred_domain()}_chk
168-
`CASCADED_ASSERTS(CascadeSysToSysIoDiv4, rst_sys_src_n[pd], resets_o.rst_sys_${preferred_domain()}_n[pd],
169-
SysCycles, clk_${preferred_domain()}_i)
170+
if (pd == rstmgr_pkg::DomainAonSel) begin : gen_sys_${preferred_domain}_chk
171+
`CASCADED_ASSERTS(CascadeSysToSysIoDiv4, rst_sys_src_n[pd], resets_o.${preferred_rst_n}[pd],
172+
SysCycles, ${preferred_clk_i})
170173
end
171174
% endif
172175
end

0 commit comments

Comments
 (0)