[dv/keymgr] Enable testing for sw_binding_*
Also fix a corner case in cfgen_vseq: when done is asserted, skiping
writting cfgen gated csr
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 21d3119..6bfb7a3 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -91,7 +91,7 @@
forever begin
wait(!cfg.under_reset);
wait(cfg.keymgr_vif.keymgr_en != lc_ctrl_pkg::On);
- wipe_hw_keys();
+ if (current_state != keymgr_pkg::StReset) wipe_hw_keys();
wait(cfg.keymgr_vif.keymgr_en == lc_ctrl_pkg::On);
end
join_none
@@ -200,6 +200,9 @@
if (current_state == keymgr_pkg::StOwnerKey) update_result = NotUpdate;
else update_result = UpdateInternalKey;
current_state = get_next_state(current_state);
+
+ // set sw_binding_en after advance OP
+ void'(ral.sw_binding_en.predict(.value(1)));
end
keymgr_pkg::OpDisable: begin
update_result = UpdateInternalKey;
@@ -263,12 +266,14 @@
// if OP WIP or keymgr_en=0, will clear cfgen and below csr can't be written
if ((current_op_status == keymgr_pkg::OpWip || cfg.keymgr_vif.keymgr_en != lc_ctrl_pkg::On) &&
csr.get_name() inside {"control", "key_version",
- // TODO enable these after #4564 is solved
- //"sw_binding_0", "sw_binding_1", "sw_binding_2", "sw_binding_3",
+ "sw_binding_0", "sw_binding_1", "sw_binding_2", "sw_binding_3",
"salt_0", "salt_1", "salt_2", "salt_3"}) begin
`uvm_info(`gfn, $sformatf("Reg write to %0s is ignored due to cfgen=0", csr.get_name()),
UVM_MEDIUM)
return;
+ end else if (`gmv(ral.sw_binding_en) == 0 && csr.get_name() inside {"sw_binding_0",
+ "sw_binding_1", "sw_binding_2", "sw_binding_3"}) begin
+ return;
end else begin
void'(csr.predict(.value(item.a_data), .kind(UVM_PREDICT_WRITE), .be(item.a_mask)));
end
@@ -622,7 +627,8 @@
// TODO, need designer to update for #4680
virtual function void wipe_hw_keys();
- if (current_state != keymgr_pkg::StReset) current_state = keymgr_pkg::StInvalid;
+ `uvm_info(`gfn, "Keymgr_en is Off, wipe secret and move state to Invalid", UVM_LOW)
+ current_state = keymgr_pkg::StInvalid;
endfunction
virtual function void reset(string kind = "HARD");
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv
index 81c5736..6a1b76e 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv
@@ -50,9 +50,12 @@
// writing during cfgen is timing sensitive
// 1. make sure no other thread is accessing register
// 2. use backdoor check op_status again in case it's not OpWip after front-door read
+ // 3. make sure done isn't high, because if done is high, next cycle status won't be WIP
wait_no_outstanding_access();
csr_rd(ral.op_status, op_status_val, .backdoor(1));
- if (op_status_val == keymgr_pkg::OpWip) write_cfgen_gated_reg();
+ if (op_status_val == keymgr_pkg::OpWip && cfg.keymgr_vif.kmac_data_rsp.done) begin
+ write_cfgen_gated_reg();
+ end
end
endtask
@@ -64,11 +67,10 @@
randcase
1: csr_wr(ral.control, val);
1: csr_wr(ral.key_version, val);
- // TODO enable these after #4564 is solved
- //1: csr_wr(ral.sw_binding_0, val);
- //1: csr_wr(ral.sw_binding_1, val);
- //1: csr_wr(ral.sw_binding_2, val);
- //1: csr_wr(ral.sw_binding_3, val);
+ 1: csr_wr(ral.sw_binding_0, val);
+ 1: csr_wr(ral.sw_binding_1, val);
+ 1: csr_wr(ral.sw_binding_2, val);
+ 1: csr_wr(ral.sw_binding_3, val);
1: csr_wr(ral.salt_0, val);
1: csr_wr(ral.salt_1, val);
1: csr_wr(ral.salt_2, val);
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_random_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_random_vseq.sv
index fb5b7c1..b661ca8 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_random_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_random_vseq.sv
@@ -10,6 +10,7 @@
task write_random_sw_content();
uvm_reg csr_update_q[$];
+ csr_random_n_add_to_q(ral.sw_binding_en, csr_update_q);
csr_random_n_add_to_q(ral.sw_binding_0, csr_update_q);
csr_random_n_add_to_q(ral.sw_binding_1, csr_update_q);
csr_random_n_add_to_q(ral.sw_binding_2, csr_update_q);