[keymgr/dv] Update scoreboard

1. Add interrupt checking
2. enable SW output check and creator root data check, which is disabled at #4292
Signed-off-by: Weicai Yang <weicai@google.com>
diff --git a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
index 3b5ec89..9698d9b 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -56,6 +56,8 @@
   bit [keymgr_pkg::GenDataWidth-1:0] sw_data_a_array[keymgr_pkg::keymgr_working_state_e];
   bit [keymgr_pkg::GenDataWidth-1:0] hw_data_a_array[keymgr_pkg::keymgr_working_state_e];
 
+  // expected values
+  bit [NumKeyMgrIntr-1:0] intr_exp;
 
   `uvm_component_new
 
@@ -147,6 +149,9 @@
                   UVM_MEDIUM)
       end
     end
+
+    // IntrOpDone occurs after every KDF
+    intr_exp[IntrOpDone] = 1;
   endfunction
 
   virtual task process_tl_access(tl_seq_item item, tl_channels_e channel = DataChannel);
@@ -190,16 +195,37 @@
     case (csr.get_name())
       // add individual case item for each csr
       "intr_state": begin
-        // TODO update read check later
+        // Check in this block
         do_read_check = 1'b0;
+
+        if (addr_phase_write) begin
+          intr_exp &= ~item.a_data;
+        end else if (data_phase_read) begin
+          bit [TL_DW-1:0] intr_en = `gmv(ral.intr_enable);
+
+          foreach (intr_exp[i]) begin
+            keymgr_intr_e intr = keymgr_intr_e'(i);
+
+            `DV_CHECK_EQ(item.d_data[i], intr_exp[i],
+                         $sformatf("Interrupt: %0s", intr.name));
+            `DV_CHECK_CASE_EQ(cfg.intr_vif.pins[i], (intr_en[i] & intr_exp[i]),
+                           $sformatf("Interrupt_pin: %0s", intr.name));
+          end
+        end
       end
       "intr_enable": begin
-        // TODO update read check later
-        do_read_check = 1'b0;
+        // no speical handle is needed
       end
       "intr_test": begin
-        // TODO update read check later
-        do_read_check = 1'b0;
+        if (write && channel == AddrChannel) begin
+          bit [TL_DW-1:0] intr_en = `gmv(ral.intr_enable);
+          intr_exp |= item.a_data;
+          if (cfg.en_cov) begin
+            foreach (intr_exp[i]) begin
+              cov.intr_test_cg.sample(i, item.a_data[i], intr_en[i], intr_exp[i]);
+            end
+          end
+        end
       end
       "cfgen": begin
         // Check in this block
@@ -224,6 +250,8 @@
                 next_state        = get_next_state(current_state);
               end else if (start) begin
                 current_op_status = keymgr_pkg::OpDoneFail;
+                // No KDF issued, done interrupt is triggered immediately
+                intr_exp[IntrOpDone] = 1;
               end
             end
             keymgr_pkg::StInit: begin
@@ -296,18 +324,19 @@
 
         if (addr_phase_write) begin
           // W1C
-          `downcast(current_op_status, int'(current_op_status) ^ item.a_data);
+          `downcast(current_op_status, int'(current_op_status) & ~item.a_data);
         end else if (addr_phase_read) begin
           addr_phase_op_status = current_op_status;
         end else if (data_phase_read) begin
           if (current_state == keymgr_pkg::StReset) begin
-            // when advance from StReset to StInit, we don't how long it will take, if it's ok when
-            // it's WIP or success
+            // when advance from StReset to StInit, we don't how long it will take, it's ok when
+            // status is WIP or success
             `DV_CHECK_EQ(item.d_data inside {current_op_status, next_op_status}, 1)
             if (item.d_data == next_op_status) begin
               current_op_status = next_op_status;
               current_state = next_state;
               next_op_status = keymgr_pkg::OpIdle;
+              intr_exp[IntrOpDone] = 1;
             end
           end else begin
             `DV_CHECK_EQ(item.d_data, addr_phase_op_status)
@@ -321,12 +350,9 @@
         end
       end
       default: begin
-        if (uvm_re_match("sw_share*", csr.get_name())) begin
+        if (uvm_re_match("sw_share*", csr.get_name())) begin // Not sw_share
           // TODO
           do_read_check = 1'b0;
-        end else begin // sw_share
-          // TODO #4292
-          do_read_check = 1'b0;
         end
       end
     endcase
@@ -362,8 +388,7 @@
     `CREATE_CMP_STR(RomExtSecurityDescriptor)
 
     if (exp_match) begin
-      // TODO #4292
-      //`DV_CHECK_EQ(act, exp, str)
+      `DV_CHECK_EQ(act, exp, str)
     end else begin
       `DV_CHECK_NE(act, exp, str)
     end
@@ -491,6 +516,7 @@
     current_op_status = keymgr_pkg::OpIdle;
     next_op_status    = keymgr_pkg::OpIdle;
     current_hw_key    = 0;
+    intr_exp          = 0;
     adv_data_a_array.delete();
     id_data_a_array.delete();
     sw_data_a_array.delete();