[dv] Added keymgr_sideload_agent and integrated it with otbn and kmac TB Following additions/ modifications have been made in this commit: 1. Added key_sideload_agent and related files. 2. Integrated key_sideload_agent with OTBN and KMAC TB. 3. Added key_sideload_set_seq to set keymgr interface. 4. In OTBN TB, key_sideload_set_seq runs forever changing keymgr interface values every few (randomized between 10 to 100) clock cycles. 5. In kmac_smoke_vseq, key_sideload_set_seq is called to generate keymgr interface values. Signed-off-by: Prajwala Puttappa <prajwalaputtappa@lowrisc.org>
diff --git a/hw/dv/sv/key_sideload_agent/README.md b/hw/dv/sv/key_sideload_agent/README.md new file mode 100644 index 0000000..35361db --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/README.md
@@ -0,0 +1,3 @@ +# KEY_SIDELOAD UVM Agent + +KEY_SIDELOAD UVM Agent is extended from DV library agent classes.
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_agent.core b/hw/dv/sv/key_sideload_agent/key_sideload_agent.core new file mode 100644 index 0000000..ac41a3f --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_agent.core
@@ -0,0 +1,30 @@ +CAPI=2: +# Copyright lowRISC contributors. +# Licensed under the Apache License, Version 2.0, see LICENSE for details. +# SPDX-License-Identifier: Apache-2.0 +name: "lowrisc:dv:key_sideload_agent:0.1" +description: "KEY_SIDELOAD DV UVM agent" +filesets: + files_dv: + depend: + - lowrisc:dv:dv_utils + - lowrisc:dv:dv_lib + - lowrisc:ip:keymgr_pkg + files: + - key_sideload_if.sv + - key_sideload_agent_pkg.sv + - key_sideload_item.sv: {is_include_file: true} + - key_sideload_agent_cfg.sv: {is_include_file: true} + - key_sideload_agent_cov.sv: {is_include_file: true} + - key_sideload_driver.sv: {is_include_file: true} + - key_sideload_monitor.sv: {is_include_file: true} + - key_sideload_agent.sv: {is_include_file: true} + - seq_lib/key_sideload_base_seq.sv: {is_include_file: true} + - seq_lib/key_sideload_set_seq.sv: {is_include_file: true} + - seq_lib/key_sideload_seq_list.sv: {is_include_file: true} + file_type: systemVerilogSource + +targets: + default: + filesets: + - files_dv
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_agent.sv b/hw/dv/sv/key_sideload_agent/key_sideload_agent.sv new file mode 100644 index 0000000..050c1b7 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_agent.sv
@@ -0,0 +1,38 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_agent extends dv_base_agent #( + .CFG_T (key_sideload_agent_cfg), + .DRIVER_T (key_sideload_driver), + .SEQUENCER_T (key_sideload_sequencer), + .MONITOR_T (key_sideload_monitor), + .COV_T (key_sideload_agent_cov) +); + + `uvm_component_utils(key_sideload_agent) + + `uvm_component_new + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + // get key_sideload_if handle + if (!uvm_config_db#(virtual key_sideload_if)::get(this, "", "vif", cfg.vif)) begin + `uvm_fatal(`gfn, "failed to get key_sideload_if handle from uvm_config_db") + end + endfunction + + virtual task run_phase(uvm_phase phase); + key_sideload_set_seq p_seq; + if (cfg.start_default_seq) begin + p_seq = key_sideload_set_seq::type_id::create("p_seq", this); + forever begin + `DV_CHECK_RANDOMIZE_FATAL(p_seq) + p_seq.start(sequencer); + repeat($urandom_range(10,100)) begin + @(posedge cfg.vif.clk_i); + end + end + end + endtask +endclass
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_agent_cfg.sv b/hw/dv/sv/key_sideload_agent/key_sideload_agent_cfg.sv new file mode 100644 index 0000000..c7a56fe --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_agent_cfg.sv
@@ -0,0 +1,17 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_agent_cfg extends dv_base_agent_cfg; + + // interface handle used by driver, monitor & the sequencer, via cfg handle + virtual key_sideload_if vif; + + bit start_default_seq = 1; + + `uvm_object_utils_begin(key_sideload_agent_cfg) + `uvm_object_utils_end + + `uvm_object_new + +endclass
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_agent_cov.sv b/hw/dv/sv/key_sideload_agent/key_sideload_agent_cov.sv new file mode 100644 index 0000000..4b2fa44 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_agent_cov.sv
@@ -0,0 +1,18 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_agent_cov extends dv_base_agent_cov #(key_sideload_agent_cfg); + `uvm_component_utils(key_sideload_agent_cov) + + // the base class provides the following handles for use: + // key_sideload_agent_cfg: cfg + + // covergroups + + function new(string name, uvm_component parent); + super.new(name, parent); + // instantiate all covergroups here + endfunction : new + +endclass
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_agent_pkg.sv b/hw/dv/sv/key_sideload_agent/key_sideload_agent_pkg.sv new file mode 100644 index 0000000..c9ee3c0 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_agent_pkg.sv
@@ -0,0 +1,37 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +package key_sideload_agent_pkg; + // dep packages + import uvm_pkg::*; + import dv_utils_pkg::*; + import dv_lib_pkg::*; + + // macro includes + `include "uvm_macros.svh" + `include "dv_macros.svh" + + // parameters + + // local types + // forward declare classes to allow typedefs below + typedef class key_sideload_item; + typedef class key_sideload_agent_cfg; + + // reuse dv_base_sequencer as is with the right parameter set + typedef dv_base_sequencer #(.ITEM_T(key_sideload_item), + .CFG_T (key_sideload_agent_cfg)) key_sideload_sequencer; + + // functions + + // package sources + `include "key_sideload_item.sv" + `include "key_sideload_agent_cfg.sv" + `include "key_sideload_agent_cov.sv" + `include "key_sideload_driver.sv" + `include "key_sideload_monitor.sv" + `include "key_sideload_seq_list.sv" + `include "key_sideload_agent.sv" + +endpackage: key_sideload_agent_pkg
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_driver.sv b/hw/dv/sv/key_sideload_agent/key_sideload_driver.sv new file mode 100644 index 0000000..8d4fa47 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_driver.sv
@@ -0,0 +1,49 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_driver extends dv_base_driver #(.ITEM_T(key_sideload_item), + .CFG_T (key_sideload_agent_cfg)); + `uvm_component_utils(key_sideload_driver) + + // the base class provides the following handles for use: + // key_sideload_agent_cfg: cfg + + `uvm_component_new + + virtual task run_phase(uvm_phase phase); + // base class forks off reset_signals() and get_and_drive() tasks + super.run_phase(phase); + endtask + + // reset signals + virtual task reset_signals(); + cfg.vif.sideload_key.valid = 0; + cfg.vif.sideload_key.key[0] = 'x; + cfg.vif.sideload_key.key[1] = 'x; + endtask + + // drive trans received from sequencer + virtual task get_and_drive(); + forever begin + seq_item_port.get_next_item(req); + $cast(rsp, req.clone()); + rsp.set_id_info(req); + `uvm_info(`gfn, $sformatf("rcvd item:\n%0s", req.sprint()), UVM_HIGH) + cfg.vif.sideload_key.valid = req.valid; + if (req.valid) begin + cfg.vif.sideload_key.key[0] = req.key0; + cfg.vif.sideload_key.key[1] = req.key1; + end + else begin + cfg.vif.sideload_key.key[0] = 'x; + cfg.vif.sideload_key.key[1] = 'x; + end + // send rsp back to seq + `uvm_info(`gfn, "item sent", UVM_HIGH) + cfg.vif.wait_clks(req.rsp_delay); + seq_item_port.item_done(req); + end + endtask + +endclass
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_if.sv b/hw/dv/sv/key_sideload_agent/key_sideload_if.sv new file mode 100644 index 0000000..568698c --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_if.sv
@@ -0,0 +1,30 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +interface key_sideload_if #( + parameter type KEY_T = keymgr_pkg::hw_key_req_t, + parameter int KeyWidth = keymgr_pkg::KeyWidth +) ( + input logic clk_i, + input logic rst_ni, + // This struct contains three fields: + // - valid + // - key_share0 + // - key_share1 + output KEY_T sideload_key +); + + string msg_id = "key_sideload_if"; + + task automatic wait_valid(logic is_valid); + wait (sideload_key.valid === is_valid); + endtask + + task automatic wait_clks(int rsp_delay); + for (int i = 0; i < rsp_delay; i++) begin + if (!rst_ni) break; + @(posedge clk_i or negedge rst_ni); + end + endtask +endinterface
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_item.sv b/hw/dv/sv/key_sideload_agent/key_sideload_item.sv new file mode 100644 index 0000000..090fa77 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_item.sv
@@ -0,0 +1,24 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_item extends uvm_sequence_item; + + // random variables + rand bit valid; + rand bit [keymgr_pkg::KeyWidth-1:0] key0; + rand bit [keymgr_pkg::KeyWidth-1:0] key1; + rand int unsigned rsp_delay = 1; + + constraint rsp_delay_constraint_c {rsp_delay inside {[1:10]};} + + `uvm_object_utils_begin(key_sideload_item) + `uvm_field_int(valid, UVM_DEFAULT) + `uvm_field_int(key0, UVM_DEFAULT) + `uvm_field_int(key1, UVM_DEFAULT) + `uvm_field_int(rsp_delay, UVM_DEFAULT) + `uvm_object_utils_end + + `uvm_object_new + +endclass
diff --git a/hw/dv/sv/key_sideload_agent/key_sideload_monitor.sv b/hw/dv/sv/key_sideload_agent/key_sideload_monitor.sv new file mode 100644 index 0000000..ebc81aa --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/key_sideload_monitor.sv
@@ -0,0 +1,43 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_monitor extends dv_base_monitor #( + .ITEM_T (key_sideload_item), + .CFG_T (key_sideload_agent_cfg), + .COV_T (key_sideload_agent_cov) + ); + `uvm_component_utils(key_sideload_monitor) + + // the base class provides the following handles for use: + // key_sideload_agent_cfg: cfg + // key_sideload_agent_cov: cov + // uvm_analysis_port #(key_sideload_item): analysis_port + + `uvm_component_new + + function void build_phase(uvm_phase phase); + super.build_phase(phase); + endfunction + + task run_phase(uvm_phase phase); + super.run_phase(phase); + endtask + + // collect transactions forever - already forked in dv_base_monitor::run_phase + virtual protected task collect_trans(uvm_phase phase); + forever begin + // TODO: detect event + + // TODO: sample the interface + + // TODO: sample the covergroups + + // TODO: write trans to analysis_port + + // TODO: remove the line below: it is added to prevent zero delay loop in template code + #1us; + end + endtask + +endclass
diff --git a/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_base_seq.sv b/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_base_seq.sv new file mode 100644 index 0000000..b9364db --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_base_seq.sv
@@ -0,0 +1,18 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_base_seq extends dv_base_seq #( + .REQ (key_sideload_item), + .CFG_T (key_sideload_agent_cfg), + .SEQUENCER_T (key_sideload_sequencer) + ); + `uvm_object_utils(key_sideload_base_seq) + + `uvm_object_new + + virtual task body(); + `uvm_fatal(`gtn, "Need to override this when you extend from this class!") + endtask + +endclass
diff --git a/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_seq_list.sv b/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_seq_list.sv new file mode 100644 index 0000000..8e919e5 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_seq_list.sv
@@ -0,0 +1,6 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +`include "key_sideload_base_seq.sv" +`include "key_sideload_set_seq.sv"
diff --git a/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_set_seq.sv b/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_set_seq.sv new file mode 100644 index 0000000..1fd7233 --- /dev/null +++ b/hw/dv/sv/key_sideload_agent/seq_lib/key_sideload_set_seq.sv
@@ -0,0 +1,22 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +class key_sideload_set_seq extends key_sideload_base_seq; + `uvm_object_utils(key_sideload_set_seq) + + `uvm_object_new + rand keymgr_pkg::hw_key_req_t sideload_key; + + virtual task body(); + key_sideload_item item; + item = key_sideload_item::type_id::create("item"); + start_item(item); + item.valid = sideload_key.valid; + item.key0 = sideload_key.key[0]; + item.key1 = sideload_key.key[1]; + finish_item(item); + get_response(item); + endtask + +endclass
diff --git a/hw/dv/sv/key_sideload_if/key_sideload_if.core b/hw/dv/sv/key_sideload_if/key_sideload_if.core deleted file mode 100644 index b2702a4..0000000 --- a/hw/dv/sv/key_sideload_if/key_sideload_if.core +++ /dev/null
@@ -1,21 +0,0 @@ -CAPI=2: -# Copyright lowRISC contributors. -# Licensed under the Apache License, Version 2.0, see LICENSE for details. -# SPDX-License-Identifier: Apache-2.0 -name: "lowrisc:dv:key_sideload_if" -description: "Common key sideload interfaces used in ast, kmac, otbn" - -filesets: - files_rtl: - depend: - - lowrisc:ip:keymgr_pkg - files_dv: - files: - - key_sideload_if.sv - file_type: systemVerilogSource - -targets: - default: - filesets: - - files_rtl - - files_dv
diff --git a/hw/dv/sv/key_sideload_if/key_sideload_if.sv b/hw/dv/sv/key_sideload_if/key_sideload_if.sv deleted file mode 100644 index 2e6783d..0000000 --- a/hw/dv/sv/key_sideload_if/key_sideload_if.sv +++ /dev/null
@@ -1,33 +0,0 @@ -// Copyright lowRISC contributors. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 - -interface key_sideload_if #(parameter type KEY_T = keymgr_pkg::hw_key_req_t, - parameter int KeyWidth = keymgr_pkg::KeyWidth -); - // This struct contains three fields: - // - valid - // - key_share0 - // - key_share1 - KEY_T sideload_key; - - string msg_id = "key_sideload_if"; - - // share0 and share1 are only driven when `valid` is 1. - task automatic drive_sideload_key(logic key_valid, - logic [KeyWidth-1:0] share0 = '0, - logic [KeyWidth-1:0] share1 = '0); - KEY_T key; - - `DV_CHECK_STD_RANDOMIZE_WITH_FATAL(key, key.valid == key_valid;, , msg_id) - key.key[0] = (key_valid) ? share0 : 'hx; - key.key[1] = (key_valid) ? share1 : 'hx; - - sideload_key = key; - endtask - - task automatic wait_valid(logic is_valid); - wait (sideload_key.valid === is_valid); - endtask - -endinterface
diff --git a/hw/ip/kmac/dv/env/kmac_env.core b/hw/ip/kmac/dv/env/kmac_env.core index 0f1537b..8b0090b 100644 --- a/hw/ip/kmac/dv/env/kmac_env.core +++ b/hw/ip/kmac/dv/env/kmac_env.core
@@ -14,7 +14,7 @@ - lowrisc:dv:str_utils - lowrisc:dv:test_vectors - lowrisc:dv:digestpp_dpi:0.1 - - lowrisc:dv:key_sideload_if + - lowrisc:dv:key_sideload_agent - lowrisc:ip:kmac files: - kmac_env_pkg.sv
diff --git a/hw/ip/kmac/dv/env/kmac_env.sv b/hw/ip/kmac/dv/env/kmac_env.sv index 9cccee4..9340fef 100644 --- a/hw/ip/kmac/dv/env/kmac_env.sv +++ b/hw/ip/kmac/dv/env/kmac_env.sv
@@ -13,6 +13,7 @@ `uvm_component_new kmac_app_agent m_kmac_app_agent[kmac_pkg::NumAppIntf]; + key_sideload_agent keymgr_sideload_agent; function void build_phase(uvm_phase phase); super.build_phase(phase); @@ -27,9 +28,9 @@ if (!uvm_config_db#(idle_vif)::get(this, "", "idle_vif", cfg.idle_vif)) begin `uvm_fatal(`gfn, "failed to get idle_vif handle from uvm_config_db") end - if (!uvm_config_db#(sideload_vif)::get(this, "", "sideload_vif", cfg.sideload_vif)) begin - `uvm_fatal(`gfn, "failed to get sideload_vif handle from uvm_config_db") - end + keymgr_sideload_agent = key_sideload_agent::type_id::create("keymgr_sideload_agent", this); + uvm_config_db#(key_sideload_agent_cfg)::set(this, "keymgr_sideload_agent*", + "cfg", cfg.keymgr_sideload_agent_cfg); endfunction function void connect_phase(uvm_phase phase); @@ -39,8 +40,10 @@ m_kmac_app_agent[i].monitor.analysis_port.connect(scoreboard.kmac_app_rsp_fifo[i].analysis_export); m_kmac_app_agent[i].m_data_push_agent.monitor.analysis_port.connect( scoreboard.kmac_app_req_fifo[i].analysis_export); - virtual_sequencer.kmac_app_sequencer_h[i] = m_kmac_app_agent[i].sequencer; + virtual_sequencer.kmac_app_sequencer_h[i] = m_kmac_app_agent[i].sequencer; + virtual_sequencer.key_sideload_sequencer_h = keymgr_sideload_agent.sequencer; end + cfg.keymgr_sideload_agent_cfg.start_default_seq = 0; endfunction
diff --git a/hw/ip/kmac/dv/env/kmac_env_cfg.sv b/hw/ip/kmac/dv/env/kmac_env_cfg.sv index fdbfcd5..2b9f421 100644 --- a/hw/ip/kmac/dv/env/kmac_env_cfg.sv +++ b/hw/ip/kmac/dv/env/kmac_env_cfg.sv
@@ -6,9 +6,9 @@ // ext interfaces idle_vif idle_vif; - sideload_vif sideload_vif; rand kmac_app_agent_cfg m_kmac_app_agent_cfg[kmac_pkg::NumAppIntf]; + rand key_sideload_agent_cfg keymgr_sideload_agent_cfg; // Masked KMAC is the default configuration bit enable_masking = 1; @@ -33,7 +33,8 @@ m_kmac_app_agent_cfg[i] = kmac_app_agent_cfg::type_id::create(name); m_kmac_app_agent_cfg[i].if_mode = dv_utils_pkg::Host; end - + keymgr_sideload_agent_cfg = key_sideload_agent_cfg::type_id + ::create("keymgr_sideload_agent_cfg"); void'($value$plusargs("enable_masking=%0d", enable_masking)); void'($value$plusargs("test_vectors_sha3_variant=%0d", sha3_variant)); void'($value$plusargs("test_vectors_shake_variant=%0d", shake_variant));
diff --git a/hw/ip/kmac/dv/env/kmac_env_pkg.sv b/hw/ip/kmac/dv/env/kmac_env_pkg.sv index d414b1b..09f9756 100644 --- a/hw/ip/kmac/dv/env/kmac_env_pkg.sv +++ b/hw/ip/kmac/dv/env/kmac_env_pkg.sv
@@ -20,6 +20,7 @@ import kmac_ral_pkg::*; import kmac_pkg::*; import keymgr_pkg::*; + import key_sideload_agent_pkg::*; // macro includes `include "uvm_macros.svh"
diff --git a/hw/ip/kmac/dv/env/kmac_scoreboard.sv b/hw/ip/kmac/dv/env/kmac_scoreboard.sv index 5aab558..4bc54b4 100644 --- a/hw/ip/kmac/dv/env/kmac_scoreboard.sv +++ b/hw/ip/kmac/dv/env/kmac_scoreboard.sv
@@ -301,13 +301,13 @@ `DV_SPINWAIT_EXIT( forever begin // Wait for a valid sideloaded key - cfg.sideload_vif.wait_valid(logic'(1'b1)); + cfg.keymgr_sideload_agent_cfg.vif.wait_valid(logic'(1'b1)); // Once valid sideload keys have been seen, update scoreboard state. // // Note: max size of sideloaded key is keymgr_pkg::KeyWidth - sideload_key = cfg.sideload_vif.sideload_key; + sideload_key = cfg.keymgr_sideload_agent_cfg.vif.sideload_key; `uvm_info(`gfn, $sformatf("detected valid sideload_key: %0p", sideload_key), UVM_HIGH) @@ -317,7 +317,7 @@ end // Sequence will drop the sideloaded key after scb can process the digest - cfg.sideload_vif.wait_valid(logic'(1'b0)); + cfg.keymgr_sideload_agent_cfg.vif.wait_valid(logic'(1'b0)); end , wait(cfg.under_reset); @@ -414,7 +414,8 @@ end end StAppCfg: begin - if (app_mode == AppKeymgr && !cfg.sideload_vif.sideload_key.valid) begin + if (app_mode == AppKeymgr && + !cfg.keymgr_sideload_agent_cfg.vif.sideload_key.valid) begin app_st = StKeyMgrErrKeyNotValid; end else begin app_st = StAppMsg;
diff --git a/hw/ip/kmac/dv/env/kmac_virtual_sequencer.sv b/hw/ip/kmac/dv/env/kmac_virtual_sequencer.sv index ad58015..151a85b 100644 --- a/hw/ip/kmac/dv/env/kmac_virtual_sequencer.sv +++ b/hw/ip/kmac/dv/env/kmac_virtual_sequencer.sv
@@ -11,5 +11,6 @@ `uvm_component_new kmac_app_sequencer kmac_app_sequencer_h[kmac_pkg::NumAppIntf]; + key_sideload_sequencer key_sideload_sequencer_h; endclass
diff --git a/hw/ip/kmac/dv/env/seq_lib/kmac_smoke_vseq.sv b/hw/ip/kmac/dv/env/seq_lib/kmac_smoke_vseq.sv index 6cebe3d..7ba6890 100644 --- a/hw/ip/kmac/dv/env/seq_lib/kmac_smoke_vseq.sv +++ b/hw/ip/kmac/dv/env/seq_lib/kmac_smoke_vseq.sv
@@ -97,6 +97,7 @@ logic [keymgr_pkg::KeyWidth-1:0] sideload_share0; logic [keymgr_pkg::KeyWidth-1:0] sideload_share1; + key_sideload_set_seq sideload_seq; `uvm_info(`gfn, $sformatf("Starting %0d message hashes", num_trans), UVM_LOW) @@ -120,15 +121,11 @@ if (kmac_en) begin // provide a random sideloaded key if (en_sideload || provide_sideload_key) begin - `DV_CHECK_STD_RANDOMIZE_FATAL(sideload_share0) - `DV_CHECK_STD_RANDOMIZE_FATAL(sideload_share1) - - `uvm_info(`gfn, $sformatf("sideload_key_share0: 0x%0x", sideload_share0), UVM_HIGH) - `uvm_info(`gfn, $sformatf("sideload_key_share1: 0x%0x", sideload_share1), UVM_HIGH) - - cfg.sideload_vif.drive_sideload_key(kmac_err_type != kmac_pkg::ErrKeyNotValid, - sideload_share0, - sideload_share1); + `uvm_create_on(sideload_seq, p_sequencer.key_sideload_sequencer_h); + `DV_CHECK_RANDOMIZE_WITH_FATAL(sideload_seq, + sideload_key.valid == kmac_err_type != + kmac_pkg::ErrKeyNotValid;) + `uvm_send(sideload_seq) end // write the SW key to the CSRs if (!en_app) begin @@ -297,7 +294,9 @@ // Drop the sideloaded key if it was provided to the DUT. if (kmac_en && (en_sideload || provide_sideload_key)) begin `uvm_info(`gfn, "dropping sideload key", UVM_HIGH) - cfg.sideload_vif.drive_sideload_key(0); + `DV_CHECK_RANDOMIZE_WITH_FATAL(sideload_seq, + sideload_key.valid == 0;) + sideload_seq.start(p_sequencer.key_sideload_sequencer_h); end end
diff --git a/hw/ip/kmac/dv/tb.sv b/hw/ip/kmac/dv/tb.sv index 8d212f3..e49de94 100644 --- a/hw/ip/kmac/dv/tb.sv +++ b/hw/ip/kmac/dv/tb.sv
@@ -34,7 +34,10 @@ tl_if tl_if(.clk(clk), .rst_n(rst_n)); - key_sideload_if sideload_if(); + key_sideload_if sideload_if( + .clk_i (clk), + .rst_ni (rst_n) + ); kmac_app_intf kmac_app_if[kmac_pkg::NumAppIntf](.clk(clk), .rst_n(rst_n)); @@ -103,7 +106,8 @@ uvm_config_db#(devmode_vif)::set(null, "*.env", "devmode_vif", devmode_if); uvm_config_db#(virtual tl_if)::set(null, "*.env.m_tl_agent*", "vif", tl_if); uvm_config_db#(virtual pins_if#(1))::set(null, "*.env", "idle_vif", idle_if); - uvm_config_db#(virtual key_sideload_if)::set(null, "*.env", "sideload_vif", sideload_if); + uvm_config_db#(virtual key_sideload_if)::set(null, "*.env.keymgr_sideload_agent*", + "vif", sideload_if); $timeformat(-12, 0, " ps", 12); run_test(); end
diff --git a/hw/ip/otbn/dv/model/otbn_core_model.sv b/hw/ip/otbn/dv/model/otbn_core_model.sv index 6f41c43..1ed1ed8 100644 --- a/hw/ip/otbn/dv/model/otbn_core_model.sv +++ b/hw/ip/otbn/dv/model/otbn_core_model.sv
@@ -193,7 +193,7 @@ // Assertion to ensure that keymgr key valid is never unknown. `ASSERT_KNOWN(KeyValidIsKnownChk_A, keymgr_key_i.valid) // Assertion to ensure that keymgr key values are never unknown if valid is high. - `ASSERT_KNOWN_IF(KeyIsKnownChk_A, keymgr_key_i.valid, {keymgr_key_i.key[0], keymgr_key_i.key[1]}) + `ASSERT_KNOWN_IF(KeyIsKnownChk_A, {keymgr_key_i.key[0], keymgr_key_i.key[1]}, keymgr_key_i.valid) assign unused_raw_err_bits = ^raw_err_bits_q[31:$bits(err_bits_t)]; assign unused_edn_rsp_fips = edn_rnd_i.edn_fips & edn_urnd_i.edn_fips;
diff --git a/hw/ip/otbn/dv/uvm/env/otbn_env.core b/hw/ip/otbn/dv/uvm/env/otbn_env.core index a1caba9..31c1991 100644 --- a/hw/ip/otbn/dv/uvm/env/otbn_env.core +++ b/hw/ip/otbn/dv/uvm/env/otbn_env.core
@@ -14,6 +14,7 @@ - lowrisc:dv:tl_agent - lowrisc:dv:alert_esc_agent - lowrisc:dv:otbn_model_agent + - lowrisc:dv:key_sideload_agent files: - otbn_env_pkg.sv - otbn_loop_if.sv
diff --git a/hw/ip/otbn/dv/uvm/env/otbn_env.sv b/hw/ip/otbn/dv/uvm/env/otbn_env.sv index 1f46240..6d2d9fb 100644 --- a/hw/ip/otbn/dv/uvm/env/otbn_env.sv +++ b/hw/ip/otbn/dv/uvm/env/otbn_env.sv
@@ -12,6 +12,7 @@ otbn_model_agent model_agent; otbn_trace_monitor trace_monitor; + key_sideload_agent keymgr_sideload_agent; `uvm_component_new @@ -25,6 +26,10 @@ uvm_config_db#(otbn_model_agent_cfg)::set(this, "model_agent*", "cfg", cfg.model_agent_cfg); cfg.model_agent_cfg.en_cov = cfg.en_cov; + keymgr_sideload_agent = key_sideload_agent::type_id::create("keymgr_sideload_agent", this); + uvm_config_db#(key_sideload_agent_cfg)::set(this, "keymgr_sideload_agent*", + "cfg", cfg.keymgr_sideload_agent_cfg); + if (!uvm_config_db#(virtual otbn_trace_if)::get(this, "", "trace_vif", cfg.trace_vif)) begin `uvm_fatal(`gfn, "failed to get otbn_trace_if handle from uvm_config_db") end
diff --git a/hw/ip/otbn/dv/uvm/env/otbn_env_cfg.sv b/hw/ip/otbn/dv/uvm/env/otbn_env_cfg.sv index 8056228..81172ed 100644 --- a/hw/ip/otbn/dv/uvm/env/otbn_env_cfg.sv +++ b/hw/ip/otbn/dv/uvm/env/otbn_env_cfg.sv
@@ -7,6 +7,8 @@ // ext component cfgs rand otbn_model_agent_cfg model_agent_cfg; + rand key_sideload_agent_cfg keymgr_sideload_agent_cfg; + `uvm_object_utils_begin(otbn_env_cfg) `uvm_object_utils_end @@ -69,7 +71,9 @@ // Tell the CIP base code what alert we generate if we see a TL fault. tl_intg_alert_name = "fatal"; - model_agent_cfg = otbn_model_agent_cfg::type_id::create("model_agent_cfg"); + model_agent_cfg = otbn_model_agent_cfg ::type_id::create("model_agent_cfg"); + keymgr_sideload_agent_cfg = key_sideload_agent_cfg::type_id + ::create("keymgr_sideload_agent_cfg"); super.initialize(csr_base_addr);
diff --git a/hw/ip/otbn/dv/uvm/env/otbn_env_pkg.sv b/hw/ip/otbn/dv/uvm/env/otbn_env_pkg.sv index 808101e..0c98e32 100644 --- a/hw/ip/otbn/dv/uvm/env/otbn_env_pkg.sv +++ b/hw/ip/otbn/dv/uvm/env/otbn_env_pkg.sv
@@ -16,6 +16,7 @@ import mem_bkdr_util_pkg::mem_bkdr_util; import prim_util_pkg::vbits; import prim_mubi_pkg::*; + import key_sideload_agent_pkg::*; // autogenerated RAL model import otbn_reg_pkg::*;
diff --git a/hw/ip/otbn/dv/uvm/tb.sv b/hw/ip/otbn/dv/uvm/tb.sv index 571ade9..4121b87 100644 --- a/hw/ip/otbn/dv/uvm/tb.sv +++ b/hw/ip/otbn/dv/uvm/tb.sv
@@ -23,7 +23,6 @@ wire clk, rst_n; wire idle, intr_done; wire [NUM_MAX_INTERRUPTS-1:0] interrupts; - otbn_key_req_t keymgr_key; // interfaces clk_rst_if clk_rst_if (.clk(clk), .rst_n(rst_n)); @@ -36,9 +35,16 @@ // needed for sequences that trigger alerts (locking OTBN) without telling the model. `DV_ASSERT_CTRL("otbn_status_assert_en", tb.MatchingStatus_A) - assign keymgr_key.key[0] = {12{32'hDEADBEEF}}; - assign keymgr_key.key[1] = {12{32'hBAADF00D}}; - assign keymgr_key.valid = 1'b1; + otbn_key_req_t keymgr_key; + hw_key_req_t sideload_key; + key_sideload_if keymgr_if ( + .clk_i (clk), + .rst_ni (rst_n), + .sideload_key (sideload_key) + ); + assign keymgr_key.valid = sideload_key.valid; + assign keymgr_key.key[0] = sideload_key.key[0]; + assign keymgr_key.key[1] = sideload_key.key[1]; otbn_model_if #( .ImemSizeByte (otbn_reg_pkg::OTBN_IMEM_SIZE) @@ -48,6 +54,7 @@ .keymgr_key_i (keymgr_key) ); + // edn_clk, edn_rst_n and edn_if is defined and driven in below macro `DV_EDN_IF_CONNECT @@ -275,6 +282,8 @@ uvm_config_db#(idle_vif)::set(null, "*.env", "idle_vif", idle_if); uvm_config_db#(intr_vif)::set(null, "*.env", "intr_vif", intr_if); uvm_config_db#(virtual otbn_model_if)::set(null, "*.env.model_agent", "vif", model_if); + uvm_config_db#(virtual key_sideload_if)::set(null, "*.env.keymgr_sideload_agent", + "vif", keymgr_if); uvm_config_db#(virtual otbn_trace_if)::set(null, "*.env", "trace_vif", dut.u_otbn_core.i_otbn_trace_if);