[keymgr/dv] Add stress_all test

also enable stress_all with reset
Fix some variables which are not re-initialized correctly after reset
Signed-off-by: Weicai Yang <weicai@google.com>
diff --git a/hw/ip/keymgr/dv/env/keymgr_env.core b/hw/ip/keymgr/dv/env/keymgr_env.core
index 00c41f8..d2d799b 100644
--- a/hw/ip/keymgr/dv/env/keymgr_env.core
+++ b/hw/ip/keymgr/dv/env/keymgr_env.core
@@ -28,6 +28,7 @@
       - seq_lib/keymgr_direct_to_disabled_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_lc_disable_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_invalid_kmac_input_vseq.sv: {is_include_file: true}
+      - seq_lib/keymgr_stress_all_vseq.sv: {is_include_file: true}
     file_type: systemVerilogSource
 
 generate:
diff --git a/hw/ip/keymgr/dv/env/keymgr_if.sv b/hw/ip/keymgr/dv/env/keymgr_if.sv
index cc511b4..462ed52 100644
--- a/hw/ip/keymgr/dv/env/keymgr_if.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_if.sv
@@ -17,22 +17,22 @@
   keymgr_pkg::hw_key_req_t hmac_key;
   keymgr_pkg::hw_key_req_t aes_key;
 
-  keymgr_pkg::hw_key_req_t kmac_key_exp = '0;
-  keymgr_pkg::hw_key_req_t hmac_key_exp = '0;
-  keymgr_pkg::hw_key_req_t aes_key_exp = '0;
+  keymgr_pkg::hw_key_req_t kmac_key_exp;
+  keymgr_pkg::hw_key_req_t hmac_key_exp;
+  keymgr_pkg::hw_key_req_t aes_key_exp;
 
   // connect KDF interface for assertion check
   wire keymgr_pkg::kmac_data_req_t kmac_data_req;
   wire keymgr_pkg::kmac_data_rsp_t kmac_data_rsp;
 
   // indicate if check the key is same as expected or shouldn't match to any meaningful key
-  bit is_kmac_key_good = 0;
-  bit is_hmac_key_good = 0;
-  bit is_aes_key_good = 0;
+  bit is_kmac_key_good;
+  bit is_hmac_key_good;
+  bit is_aes_key_good;
 
   // when kmac sideload key is generated, kmac may be used to do other OP, but once the OP is done,
   // it should automatically switch back to sideload key
-  bit is_kmac_sideload_avail = 0;
+  bit is_kmac_sideload_avail;
   keymgr_env_pkg::key_shares_t kmac_sideload_key_shares;
 
   keymgr_env_pkg::key_shares_t keys_a_array[string][string];
@@ -46,6 +46,15 @@
     // this sequencing is correct.
     keymgr_en = lc_ctrl_pkg::lc_tx_t'($urandom);
 
+    // reset exp variables
+    kmac_key_exp = '0;
+    hmac_key_exp = '0;
+    aes_key_exp  = '0;
+    is_kmac_key_good = 0;
+    is_hmac_key_good = 0;
+    is_aes_key_good  = 0;
+    is_kmac_sideload_avail = 0;
+
     // async delay as these signals are from different clock domain
     #($urandom_range(1000, 0) * 1ns);
     keymgr_en = lc_ctrl_pkg::On;
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv
index 26fb627..2712075 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv
@@ -20,7 +20,7 @@
 
   // save DUT returned current state here, rather than using it from RAL, it's needed info to
   // predict operation result in seq
-  keymgr_pkg::keymgr_working_state_e current_state;
+  keymgr_pkg::keymgr_working_state_e current_state = keymgr_pkg::StReset;
 
   rand bit is_key_version_err;
 
@@ -52,8 +52,6 @@
 
   // setup basic keymgr features
   virtual task keymgr_init();
-    current_state = keymgr_pkg::StReset;
-
     // Any OP except advance at StReset will trigger OP error, test these OPs here
     if (do_op_before_init) begin
       repeat ($urandom_range(1, 5)) begin
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_common_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_common_vseq.sv
index 6b15d2a..9ab6270 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_common_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_common_vseq.sv
@@ -10,6 +10,16 @@
   }
   `uvm_object_new
 
+  // override this delay for keymgr_stress_all_with_rand_reset, as most of vseq finishes less than
+  // 10k cycles
+  constraint delay_to_reset_c {
+    delay_to_reset dist {
+        [1     : 100]     :/ 1,
+        [101   : 2_000]   :/ 6,
+        [2_001 : 10_000]  :/ 1
+    };
+  }
+
   virtual task pre_start();
     do_keymgr_init = 1'b0;
     super.pre_start();
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_stress_all_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_stress_all_vseq.sv
new file mode 100644
index 0000000..4992e10
--- /dev/null
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_stress_all_vseq.sv
@@ -0,0 +1,54 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+// combine all keymgr seqs (except below seqs) in one seq to run sequentially
+// 1. csr seq, which requires scb to be disabled
+// 2. keymgr_cfgen_vseq as it's very timing sensitive
+class keymgr_stress_all_vseq extends keymgr_base_vseq;
+  `uvm_object_utils(keymgr_stress_all_vseq)
+
+  `uvm_object_new
+
+  task body();
+    string seq_names[] = {"keymgr_smoke_vseq",
+                          "keymgr_common_vseq", // for intr_test
+                          "keymgr_sideload_vseq",
+                          "keymgr_random_vseq",
+                          "keymgr_direct_to_disabled_vseq",
+                          // TODO, add this later
+                          //"keymgr_lc_disable_vseq",
+                          "keymgr_invalid_kmac_input_vseq"};
+    for (int i = 1; i <= num_trans; i++) begin
+      uvm_sequence     seq;
+      keymgr_base_vseq keymgr_vseq;
+      uint             seq_idx = $urandom_range(0, seq_names.size - 1);
+
+      seq = create_seq_by_name(seq_names[seq_idx]);
+      `downcast(keymgr_vseq, seq)
+
+      // at the end of each vseq, design has enterred StDisabled, need to reset to recover
+      // if upper seq disables do_dut_init for this seq, then can't issue reset
+      // as upper seq may drive reset
+      if (do_dut_init && i > 1) keymgr_vseq.do_dut_init = 1;
+      else                      keymgr_vseq.do_dut_init = 0;
+
+      keymgr_vseq.set_sequencer(p_sequencer);
+      `DV_CHECK_RANDOMIZE_FATAL(keymgr_vseq)
+      if (seq_names[seq_idx] == "keymgr_common_vseq") begin
+        keymgr_common_vseq common_vseq;
+        `downcast(common_vseq, keymgr_vseq);
+        common_vseq.common_seq_type = "intr_test";
+      end
+
+      keymgr_vseq.start(p_sequencer);
+
+      // this is for keymgr_stress_all_with_rand_reset
+      // we need to reset for each vseq, but in keymgr_stress_all_with_rand_reset, reset should be
+      // issued in upper seq. So, wait forever until reset is issued and this vseq is killed by
+      // upper seq
+      if (!do_dut_init) wait(0);
+    end
+  endtask : body
+
+endclass
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_vseq_list.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_vseq_list.sv
index 2de7de0..e451548 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_vseq_list.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_vseq_list.sv
@@ -11,3 +11,4 @@
 `include "keymgr_direct_to_disabled_vseq.sv"
 `include "keymgr_lc_disable_vseq.sv"
 `include "keymgr_invalid_kmac_input_vseq.sv"
+`include "keymgr_stress_all_vseq.sv"
diff --git a/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson b/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson
index 9bc47b9..814ddf8 100644
--- a/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson
+++ b/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson
@@ -33,8 +33,7 @@
                 "{proj_root}/hw/dv/tools/dvsim/tests/intr_test.hjson",
                 "{proj_root}/hw/dv/tools/dvsim/tests/alert_test.hjson",
                 "{proj_root}/hw/dv/tools/dvsim/tests/tl_access_tests.hjson",
-                // TODO, enable it later
-                // "{proj_root}/hw/dv/tools/dvsim/tests/stress_tests.hjson"
+                "{proj_root}/hw/dv/tools/dvsim/tests/stress_tests.hjson"
                 ]
 
   // Add additional tops for simulation.
@@ -85,6 +84,11 @@
       name: keymgr_invalid_kmac_input
       uvm_test_seq: keymgr_invalid_kmac_input_vseq
     }
+
+    {
+      name: keymgr_stress_all
+      uvm_test_seq: keymgr_stress_all_vseq
+    }
   ]
 
   // List of regressions.