[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