[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