[dv/shadow_reg] Fix alert shadow reg regression error
This PR fixes a regression error where shadow register read did not
clear the phase tracker in DV environment.
The reason is because the sequence uses a field read instead of
register read.
So this PR extends the helper function to clear the phase tracker in CSR
field read as well.
Signed-off-by: Cindy Chen <chencindy@opentitan.org>
diff --git a/hw/dv/sv/dv_base_reg/dv_base_reg.sv b/hw/dv/sv/dv_base_reg/dv_base_reg.sv
index 8a2b885..4d3eb9e 100644
--- a/hw/dv/sv/dv_base_reg/dv_base_reg.sv
+++ b/hw/dv/sv/dv_base_reg/dv_base_reg.sv
@@ -153,6 +153,11 @@
en_shadow_wr = val;
endfunction
+ // A helper function for shadow register or field read to clear the `shadow_wr_staged` flag.
+ virtual function void clear_shadow_wr_staged();
+ if (is_shadowed) shadow_wr_staged = 0;
+ endfunction
+
function bit get_is_shadowed();
return is_shadowed;
endfunction
@@ -208,7 +213,7 @@
// shadow register read will clear its phase tracker
virtual task post_read(uvm_reg_item rw);
- if (is_shadowed) shadow_wr_staged = 0;
+ clear_shadow_wr_staged();
endtask
virtual function void set_is_ext_reg(bit is_ext);
diff --git a/hw/dv/sv/dv_base_reg/dv_base_reg_field.sv b/hw/dv/sv/dv_base_reg/dv_base_reg_field.sv
index 8886a67..831b317 100644
--- a/hw/dv/sv/dv_base_reg/dv_base_reg_field.sv
+++ b/hw/dv/sv/dv_base_reg/dv_base_reg_field.sv
@@ -126,6 +126,12 @@
lockable_flds_q = lockable_flds;
endfunction
+ // shadow register field read will clear its phase tracker
+ virtual task post_read(uvm_reg_item rw);
+ dv_base_reg parent_csr = get_dv_base_reg_parent();
+ parent_csr.clear_shadow_wr_staged();
+ endtask
+
// override RAL's reset function to support enable registers
// when reset issued - the lockable field's access will be reset to original access
virtual function void reset(string kind = "HARD");