[dv/keymgr] Hook up kmac interface Use keymgr_kmac_agent to handle kmac req/rsp Increase alert number 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 9d8a9da..a4c0b33 100644 --- a/hw/ip/keymgr/dv/env/keymgr_env.core +++ b/hw/ip/keymgr/dv/env/keymgr_env.core
@@ -9,8 +9,9 @@ depend: - lowrisc:dv:ralgen - lowrisc:dv:cip_lib + - lowrisc:dv:keymgr_kmac_agent files: - - keymgr_input_data_if.sv + - keymgr_if.sv - keymgr_env_pkg.sv - keymgr_env_cfg.sv: {is_include_file: true} - keymgr_env_cov.sv: {is_include_file: true}
diff --git a/hw/ip/keymgr/dv/env/keymgr_env.sv b/hw/ip/keymgr/dv/env/keymgr_env.sv index b435142..70d3e22 100644 --- a/hw/ip/keymgr/dv/env/keymgr_env.sv +++ b/hw/ip/keymgr/dv/env/keymgr_env.sv
@@ -12,11 +12,18 @@ `uvm_component_new + keymgr_kmac_agent m_keymgr_kmac_agent; + function void build_phase(uvm_phase phase); super.build_phase(phase); - if (!uvm_config_db#(keymgr_input_data_vif)::get(this, "", "keymgr_input_data_vif", - cfg.keymgr_input_data_vif)) begin - `uvm_fatal(`gfn, "failed to get keymgr_input_data_vif from uvm_config_db") + + // create m_keymgr_kmac_agent and set config object + m_keymgr_kmac_agent = keymgr_kmac_agent::type_id::create("m_keymgr_kmac_agent", this); + uvm_config_db#(keymgr_kmac_agent_cfg)::set(this, "m_keymgr_kmac_agent", "cfg", + cfg.m_keymgr_kmac_agent_cfg); + + if (!uvm_config_db#(keymgr_vif)::get(this, "", "keymgr_vif", cfg.keymgr_vif)) begin + `uvm_fatal(`gfn, "failed to get keymgr_vif from uvm_config_db") end endfunction
diff --git a/hw/ip/keymgr/dv/env/keymgr_env_cfg.sv b/hw/ip/keymgr/dv/env/keymgr_env_cfg.sv index cb27969..f08435e 100644 --- a/hw/ip/keymgr/dv/env/keymgr_env_cfg.sv +++ b/hw/ip/keymgr/dv/env/keymgr_env_cfg.sv
@@ -4,8 +4,10 @@ class keymgr_env_cfg extends cip_base_env_cfg #(.RAL_T(keymgr_reg_block)); + rand keymgr_kmac_agent_cfg m_keymgr_kmac_agent_cfg; + // interface for input data from LC, OTP and flash - keymgr_input_data_vif keymgr_input_data_vif; + keymgr_vif keymgr_vif; `uvm_object_utils_begin(keymgr_env_cfg) `uvm_object_utils_end @@ -16,6 +18,9 @@ list_of_alerts = keymgr_env_pkg::LIST_OF_ALERTS; super.initialize(csr_base_addr); + m_keymgr_kmac_agent_cfg = keymgr_kmac_agent_cfg::type_id::create("m_keymgr_kmac_agent_cfg"); + m_keymgr_kmac_agent_cfg.if_mode = dv_utils_pkg::Device; + // set num_interrupts & num_alerts begin uvm_reg rg = ral.get_reg_by_name("intr_state");
diff --git a/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv b/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv index 53c5605..e59cf67 100644 --- a/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv +++ b/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv
@@ -12,21 +12,22 @@ import cip_base_pkg::*; import csr_utils_pkg::*; import keymgr_ral_pkg::*; + import keymgr_kmac_agent_pkg::*; // macro includes `include "uvm_macros.svh" `include "dv_macros.svh" // parameters and types - parameter string LIST_OF_ALERTS[] = {"keymgr_err"}; - parameter uint NUM_ALERTS = 1; + parameter string LIST_OF_ALERTS[] = {"fault_err", "operation_err"}; + parameter uint NUM_ALERTS = 2; parameter keymgr_pkg::keymgr_working_state_e LIST_OF_NORMAL_STATES[] = { keymgr_pkg::StInit, keymgr_pkg::StCreatorRootKey, keymgr_pkg::StOwnerIntKey, keymgr_pkg::StOwnerKey}; - typedef virtual keymgr_input_data_if keymgr_input_data_vif; + typedef virtual keymgr_if keymgr_vif; typedef enum { IntrOpDone, IntrErr,
diff --git a/hw/ip/keymgr/dv/env/keymgr_if.sv b/hw/ip/keymgr/dv/env/keymgr_if.sv new file mode 100644 index 0000000..bdf9aef --- /dev/null +++ b/hw/ip/keymgr/dv/env/keymgr_if.sv
@@ -0,0 +1,23 @@ +// Copyright lowRISC contributors. +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 +// +// interface for input data from LC, OTP and flash +interface keymgr_if(input clk, input rst_n); + + import keymgr_pkg::*; + + lc_data_t lc; + otp_data_t otp; + flash_ctrl_pkg::keymgr_flash_t flash; + + hw_key_req_t kmac_key; + hw_key_req_t hmac_key; + hw_key_req_t aes_key; + + task automatic init(); + lc = LC_DATA_DEFAULT; + otp = OTP_DATA_DEFAULT; + flash = FLASH_KEY_DEFAULT; + endtask +endinterface
diff --git a/hw/ip/keymgr/dv/env/keymgr_input_data_if.sv b/hw/ip/keymgr/dv/env/keymgr_input_data_if.sv deleted file mode 100644 index 96e6184..0000000 --- a/hw/ip/keymgr/dv/env/keymgr_input_data_if.sv +++ /dev/null
@@ -1,14 +0,0 @@ -// Copyright lowRISC contributors. -// Licensed under the Apache License, Version 2.0, see LICENSE for details. -// SPDX-License-Identifier: Apache-2.0 -// -// interface for input data from LC, OTP and flash -interface keymgr_input_data_if(); - - import keymgr_pkg::*; - - lc_data_t lc = keymgr_pkg::LC_DATA_DEFAULT; - otp_data_t otp = keymgr_pkg::OTP_DATA_DEFAULT; - flash_ctrl_pkg::keymgr_flash_t flash = keymgr_pkg::FLASH_KEY_DEFAULT; - -endinterface
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 bec922a..e68fd80 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
@@ -25,6 +25,7 @@ virtual task dut_init(string reset_kind = "HARD"); super.dut_init(); + cfg.keymgr_vif.init(); if (do_keymgr_init) keymgr_init(); endtask @@ -95,7 +96,7 @@ default: is_good_op = 0; endcase end else begin - is_good_op = current_state inside LIST_OF_NORMAL_STATES; + is_good_op = current_state inside {LIST_OF_NORMAL_STATES}; end `uvm_info(`gfn, $sformatf("Wait for operation done in state %0s, gen_out %0d, good_op %0d", current_state.name, is_gen_output, is_good_op), UVM_MEDIUM)
diff --git a/hw/ip/keymgr/dv/tb.sv b/hw/ip/keymgr/dv/tb.sv index 9ca1aca..ebf484e 100644 --- a/hw/ip/keymgr/dv/tb.sv +++ b/hw/ip/keymgr/dv/tb.sv
@@ -22,23 +22,8 @@ pins_if #(NUM_MAX_INTERRUPTS) intr_if(interrupts); pins_if #(1) devmode_if(devmode); tl_if tl_if(.clk(clk), .rst_n(rst_n)); - keymgr_input_data_if keymgr_input_data_if(); - - logic [1:0][7:0][31:0] rand_values; - keymgr_pkg::kmac_data_rsp_t kmac_rsp; - assign kmac_rsp.ready = 1'b1; - assign kmac_rsp.done = 1'b1; - assign kmac_rsp.error = 1'b0; - - always_ff @(posedge clk) begin - for (int i = 0; i < 8; i++) begin - rand_values[0][i] <= $urandom_range(-1, 0); - rand_values[1][i] <= $urandom_range(-1, 0); - end - end - - assign kmac_rsp.digest_share0 = rand_values[0]; - assign kmac_rsp.digest_share1 = rand_values[1]; + keymgr_if keymgr_if(.clk(clk), .rst_n(rst_n)); + keymgr_kmac_intf keymgr_kmac_intf(.clk(clk), .rst_n(rst_n)); `DV_ALERT_IF_CONNECT @@ -46,14 +31,14 @@ keymgr dut ( .clk_i (clk ), .rst_ni (rst_n ), - .aes_key_o ( ), - .hmac_key_o ( ), - .kmac_key_o ( ), - .kmac_data_o ( ), - .kmac_data_i (kmac_rsp ), - .lc_i (keymgr_input_data_if.lc), - .otp_i (keymgr_input_data_if.otp), - .flash_i (keymgr_input_data_if.flash), + .aes_key_o (keymgr_if.aes_key), + .hmac_key_o (keymgr_if.hmac_key), + .kmac_key_o (keymgr_if.kmac_key), + .kmac_data_o (keymgr_kmac_intf.kmac_data_req), + .kmac_data_i (keymgr_kmac_intf.kmac_data_rsp), + .lc_i (keymgr_if.lc), + .otp_i (keymgr_if.otp), + .flash_i (keymgr_if.flash), .intr_op_done_o (interrupts[IntrOpDone]), .intr_err_o (interrupts[IntrErr]), .alert_rx_i (alert_rx ), @@ -70,8 +55,9 @@ uvm_config_db#(intr_vif)::set(null, "*.env", "intr_vif", intr_if); 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 keymgr_input_data_if)::set(null, "*.env", "keymgr_input_data_vif", - keymgr_input_data_if); + uvm_config_db#(virtual keymgr_if)::set(null, "*.env", "keymgr_vif", keymgr_if); + uvm_config_db#(virtual keymgr_kmac_intf)::set(null, + "*env.m_keymgr_kmac_agent*", "vif", keymgr_kmac_intf); $timeformat(-12, 0, " ps", 12); run_test(); end