[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();