[hw,sysrst_ctrl] Reuse tasks for combo detection in feature disable test
> Feature disable test requires a task to configure the combo registers
> Update this task such that it can be reusable in both sequences
> Derive feature disable test from combo_detect sequence so that tasks can be
reused for state transition scenarios
> Update reset_combo_inputs task in base_vseq for better reuse across combo detect sequences
Signed-off-by: Raviteja Chatta <crteja@lowrisc.org>
diff --git a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_base_vseq.sv b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_base_vseq.sv
index e78e877..a2c409e 100644
--- a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_base_vseq.sv
+++ b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_base_vseq.sv
@@ -21,12 +21,13 @@
endtask
// Set the inputs back to inactive
- virtual function void reset_combo_inputs(bit[4:0] input_invert=5'h0);
- cfg.vif.key0_in = ~input_invert[0];
- cfg.vif.key1_in = ~input_invert[1];
- cfg.vif.key2_in = ~input_invert[2];
- cfg.vif.pwrb_in = ~input_invert[3];
- cfg.vif.ac_present = ~input_invert[4];
+ virtual function void reset_combo_inputs(input bit [4:0] val = 5'h1F, bit [4:0] mask = 5'h1F);
+ // Set the inputs
+ if (mask[0]) cfg.vif.key0_in = val[0];
+ if (mask[1]) cfg.vif.key1_in = val[1];
+ if (mask[2]) cfg.vif.key2_in = val[2];
+ if (mask[3]) cfg.vif.pwrb_in = val[3];
+ if (mask[4]) cfg.vif.ac_present = val[4];
endfunction
// Get input of combo detection logic
diff --git a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_combo_detect_with_pre_cond_vseq.sv b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_combo_detect_with_pre_cond_vseq.sv
index 990079d..e6735d7 100644
--- a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_combo_detect_with_pre_cond_vseq.sv
+++ b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_combo_detect_with_pre_cond_vseq.sv
@@ -198,21 +198,24 @@
`DV_CHECK_EQ(cfg.vif.ec_rst_l_out, 1)
endtask
- task config_register();
+ task config_combo_register(int i, uint16_t mask = 16'hFF);
// Select the inputs for precondition
- foreach (ral.com_pre_sel_ctl[i]) csr_wr(ral.com_pre_sel_ctl[i], trigger_combo_precondition[i]);
+ csr_wr(ral.com_pre_sel_ctl[i], mask & trigger_combo_precondition[i]);
// Set the duration for precondition keys to pressed
- foreach (ral.com_pre_det_ctl[i]) csr_wr(ral.com_pre_det_ctl[i], set_duration_precondition[i]);
-
+ csr_wr(ral.com_pre_det_ctl[i], mask & set_duration_precondition[i]);
// Select the inputs for the combo
- foreach (ral.com_sel_ctl[i]) csr_wr(ral.com_sel_ctl[i], trigger_combo[i]);
+ csr_wr(ral.com_sel_ctl[i], mask & trigger_combo[i]);
// Set the duration for combo to pressed
- foreach (ral.com_det_ctl[i]) csr_wr(ral.com_det_ctl[i], set_duration[i]);
+ csr_wr(ral.com_det_ctl[i], mask & set_duration[i]);
// Set the trigger action
- foreach (ral.com_out_ctl[i]) csr_wr(ral.com_out_ctl[i], set_action[i]);
+ csr_wr(ral.com_out_ctl[i], mask & set_action[i]);
+ endtask
+
+ task config_register();
+ for( int i = 0; i < 4; i++) config_combo_register(i);
// Set the ec_rst_0 pulse width
csr_wr(ral.ec_rst_ctl, set_pulse_width);
@@ -513,7 +516,7 @@
// Wait till next iteration
cfg.clk_aon_rst_vif.wait_clks(set_pulse_width);
// Reset combo inputs except the ones required to enable precondition
- reset_combo_inputs(~combo_precondition_mask);
+ reset_combo_inputs(combo_precondition_mask);
end
begin : bat_disable_check
if (bat_act_triggered) begin
diff --git a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_feature_disable_vseq.sv b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_feature_disable_vseq.sv
index b202dd7..f21b053 100644
--- a/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_feature_disable_vseq.sv
+++ b/hw/ip/sysrst_ctrl/dv/env/seq_lib/sysrst_ctrl_feature_disable_vseq.sv
@@ -4,16 +4,10 @@
// This sequence asserts the inputs of sysrst_ctrl such that the
// key detection blocks transition from Debounce to Idle state
-class sysrst_ctrl_feature_disable_vseq extends sysrst_ctrl_base_vseq;
+class sysrst_ctrl_feature_disable_vseq extends sysrst_ctrl_combo_detect_with_pre_cond_vseq;
`uvm_object_utils(sysrst_ctrl_feature_disable_vseq)
`uvm_object_new
- // Combo detect egister settings
- rand bit [4:0] trigger_combo[4];
- rand bit [4:0] trigger_combo_precondition[4];
- rand uvm_reg_data_t set_action[4];
- rand uint16_t set_duration[4], set_duration_precondition[4];
- rand uint16_t set_key_timer;
// ec_rst_l_o assertion time
rand uint16_t set_pulse_width;
// Key debounce timer
@@ -71,38 +65,9 @@
constraint ulp_debounce_time_c {ulp_debounce_ctl inside {[15 : 50]};}
-
- function void set_combo_inputs(input bit [4:0] val = 5'h1F, bit [4:0] mask = 5'h1F);
- // Set the inputs
- if (mask[0]) cfg.vif.key0_in = val[0];
- if (mask[1]) cfg.vif.key1_in = val[1];
- if (mask[2]) cfg.vif.key2_in = val[2];
- if (mask[3]) cfg.vif.pwrb_in = val[3];
- if (mask[4]) cfg.vif.ac_present = val[4];
- endfunction
-
- task config_combo_register(int i, uint16_t mask = 16'hFF);
- // Select the inputs for precondition
- csr_wr(ral.com_pre_sel_ctl[i], mask & trigger_combo_precondition[i]);
-
- // Set the duration for precondition keys to pressed
- csr_wr(ral.com_pre_det_ctl[i], mask & set_duration_precondition[i]);
- // Select the inputs for the combo
- csr_wr(ral.com_sel_ctl[i], mask & trigger_combo[i]);
-
- // Set the duration for combo to pressed
- csr_wr(ral.com_det_ctl[i], mask & set_duration[i]);
-
- // Set the trigger action
- csr_wr(ral.com_out_ctl[i], mask & set_action[i]);
-
- // It takes 2-3 clock cycles to sync the register values
- cfg.clk_aon_rst_vif.wait_clks(3);
- endtask
-
task combo_debounce_to_idle();
// Reset Combo detect inputs
- set_combo_inputs();
+ reset_combo_inputs();
release_ec_rst_l_o();
// Set the ec_rst_0 pulse width
csr_wr(ral.ec_rst_ctl, set_pulse_width);
@@ -119,73 +84,73 @@
// deassertion of inputs before debounce timer
config_combo_register(i);
// Set combo input
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer - 10);
// Deassert input signals before debounce timer
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(15);
// Scenario : Trigger precondition Debounce to Idle state via
// disabling precondition before debounce timer
// Assert input signals to match predoncition selection
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer - 10);
// Disable precondition before debounce timer
csr_wr(ral.com_pre_sel_ctl[i], 0);
cfg.clk_aon_rst_vif.wait_clks(10);
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(3);
// Scenario : Trigger precondition Detect to Idle state via
// disabling precondition before detect timer
// Assert input signals to match predoncition selection
config_combo_register(i);
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] - 10);
// Disable precondition before detect timer
csr_wr(ral.com_pre_sel_ctl[i], 0);
cfg.clk_aon_rst_vif.wait_clks(10);
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(3);
// Scenario : Trigger precondition Detect to Idle state via
// deassertion of input signals
// Assert input signals to match predoncition selection
config_combo_register(i);
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] - 10);
// Disable precondition before detect timer
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(15);
// Scenario : Trigger combo detect Debounce to Idle state via
// deassertion of input signals before debounce timer
// Set combo input to trigger precondition
config_combo_register(i);
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] + 10);
// Set combo input to trigger combo detection
- set_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
// Wait for some time but dont exceed debounce time
cfg.clk_aon_rst_vif.wait_clks(set_key_timer - 10);
// Deassert combo inputs before debounce timer
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(10);
// Scenario : Trigger combo detect Debounce to Idle state via
// disabling detection before debounce timer
// Set combo input to trigger precondition
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] + 10);
// Set combo input to trigger combo detection
- set_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
// Wait for some time but dont exceed debounce time
cfg.clk_aon_rst_vif.wait_clks(set_key_timer - 10);
// Disable combo detect before debounce timer
csr_wr(ral.com_sel_ctl[i], 0);
cfg.clk_aon_rst_vif.wait_clks(15);
// Reset combo inputs
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(10);
// Scenario : Trigger combo Detect to Idle state via
@@ -194,16 +159,16 @@
config_combo_register(i);
// Wait for 3 clock cycles to sync the register value
cfg.clk_aon_rst_vif.wait_clks(3);
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] + 10);
// Set combo input to trigger combo detection
- set_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
// Wait for some time but dont exceed detect time
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration[i] - 10);
// Disable combo detect before detect timer
csr_wr(ral.com_sel_ctl[i], 0);
cfg.clk_aon_rst_vif.wait_clks(10);
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(10);
// Scenario : Trigger combo Detect to Idle state via
@@ -212,14 +177,14 @@
config_combo_register(i);
// Wait for 3 clock cycles to sync the register value
cfg.clk_aon_rst_vif.wait_clks(3);
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] + 10);
// Set combo input to trigger combo detection
- set_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
// Wait for some time but dont exceed detect time
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration[i] - 10);
// Deassert combo inputs before detect timer
- set_combo_inputs();
+ reset_combo_inputs();
cfg.clk_aon_rst_vif.wait_clks(20);
check_interrupts(.interrupts(1 << IntrSysrstCtrl), .check_set(0));
@@ -234,9 +199,9 @@
`uvm_info(`gfn, $sformatf("configuring combo channel %0d", i), UVM_LOW)
// Scenario : Assert ec_rst_l_i just before combo action triggers ec_rst_l_o
config_combo_register(i);
- set_combo_inputs(~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration_precondition[i] + 10);
- set_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
+ reset_combo_inputs(~trigger_combo[i], ~trigger_combo_precondition[i]);
cfg.clk_aon_rst_vif.wait_clks(set_key_timer + set_duration[i] - 5);
fork
begin
@@ -253,7 +218,7 @@
join
`uvm_info(`gfn, "ec_rst_l_o asserted as expected", UVM_LOW)
// Reset combo inputs
- set_combo_inputs();
+ reset_combo_inputs();
// Disable combo detect
config_combo_register(i, 0);
end