[dv/otp_ctrl] clean up macro errors sequence
A few updates related to macro_errors sequences:
1. Change from pre_start task to pre_randomize.
2. Updates a few namings in scb and sequences.
Signed-off-by: Cindy Chen <chencindy@google.com>
diff --git a/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv b/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv
index f3b382a..105b183 100644
--- a/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv
+++ b/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv
@@ -234,10 +234,10 @@
end else if ((csr_addr & addr_mask) inside
{[SW_WINDOW_BASE_ADDR : SW_WINDOW_BASE_ADDR + SW_WINDOW_SIZE]}) begin
if (data_phase_read) begin
- bit [TL_AW-1:0] dai_addr = (csr_addr & addr_mask - SW_WINDOW_BASE_ADDR) >> 2;
- int part_idx = get_part_index(dai_addr);
- bit [TL_DW-1:0] exp_val = sw_read_lock[part_idx] ? 0 : otp_a[dai_addr];
- `DV_CHECK_EQ(item.d_data, exp_val, $sformatf("mem read mismatch at addr %0h", dai_addr))
+ bit [TL_AW-1:0] otp_addr = (csr_addr & addr_mask - SW_WINDOW_BASE_ADDR) >> 2;
+ int part_idx = get_part_index(otp_addr << 2);
+ bit [TL_DW-1:0] exp_val = sw_read_lock[part_idx] ? 0 : otp_a[otp_addr];
+ `DV_CHECK_EQ(item.d_data, exp_val, $sformatf("mem read mismatch at addr %0h", otp_addr))
end
return;
// TEST ACCESS window
@@ -301,19 +301,16 @@
`gmv(ral.direct_access_wdata_0)};
// write OTP memory
end else begin
- bit[TL_AW-1:0] normalized_dai_addr = get_normalized_dai_addr();
+ bit[TL_AW-1:0] otp_addr = get_scb_otp_addr();
if (!is_secret(dai_addr)) begin
- if (otp_a[normalized_dai_addr] == 0) begin
- otp_a[normalized_dai_addr] = `gmv(ral.direct_access_wdata_0);
- end else begin
- predict_status_err(1);
- end
+ if (otp_a[otp_addr] == 0) otp_a[otp_addr] = `gmv(ral.direct_access_wdata_0);
+ else predict_status_err(1);
end else begin
- bit [SCRAMBLE_DATA_SIZE-1:0] secret_data = {otp_a[normalized_dai_addr + 1],
- otp_a[normalized_dai_addr]};
+ bit [SCRAMBLE_DATA_SIZE-1:0] secret_data = {otp_a[otp_addr + 1],
+ otp_a[otp_addr]};
if (scramble_data(secret_data, part_idx) == 0) begin
- otp_a[normalized_dai_addr] = `gmv(ral.direct_access_wdata_0);
- otp_a[normalized_dai_addr + 1] = `gmv(ral.direct_access_wdata_1);
+ otp_a[otp_addr] = `gmv(ral.direct_access_wdata_0);
+ otp_a[otp_addr + 1] = `gmv(ral.direct_access_wdata_1);
end else begin
predict_status_err(1);
end
@@ -331,17 +328,17 @@
"direct_access_rdata_0", "direct_access_rdata_1": begin
// TODO: need to check last cmd is READ
if (data_phase_read && `gmv(ral.direct_access_regwen)) begin
- bit [TL_AW-1:0] dai_addr = get_normalized_dai_addr();
+ bit [TL_AW-1:0] otp_addr = get_scb_otp_addr();
if (csr.get_name() == "direct_access_rdata_0") begin
- bit [TL_DW-1:0] exp_val = dai_read_valid ? otp_a[dai_addr] : 0;
+ bit [TL_DW-1:0] exp_val = dai_read_valid ? otp_a[otp_addr] : 0;
`DV_CHECK_EQ(item.d_data, exp_val,
- $sformatf("DAI read mismatch at addr %0h", dai_addr))
+ $sformatf("DAI read mismatch at addr %0h", csr_addr))
do_read_check = 0;
end else begin
if (is_secret(`gmv(ral.direct_access_address))) begin
- bit [TL_DW-1:0] exp_val = dai_read_valid ? otp_a[dai_addr + 1] : 0;
+ bit [TL_DW-1:0] exp_val = dai_read_valid ? otp_a[otp_addr + 1] : 0;
`DV_CHECK_EQ(item.d_data, exp_val,
- $sformatf("DAI read mismatch at addr %0h", dai_addr + 1))
+ $sformatf("DAI read mismatch at addr %0h", otp_addr + 1))
do_read_check = 0;
end
end
@@ -542,9 +539,9 @@
present_encode_with_final_const = enc_array[NUM_ROUND-1] ^ intermediate_state;
endfunction
- function bit [TL_AW-1:0] get_normalized_dai_addr();
+ function bit [TL_AW-1:0] get_scb_otp_addr();
bit [TL_DW-1:0] dai_addr = `gmv(ral.direct_access_address);
- get_normalized_dai_addr = is_secret(dai_addr) ? dai_addr >> 3 << 1 : dai_addr >> 2;
+ get_scb_otp_addr = is_secret(dai_addr) ? dai_addr >> 3 << 1 : dai_addr >> 2;
endfunction
virtual function void predict_status_err(bit dai_err, int part_idx = 0);
diff --git a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_base_vseq.sv b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_base_vseq.sv
index 539ba4f..5b1a36e 100644
--- a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_base_vseq.sv
+++ b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_base_vseq.sv
@@ -113,14 +113,14 @@
// SW digest data are calculated in sw and won't be checked in OTP.
// Here to simplify testbench, write random data to sw digest
virtual task write_sw_digests(bit [1:0] wr_digest = $urandom());
- bit [TL_DW*2-1:0] rdata;
+ bit [TL_DW*2-1:0] wdata;
if (wr_digest[0]) begin
- `DV_CHECK_STD_RANDOMIZE_FATAL(rdata);
- dai_wr(CreatorSwCfgDigestOffset, rdata[TL_DW-1:0], rdata[TL_DW*2-1:TL_DW]);
+ `DV_CHECK_STD_RANDOMIZE_FATAL(wdata);
+ dai_wr(CreatorSwCfgDigestOffset, wdata[TL_DW-1:0], wdata[TL_DW*2-1:TL_DW]);
end
if (wr_digest[1]) begin
- `DV_CHECK_STD_RANDOMIZE_FATAL(rdata);
- dai_wr(OwnerSwCfgDigestOffset, rdata[TL_DW-1:0], rdata[TL_DW*2-1:TL_DW]);
+ `DV_CHECK_STD_RANDOMIZE_FATAL(wdata);
+ dai_wr(OwnerSwCfgDigestOffset, wdata[TL_DW-1:0], wdata[TL_DW*2-1:TL_DW]);
end
endtask
@@ -130,7 +130,7 @@
endtask
// The digest CSR values are verified in otp_ctrl_scoreboard
- virtual task check_digests();
+ virtual task rd_digests();
bit [TL_DW-1:0] val;
csr_rd(.ptr(ral.creator_sw_cfg_digest_0), .value(val));
csr_rd(.ptr(ral.creator_sw_cfg_digest_1), .value(val));
diff --git a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_macro_errs_vseq.sv b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_macro_errs_vseq.sv
index 2223b7a..748798a 100644
--- a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_macro_errs_vseq.sv
+++ b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_macro_errs_vseq.sv
@@ -16,13 +16,12 @@
num_dai_op inside {[100:500]};
}
- virtual task pre_start();
- super.pre_start();
+ function void pre_randomize();
// TODO: enable this once support
// this.partition_index_c.constraint_mode(0);
// this.dai_wr_legal_addr_c.constraint_mode(0);
this.dai_wr_blank_addr_c.constraint_mode(0);
collect_used_addr = 0;
- endtask
+ endfunction
endclass
diff --git a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_smoke_vseq.sv b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_smoke_vseq.sv
index ace20e3..4cef1d4 100644
--- a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_smoke_vseq.sv
+++ b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_smoke_vseq.sv
@@ -122,8 +122,8 @@
write_sw_rd_locks();
dut_init();
- // check digest
- check_digests();
+ // read and check digest in scb
+ rd_digests();
if (do_lc_trans) begin
req_lc_transition();