[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