[keymgr/dv] Fix sw_binding gated by LC

A small fix to gate sw_binding if keymgr_en is off

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 960a8d8..7e0136b 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -426,7 +426,7 @@
         `uvm_info(`gfn, $sformatf("Reg write to %0s is ignored due to cfg_regwen=0", csr.get_name()),
                   UVM_MEDIUM)
         return;
-      end else if (`gmv(ral.sw_binding_regwen) == 0 &&
+      end else if ((`gmv(ral.sw_binding_regwen) == 0 || !cfg.keymgr_vif.get_keymgr_en()) &&
           ral.sw_binding_regwen.locks_reg_or_fld(dv_reg)) begin
         `uvm_info(`gfn, $sformatf("Reg write to %0s is ignored due to sw_binding_regwen=0",
                                   csr.get_name()), UVM_MEDIUM)
@@ -1130,19 +1130,30 @@
   virtual function void wipe_hw_keys();
     fork
       begin
+        keymgr_pkg::keymgr_working_state_e current_design_state;
         cfg.clk_rst_vif.wait_n_clks(1);
-        if (current_op_status != keymgr_pkg::OpWip || current_state == keymgr_pkg::StReset) begin
-          if (current_state != keymgr_pkg::StReset) begin
-            // design takes 2 cycle to update state
-            update_state(.cyc_dly(2));
-            `uvm_info(`gfn, "Keymgr_en is Off, wipe secret and move state to Invalid", UVM_LOW)
-          end else begin
-            bit [TL_DW-1:0] err_code = get_err_code();
-            err_code[keymgr_pkg::ErrInvalidOp] = 1;
-            // if it's StReset, the Advance OP is ongoing. alert will be sent after the OP
-            set_exp_alert("recov_operation_err", .max_delay(RESET_ADV_CYCLES));
-            void'(ral.err_code.predict(err_code));
-          end
+        // When LC disables keymgr across with an operation, will have InvalidOp error.
+        // If no operation at that time, no error.
+        // Need to know the actual state in design, in order to predict correctly
+        // And we will check that hw key is wiped no matter whether InvalidOp is set or not.
+        csr_rd(.ptr(ral.working_state), .value(current_design_state), .backdoor(1'b1));
+
+        // LC-disable happens during advancing to StInit
+        // If LC-disable happens during an operation in other states, KDF will occur.
+        // err_code/alert is updated when KDF is done
+        if (current_design_state == keymgr_pkg::StReset) begin
+          bit [TL_DW-1:0] err_code = get_err_code();
+          err_code[keymgr_pkg::ErrInvalidOp] = 1;
+          // if it's StReset, the Advance OP is ongoing. alert will be sent after the OP
+          set_exp_alert("recov_operation_err", .max_delay(RESET_ADV_CYCLES));
+          void'(ral.err_code.predict(err_code));
+          `uvm_info(`gfn,
+              "Keymgr_en is Off when advancing to StInit, wipe secret and move state to Invalid",
+              UVM_LOW)
+        end
+        else if (current_op_status != keymgr_pkg::OpWip) begin
+          update_state(.cyc_dly(2));
+          `uvm_info(`gfn, "Keymgr_en is Off, wipe secret and move state to Invalid", UVM_LOW)
         end
       end
       begin
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 3de3ecf..5cf9ded 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
@@ -272,7 +272,7 @@
 
   // when reset occurs or keymgr_en = Off, disable checks in seq and check in scb only
   virtual function bit get_check_en();
-    return cfg.keymgr_vif.keymgr_en == lc_ctrl_pkg::On && !cfg.under_reset;
+    return cfg.keymgr_vif.get_keymgr_en() && !cfg.under_reset;
   endfunction
 
   task post_start();
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_lc_disable_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_lc_disable_vseq.sv
index 9d2c20a..9370323 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_lc_disable_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_lc_disable_vseq.sv
@@ -8,8 +8,10 @@
   `uvm_object_new
 
   virtual task op_before_enable_keymgr();
+    if (cfg.keymgr_vif.keymgr_en == lc_ctrl_pkg::On) return;
+
     `uvm_info(`gfn, "Dummy operations before LC enables keymgr", UVM_MEDIUM)
-    keymgr_operations();
+    keymgr_operations(.advance_state(0));
     `uvm_info(`gfn, "Dummy operations are done", UVM_MEDIUM)
   endtask