[keymgr/dv] Add sideload vseq

Also remove some unnecessary code in disasbled_vseq
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 cad4e07..bd8070e 100644
--- a/hw/ip/keymgr/dv/env/keymgr_env.core
+++ b/hw/ip/keymgr/dv/env/keymgr_env.core
@@ -22,6 +22,7 @@
       - seq_lib/keymgr_base_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_common_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_smoke_vseq.sv: {is_include_file: true}
+      - seq_lib/keymgr_sideload_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_random_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_cfgen_vseq.sv: {is_include_file: true}
       - seq_lib/keymgr_direct_to_disabled_vseq.sv: {is_include_file: true}
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 8e0f993..1e62bea 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
@@ -16,6 +16,7 @@
 
   // do operations at StReset
   rand bit do_op_before_init;
+  rand keymgr_pkg::keymgr_ops_e gen_operation;
 
   // save DUT returned current state here, rather than using it from RAL, it's needed info to
   // predict operation result in seq
@@ -67,7 +68,7 @@
     if (advance_state) keymgr_advance(wait_done);
 
     repeat (num_gen_op) begin
-      keymgr_generate(.identity($urandom_range(0, 1)), .wait_done(wait_done));
+      keymgr_generate(.operation(gen_operation), .wait_done(wait_done));
       if (clr_output) keymgr_rd_clr();
     end
   endtask : keymgr_operations
@@ -142,18 +143,14 @@
   endtask : keymgr_advance
 
   // by default generate for software
-  virtual task keymgr_generate(bit identity = 0, bit wait_done = 1);
-    bit [2:0] operation;
-
+  virtual task keymgr_generate(keymgr_pkg::keymgr_ops_e operation, bit wait_done = 1);
     `uvm_info(`gfn, "Generate key manager output", UVM_MEDIUM)
-    ral.control.start.set(1'b1);
 
-    if (identity) begin
-      operation = keymgr_pkg::OpGenId;
-    end else begin
-      operation = keymgr_pkg::OpGenSwOut;
-    end
-    ral.control.operation.set(operation);
+    ral.control.start.set(1'b1);
+    ral.control.operation.set(int'(operation));
+    // TODO, test KMAC interface only since the other interface may be removed later
+    `DV_CHECK_RANDOMIZE_WITH_FATAL(ral.control.dest_sel,
+                                   value inside {keymgr_pkg::None, keymgr_pkg::Kmac};);
     csr_update(.csr(ral.control));
     ral.control.start.set(1'b0);
 
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv
index 74df43b..b2a89cb 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv
@@ -23,9 +23,7 @@
                                                    keymgr_pkg::OpGenId,
                                                    keymgr_pkg::OpGenSwOut,
                                                    keymgr_pkg::OpGenHwOut});)
-    ral.control.operation.set(keymgr_pkg::OpDisable);
     csr_update(.csr(ral.control));
-    ral.control.start.set(1'b0);
 
     wait_op_done(.is_gen_output(0));
     `DV_CHECK_EQ(current_state, keymgr_pkg::StDisabled)
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_sideload_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_sideload_vseq.sv
new file mode 100644
index 0000000..ccbe80e
--- /dev/null
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_sideload_vseq.sv
@@ -0,0 +1,14 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+// Enable OpGenHwOut to test side load interface
+class keymgr_sideload_vseq extends keymgr_smoke_vseq;
+  `uvm_object_utils(keymgr_sideload_vseq)
+  `uvm_object_new
+
+  // also test HW sideload
+  constraint gen_operation_c {
+    gen_operation inside {keymgr_pkg::OpGenId, keymgr_pkg::OpGenSwOut, keymgr_pkg::OpGenHwOut};
+  }
+endclass : keymgr_sideload_vseq
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_smoke_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_smoke_vseq.sv
index ac71de7..bd5c6f6 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_smoke_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_smoke_vseq.sv
@@ -7,6 +7,11 @@
   `uvm_object_utils(keymgr_smoke_vseq)
   `uvm_object_new
 
+  // limit to SW operations
+  constraint gen_operation_c {
+    gen_operation inside {keymgr_pkg::OpGenId, keymgr_pkg::OpGenSwOut};
+  }
+
   task body();
     `uvm_info(`gfn, "Key manager smoke check", UVM_HIGH)
     // Advance 6 times
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 42a693c..eab0800 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
@@ -5,6 +5,7 @@
 `include "keymgr_base_vseq.sv"
 `include "keymgr_smoke_vseq.sv"
 `include "keymgr_common_vseq.sv"
+`include "keymgr_sideload_vseq.sv"
 `include "keymgr_random_vseq.sv"
 `include "keymgr_cfgen_vseq.sv"
 `include "keymgr_direct_to_disabled_vseq.sv"
diff --git a/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson b/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson
index 6f7bda2..c2e1094 100644
--- a/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson
+++ b/hw/ip/keymgr/dv/keymgr_sim_cfg.hjson
@@ -55,6 +55,11 @@
     }
 
     {
+      name: keymgr_sideload
+      uvm_test_seq: keymgr_sideload_vseq
+    }
+
+    {
       name: keymgr_random
       uvm_test_seq: keymgr_random_vseq
     }