[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
}