[flash_ctrl] ADD SCOREBOARD ERASE PREDICTION
Add Scoreboard erase prediction. Add support for update memory
in scoreboard when backdoor write is initiated. Moved mem model
from scb to cfg. Replaced redundancy with info2 partition.
Signed-off-by: Nikola Miladinovic <nikola.miladinovic@ensilica.com>
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_cfg.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_cfg.sv
index f8ed67a..8f75c66 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_cfg.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_cfg.sv
@@ -30,18 +30,14 @@
// Knob for scoreboard set expected alert
bit scb_set_exp_alert = 0;
- // Knob for scoreboard delete memory
- bit scb_empty_mem = 0;
-
// Knob for Bank Erase
bit bank_erase_enable = 1;
- // Parameters for set backdoor scb memory
- bit scb_set_mem = 0;
- int bkd_num_words;
- flash_dv_part_e bkd_partition;
- bit [TL_AW-1:0] write_bkd_addr;
- bit [TL_DW-1:0] set_bkd_val;
+ // mem for scoreboard
+ data_t scb_flash_data [addr_t] = '{default: 1};
+ data_t scb_flash_info [addr_t] = '{default: 1};
+ data_t scb_flash_info1 [addr_t] = '{default: 1};
+ data_t scb_flash_info2 [addr_t] = '{default: 1};
// Max delay for alerts in clocks
uint alert_max_delay;
@@ -376,4 +372,18 @@
return exp_data;
endfunction : calculate_expected_data
+ virtual function void write_data_all_part(flash_dv_part_e part, bit [TL_AW-1:0] addr,
+ ref bit [TL_DW-1:0] data);
+ `uvm_info(`gfn, $sformatf("WRITE SCB MEM part: %0s addr:%0h data:0x%0h",
+ part.name, addr, data), UVM_HIGH)
+ case (part)
+ FlashPartData: scb_flash_data[addr] = data;
+ FlashPartInfo: scb_flash_info[addr] = data;
+ FlashPartInfo1: scb_flash_info1[addr] = data;
+ FlashPartInfo2: scb_flash_info2[addr] = data;
+ default :
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Partition type not supported!")
+ endcase
+ endfunction
+
endclass
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_pkg.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_pkg.sv
index 2f2aad9..2b7bec8 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_pkg.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_env_pkg.sv
@@ -70,6 +70,15 @@
// Need to create a design parameter for this
parameter uint FlashFullDataWidth = flash_ctrl_pkg::DataWidth + 4;
+ // params for words
+ parameter uint NUM_PAGE_WORDS = 512;
+ parameter uint NUM_BK_DATA_WORDS = 131072; // 256 pages
+ parameter uint NUM_BK_INFO_WORDS = 5120; // 10 pages
+
+ // params for num of pages
+ parameter uint NUM_PAGE_PART_DATA = 512;
+ parameter uint NUM_PAGE_PART_INFO0 = 10;
+
parameter otp_ctrl_pkg::flash_otp_key_rsp_t FLASH_OTP_RSP_DEFAULT = '{
data_ack: 1'b0,
addr_ack: 1'b0,
@@ -123,7 +132,7 @@
FlashPartData = 0,
FlashPartInfo = 1,
FlashPartInfo1 = 2,
- FlashPartRedundancy = 4
+ FlashPartInfo2 = 4
} flash_dv_part_e;
// Special Partitions
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
index e7e7181..5211f13 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
@@ -13,26 +13,27 @@
`uvm_component_new
- data_t exp_flash_data [addr_t] = '{default: 1};
- data_t exp_flash_info [addr_t] = '{default: 1};
- data_t exp_flash_info1 [addr_t] = '{default: 1};
- data_t exp_flash_redund[addr_t] = '{default: 1};
- uvm_reg_data_t data;
- uvm_reg csr;
- string csr_name;
- flash_dv_part_e part = FlashPartData;
- addr_t wr_addr;
- addr_t rd_addr;
- int num_wr = 0;
- int num_rd = 0;
- int idx_wr = 0;
- int idx_rd = 0;
- bit part_sel = 0;
- bit [1:0] info_sel = 2'b00;
- bit wr_access = 1'b0;
- bit rd_access = 1'b0;
-
- tl_seq_item eflash_addr_phase_queue[$];
+ uvm_reg_data_t data;
+ uvm_reg csr;
+ string csr_name;
+ flash_dv_part_e part = FlashPartData;
+ addr_t wr_addr;
+ addr_t rd_addr;
+ addr_t erase_addr;
+ bit [1:0] erase_bank_en;
+ int num_wr = 0;
+ int num_rd = 0;
+ int idx_wr = 0;
+ int idx_rd = 0;
+ bit part_sel = 0;
+ bit [1:0] info_sel = 2'b00;
+ bit wr_access = 1'b0;
+ bit rd_access = 1'b0;
+ bit erase_access = 1'b0;
+ bit erase_sel;
+ bit [1:0] curr_op;
+ tl_seq_item eflash_addr_phase_queue[$];
+ int num_erase_words;
// TLM agent fifos
uvm_tlm_analysis_fifo #(tl_seq_item) eflash_tl_a_chan_fifo;
@@ -158,11 +159,11 @@
end else begin
wr_addr += 4;
end
- wr_access = 0;
write_allowed(part, wr_addr);
- `uvm_info(`gfn, $sformatf("wr_access: 0x%0b", wr_access), UVM_LOW)
+ `uvm_info(`gfn, $sformatf("wr_access: 0x%0b wr_addr: 0x%0h", wr_access, wr_addr),
+ UVM_LOW)
if (wr_access) begin
- write_data_all_part(part, wr_addr, item.a_data);
+ cfg.write_data_all_part(part, wr_addr, item.a_data);
end
if (idx_wr == num_wr) begin
idx_wr = 0;
@@ -174,6 +175,31 @@
`DV_CHECK_NE_FATAL(csr, null)
void'(csr.predict(.value(item.a_data), .kind(UVM_PREDICT_WRITE), .be(item.a_mask)));
`uvm_info(`gfn, $sformatf("SCB EXP FLASH REG: 0x%0h", csr_addr), UVM_HIGH)
+ if ((csr.get_name() == "control") && cfg.scb_check) begin
+ csr_rd(.ptr(ral.control), .value(data), .backdoor(1'b1));
+ curr_op = get_field_val(ral.control.op, data);
+ if (curr_op == 2) begin //erase op
+ erase_sel = get_field_val(ral.control.erase_sel, data);
+ part_sel = get_field_val(ral.control.partition_sel, data);
+ info_sel = get_field_val(ral.control.info_sel, data);
+ part = calc_part(part_sel, info_sel);
+ csr_rd(.ptr(ral.addr), .value(data), .backdoor(1'b1));
+ erase_addr = word_align_addr(get_field_val(ral.addr.start, data));
+ csr_rd(.ptr(ral.mp_bank_cfg_shadowed[0]), .value(data), .backdoor(1'b1));
+ `uvm_info(`gfn, $sformatf("UVM_REG_DATA: 0x%0p",data), UVM_HIGH)
+ erase_bank_en = data;
+ `uvm_info(`gfn, $sformatf("erase_sel: 0x%0b part sel: 0x%0b info sel 0x%0d",
+ erase_sel, part_sel, info_sel), UVM_LOW)
+ `uvm_info(`gfn, $sformatf("part: %0s addr: 0x%0h erase_bank_en: 0x%0h",
+ part.name, erase_addr, erase_bank_en), UVM_LOW)
+ erase_allowed(part, erase_sel, erase_addr, erase_bank_en);
+ `uvm_info(`gfn, $sformatf("erase_access: 0x%0b part:%0s erase_addr: 0x%0h",
+ erase_access, part.name , erase_addr), UVM_LOW)
+ if (erase_access) begin
+ erase_data(part, erase_addr, erase_sel);
+ end
+ end
+ end
end
end
@@ -227,7 +253,6 @@
end else begin
rd_addr += 4;
end
- rd_access = 0;
read_allowed(part, rd_addr);
`uvm_info(`gfn, $sformatf("rd_access: 0x%0b", rd_access), UVM_LOW)
if (rd_access) begin
@@ -248,6 +273,10 @@
// reset local fifos queues and variables
eflash_tl_a_chan_fifo.flush();
eflash_tl_d_chan_fifo.flush();
+ cfg.scb_flash_data.delete();
+ cfg.scb_flash_info.delete();
+ cfg.scb_flash_info1.delete();
+ cfg.scb_flash_info2.delete();
endfunction
virtual function void check_phase(uvm_phase phase);
@@ -265,7 +294,7 @@
case (info_sel)
2'b00: return FlashPartInfo;
2'b01: return FlashPartInfo1;
- 2'b10: return FlashPartRedundancy;
+ 2'b10: return FlashPartInfo2;
default: begin
`uvm_fatal("flash_ctrl_scoreboard", $sformatf("unknown info part sel 0x%0h", info_sel))
end
@@ -273,36 +302,57 @@
end
endfunction
- virtual function void write_data_all_part(flash_dv_part_e part, bit [TL_AW-1:0] addr,
- ref bit [TL_DW-1:0] data);
- case (part)
- FlashPartData: exp_flash_data[addr] = data;
- FlashPartInfo: exp_flash_info[addr] = data;
- FlashPartInfo1: exp_flash_info1[addr] = data;
- //FlashPartRedundancy
- default: exp_flash_redund[addr] = data;
- endcase
- endfunction
-
virtual function void check_rd_data(ref flash_dv_part_e part, bit [TL_AW-1:0] addr,
ref bit [TL_DW-1:0] data);
case (part)
FlashPartData: begin
- check_rd_part(exp_flash_data, addr, data);
+ check_rd_part(cfg.scb_flash_data, addr, data);
end
FlashPartInfo: begin
- check_rd_part(exp_flash_info, addr, data);
+ check_rd_part(cfg.scb_flash_info, addr, data);
end
FlashPartInfo1: begin
- check_rd_part(exp_flash_info1, addr, data);
+ check_rd_part(cfg.scb_flash_info1, addr, data);
end
- // FlashPartRedundancy
- default: begin
- check_rd_part(exp_flash_redund, addr, data);
+ FlashPartInfo2 : begin
+ check_rd_part(cfg.scb_flash_info2, addr, data);
end
+ default:
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Partition type not supported!")
endcase
endfunction
+ virtual function void erase_data(flash_dv_part_e part, bit [TL_AW-1:0] addr, bit sel);
+ case (part)
+ FlashPartData: begin
+ erase_page_bank(NUM_BK_DATA_WORDS,addr,sel,cfg.scb_flash_data);
+ end
+ FlashPartInfo: begin
+ if (sel) begin
+ erase_page_bank(NUM_BK_DATA_WORDS,addr,sel,cfg.scb_flash_data);
+ end
+ erase_page_bank(NUM_BK_INFO_WORDS,addr,sel,cfg.scb_flash_info);
+ end
+ FlashPartInfo1: begin
+ if (!sel) begin
+ erase_page_bank(NUM_PAGE_WORDS,addr,sel,cfg.scb_flash_info1);
+ end else begin
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Bank erase for INFO1 part not supported!")
+ end
+ end
+ FlashPartInfo2: begin
+ if (!sel) begin
+ erase_page_bank(NUM_PAGE_WORDS,addr,sel,cfg.scb_flash_info2);
+ end else begin
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Bank erase for INFO2 part not supported!")
+ end
+ end
+ default :
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Partition type not supported!")
+ endcase
+
+ endfunction
+
virtual task write_allowed(ref flash_dv_part_e part, ref bit [TL_AW-1:0] in_addr);
bit en;
bit prog_en;
@@ -311,8 +361,10 @@
bit [9:0] size;
bit bk_idx;
int pg_idx;
- bit wr_access_found = 1'b0;
+ bit wr_access_found;
+ wr_access_found = 1'b0;
+ wr_access = 1'b0;
case (part)
FlashPartData: begin
for (int i = 0; i < cfg.seq_cfg.num_en_mp_regions; i++) begin
@@ -348,13 +400,14 @@
csr_name = $sformatf("bank%0d_info1_page_cfg_shadowed", bk_idx);
write_access_info();
end
- // FlashPartRedundancy
- default: begin
+ FlashPartInfo2: begin
bk_idx = in_addr[19];
pg_idx = in_addr[18:11];
csr_name = $sformatf("bank%0d_info2_page_cfg_shadowed_%0d", bk_idx, pg_idx);
write_access_info();
end
+ default :
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Partition type not supported!")
endcase
endtask
@@ -366,8 +419,10 @@
bit [9:0] size;
bit bk_idx;
int pg_idx;
- bit rd_access_found = 1'b0;
+ bit rd_access_found;
+ rd_access_found = 1'b0;
+ rd_access = 1'b0;
case (part)
FlashPartData: begin
for (int i = 0; i < cfg.seq_cfg.num_en_mp_regions; i++) begin
@@ -403,15 +458,81 @@
csr_name = $sformatf("bank%0d_info1_page_cfg_shadowed", bk_idx);
read_access_info();
end
- // FlashPartRedundancy
- default: begin
+ FlashPartInfo2: begin
bk_idx = in_rd_addr[19];
pg_idx = in_rd_addr[18:11];
csr_name = $sformatf("bank%0d_info2_page_cfg_shadowed_%0d", bk_idx, pg_idx);
read_access_info();
end
+ default :
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Partition type not supported!")
endcase
+ endtask
+ virtual task erase_allowed(ref flash_dv_part_e part, bit erase_sel,
+ ref bit [TL_AW-1:0] in_erase_addr, bit [1:0] bk_en);
+ bit en;
+ bit erase_en;
+ bit erase_en_def;
+ bit [8:0] base;
+ bit [9:0] size;
+ bit bk_idx;
+ int pg_idx;
+ bit erase_access_found;
+
+ erase_access_found = 1'b0;
+ erase_access = 1'b0;
+ if (!erase_sel) begin // page erase
+ case (part)
+ FlashPartData: begin
+ for (int i = 0; i < cfg.seq_cfg.num_en_mp_regions; i++) begin
+ if (!erase_access_found) begin
+ csr_rd(.ptr(ral.mp_region_cfg_shadowed[i]), .value(data), .backdoor(1'b1));
+ en = get_field_val(ral.mp_region_cfg_shadowed[i].en, data);
+ erase_en = get_field_val(ral.mp_region_cfg_shadowed[i].erase_en, data);
+ base = get_field_val(ral.mp_region_cfg_shadowed[i].base, data);
+ size = get_field_val(ral.mp_region_cfg_shadowed[i].size, data);
+ if (in_erase_addr
+ inside {[base*BytesPerPage:base*BytesPerPage+size*BytesPerPage]}) begin
+ if (en) begin
+ erase_access = erase_en;
+ erase_access_found = 1'b1;
+ end
+ end
+ end
+ end
+ if (!erase_access_found) begin
+ csr_rd(.ptr(ral.default_region_shadowed), .value(data), .backdoor(1'b1));
+ erase_en_def = get_field_val(ral.default_region_shadowed.erase_en, data);
+ erase_access = erase_en_def;
+ erase_access_found = 1'b1;
+ end
+ end
+ FlashPartInfo: begin
+ bk_idx = in_erase_addr[19];
+ pg_idx = in_erase_addr[18:11];
+ csr_name = $sformatf("bank%0d_info0_page_cfg_shadowed_%0d", bk_idx, pg_idx);
+ erase_access_info();
+ end
+ FlashPartInfo1: begin
+ bk_idx = in_erase_addr[19];
+ csr_name = $sformatf("bank%0d_info1_page_cfg_shadowed", bk_idx);
+ erase_access_info();
+ end
+ FlashPartInfo2: begin
+ bk_idx = in_erase_addr[19];
+ pg_idx = in_erase_addr[18:11];
+ csr_name = $sformatf("bank%0d_info2_page_cfg_shadowed_%0d", bk_idx, pg_idx);
+ erase_access_info();
+ end
+ default:
+ `uvm_fatal(`gfn,"flash_ctrl_scoreboard: Partition type not supported!")
+ endcase
+ end else begin // bank erase
+ bk_idx = in_erase_addr[19];
+ erase_access = bk_en[bk_idx];
+ `uvm_info(`gfn, $sformatf("erase_access bank: 0x%0b",erase_access), UVM_LOW)
+ end
endtask
virtual function void check_rd_part(const ref data_t exp_data_part[addr_t],
@@ -426,6 +547,7 @@
virtual task write_access_info();
bit en;
bit prog_en;
+
csr = ral.get_reg_by_name(csr_name);
csr_rd(.ptr(csr), .value(data), .backdoor(1'b1));
en = get_field_val(csr.get_field_by_name("en"), data);
@@ -440,6 +562,7 @@
virtual task read_access_info();
bit en;
bit read_en;
+
csr = ral.get_reg_by_name(csr_name);
csr_rd(.ptr(csr), .value(data), .backdoor(1'b1));
en = get_field_val(csr.get_field_by_name("en"), data);
@@ -451,4 +574,44 @@
end
endtask
+ virtual task erase_access_info();
+ bit en;
+ bit erase_en;
+
+ csr = ral.get_reg_by_name(csr_name);
+ csr_rd(.ptr(csr), .value(data), .backdoor(1'b1));
+ en = get_field_val(csr.get_field_by_name("en"), data);
+ erase_en = get_field_val(csr.get_field_by_name("erase_en"), data);
+ if (en) begin
+ erase_access = erase_en;
+ end else begin
+ erase_access = 0; //protected
+ end
+ endtask
+
+ virtual function void erase_page_bank(int num_bk_words, bit [TL_AW-1:0] addr,
+ bit sel, ref data_t exp_part[addr_t]);
+ int num_wr;
+ if (sel) begin // bank sel
+ num_wr = num_bk_words;
+ `uvm_info(`gfn, $sformatf("num_wr: %0d", num_wr), UVM_LOW)
+ if (addr[19]) begin // bank 1
+ addr = BytesPerBank;
+ end else begin // bank 0
+ addr = 0;
+ end
+ end else begin // page sel
+ num_wr = NUM_PAGE_WORDS;
+ addr = {addr[19:11], {11{1'b0}}};
+ end
+ for (int i = 0; i < num_wr; i++) begin
+ if (exp_part.exists(addr)) begin
+ exp_part[addr] = {TL_DW{1'b1}};
+ `uvm_info(`gfn, $sformatf("ERASE ADDR:0x%0h scb_flash_data: 0x%0h",
+ addr, exp_part[addr]), UVM_LOW)
+ end
+ addr = addr + 4;
+ end
+ endfunction
+
endclass
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_seq_cfg.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_seq_cfg.sv
index 7b928e3..e0d13d7 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_seq_cfg.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_seq_cfg.sv
@@ -69,10 +69,10 @@
// Flash ctrl op randomization knobs.
// Partition select. Make sure to keep sum equals to 100.
- uint op_on_data_partition_pc; // Choose data partition.
- uint op_on_info_partition_pc; // Choose info partition.
+ uint op_on_data_partition_pc; // Choose data partition.
+ uint op_on_info_partition_pc; // Choose info partition.
uint op_on_info1_partition_pc; // Choose info1 partition.
- uint op_on_redundancy_partition_pc; // Choose redundancy partition.
+ uint op_on_info2_partition_pc; // Choose info2 partition.
bit op_readonly_on_info_partition; // Make info partition read-only.
bit op_readonly_on_info1_partition; // Make info1 partition read-only.
@@ -117,27 +117,27 @@
// Set partition select percentages. Make sure to keep sum equals to 100.
virtual function void set_partition_pc(uint sel_data_part_pc = 100, uint sel_info_part_pc = 0,
uint sel_info1_part_pc = 0,
- uint sel_redundancy_part_pc = 0);
+ uint sel_info2_part_pc = 0);
- `DV_CHECK_EQ(sel_data_part_pc + sel_info_part_pc + sel_info1_part_pc + sel_redundancy_part_pc,
+ `DV_CHECK_EQ(sel_data_part_pc + sel_info_part_pc + sel_info1_part_pc + sel_info2_part_pc,
100, $sformatf(
{
"Error! sum of arguments must be 100. Be aware of arguments ",
"default values - 100 for data partition and 0 for all the ",
"others. Arguments current value: sel_data_part_pc=%0d , ",
"sel_info_part_pc=%0d , sel_info1_part_pc=%0d , ",
- "sel_redundancy_part_pc=%0d"
+ "sel_info2_part_pc=%0d"
},
sel_data_part_pc,
sel_info_part_pc,
sel_info1_part_pc,
- sel_redundancy_part_pc
+ sel_info2_part_pc
))
op_on_data_partition_pc = sel_data_part_pc;
op_on_info_partition_pc = sel_info_part_pc;
op_on_info1_partition_pc = sel_info1_part_pc;
- op_on_redundancy_partition_pc = sel_redundancy_part_pc;
+ op_on_info2_partition_pc = sel_info2_part_pc;
endfunction : set_partition_pc
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv
index 77fbf1b..5e4b564 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv
@@ -265,7 +265,7 @@
// FlashPartData = 0 | FlashPartData=0 | 0 |
// FlashPartInfo = 1 | FlashPartInfo=1 | 0 |
// FlashPartInfo1 = 2 | FlashPartInfo=1 | 1 |
- // FlashPartRedundancy = 4 | FlashPartInfo=1 | 2 |
+ // FlashPartInfo2 = 4 | FlashPartInfo=1 | 2 |
partition_sel = |flash_op.partition;
info_sel = flash_op.partition >> 1;
@@ -969,21 +969,28 @@
end
endtask : controller_program_page
- virtual task reset_scb_mem();
- cfg.scb_empty_mem = 1;
- cfg.clk_rst_vif.wait_clks(1);
- cfg.scb_empty_mem = 0;
- endtask : reset_scb_mem
-
+ // Task for set scb memory
virtual task set_scb_mem(int bkd_num_words,flash_dv_part_e bkd_partition,
bit [TL_AW-1:0] write_bkd_addr,bit [TL_DW-1:0] set_bkd_val);
- cfg.bkd_num_words = bkd_num_words;
- cfg.bkd_partition = bkd_partition;
- cfg.write_bkd_addr = write_bkd_addr;
- cfg.set_bkd_val = set_bkd_val;
+ bit [TL_AW-1:0] wr_bkd_addr;
`uvm_info(`gfn, $sformatf("SET SCB MEM TEST part: %0s addr:%0h data:0x%0h num: %0d",
bkd_partition.name,write_bkd_addr,set_bkd_val,bkd_num_words),UVM_HIGH)
- cfg.clk_rst_vif.wait_clks(1);
+ wr_bkd_addr = {write_bkd_addr[TL_AW-1:2], 2'b00};
+ `uvm_info(`gfn, $sformatf("SET SCB MEM ADDR:%0h", wr_bkd_addr), UVM_HIGH)
+ for (int i=0; i < bkd_num_words; i++) begin
+ `uvm_info(`gfn, $sformatf("SET SCB MEM part: %0s addr:%0h data:0x%0h num: %0d",
+ bkd_partition.name,wr_bkd_addr,set_bkd_val,bkd_num_words),UVM_HIGH)
+ cfg.write_data_all_part(bkd_partition, wr_bkd_addr, set_bkd_val);
+ wr_bkd_addr = wr_bkd_addr + 4;
+ end
endtask : set_scb_mem
+ // Task for clean scb memory
+ virtual task scb_del_mem();
+ cfg.scb_flash_data.delete();
+ cfg.scb_flash_info.delete();
+ cfg.scb_flash_info1.delete();
+ cfg.scb_flash_info2.delete();
+ endtask : scb_del_mem
+
endclass : flash_ctrl_base_vseq
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_ctrl_arb_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_ctrl_arb_vseq.sv
index 676ce9e..bbc1e4c 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_ctrl_arb_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_ctrl_arb_vseq.sv
@@ -66,7 +66,7 @@
flash_op.op == flash_ctrl_pkg::FlashOpRead;
}
- if (flash_op.partition == FlashPartRedundancy) {
+ if (flash_op.partition == FlashPartInfo2) {
flash_op.op == flash_ctrl_pkg::FlashOpRead;
}
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv
index 3f5dd63..2f61609 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_mp_regions_vseq.sv
@@ -154,8 +154,6 @@
cfg.scb_check = 1;
cfg.scb_set_exp_alert = 1;
cfg.alert_max_delay = 100_000_000;
- cfg.scb_empty_mem = 0;
- cfg.scb_set_mem = 0;
repeat (num_trans) begin
`DV_CHECK_RANDOMIZE_FATAL(this)
do_mp_reg();
@@ -163,7 +161,7 @@
if (cfg.bank_erase_enable) begin
//clean scb mem
- reset_scb_mem();
+ scb_del_mem();
`DV_CHECK_RANDOMIZE_WITH_FATAL(this,
flash_op.partition inside {FlashPartData,FlashPartInfo};)
`uvm_info(`gfn, $sformatf("BANK ERASE PART %0p", flash_op), UVM_LOW)
@@ -202,9 +200,7 @@
if (flash_op.op != flash_ctrl_pkg::FlashOpErase) begin
//prepare for program op
cfg.flash_mem_bkdr_write(.flash_op(flash_op), .scheme(FlashMemInitSet));
- cfg.scb_set_mem = 1;
set_scb_mem(flash_op.num_words,flash_op.partition,flash_op.addr,ALL_ONES);
- cfg.scb_set_mem = 0;
// FLASH Program Operation
flash_op.op = flash_ctrl_pkg::FlashOpProgram;
flash_ctrl_start_op(flash_op);
@@ -227,13 +223,11 @@
flash_op_pg_erase.addr = {flash_op.addr[19:11], {11{1'b0}}};
// FLASH Erase Page Operation of previous programmed data
`uvm_info(`gfn, $sformatf("PROGRAM OP %p", flash_op_pg_erase), UVM_HIGH)
- cfg.scb_set_mem = 1;
for (int i = 0; i < 32; i++) begin
set_scb_mem(flash_op_pg_erase.num_words,flash_op_pg_erase.partition,
flash_op_pg_erase.addr,ALL_ONES);
flash_op_pg_erase.addr = flash_op_pg_erase.addr + 64; //64B was written, 16 words
end
- cfg.scb_set_mem = 0;
flash_op_pg_erase.addr = {flash_op.addr[19:11], {11{1'b0}}};
controller_program_page(flash_op_pg_erase);
flash_op_pg_erase.op = flash_ctrl_pkg::FlashOpErase;
@@ -305,7 +299,7 @@
flash_op_bk_erase.addr = {flash_op.addr[19], {19{1'b0}}};
`uvm_info(`gfn, $sformatf("PROGRAM OP %p", flash_op_bk_erase), UVM_LOW)
- for (int i=0; i < 512; i++ ) begin
+ for (int i=0; i < NUM_PAGE_PART_DATA; i++ ) begin
controller_program_page(flash_op_bk_erase);
flash_op_bk_erase.addr = flash_op_bk_erase.addr + BytesPerPage;
end
@@ -314,7 +308,7 @@
flash_op_bk_erase.partition = FlashPartInfo;
flash_op_bk_erase.addr = {flash_op.addr[19], {19{1'b0}}};
`uvm_info(`gfn, $sformatf("PROGRAM OP %p", flash_op_bk_erase), UVM_LOW)
- for (int i=0; i < 10; i++ ) begin
+ for (int i=0; i < NUM_PAGE_PART_INFO0; i++ ) begin
controller_program_page(flash_op_bk_erase);
flash_op_bk_erase.addr = flash_op_bk_erase.addr + BytesPerPage;
end
@@ -329,7 +323,7 @@
flash_op_bk_erase.partition = FlashPartData;
flash_op_bk_erase.addr = {flash_op.addr[19], {19{1'b0}}};
`uvm_info(`gfn, $sformatf("READ OP %p", flash_op_bk_erase), UVM_LOW)
- for (int i=0; i < 512; i++ ) begin
+ for (int i=0; i < NUM_PAGE_PART_DATA; i++ ) begin
controller_read_page(flash_op_bk_erase);
flash_op_bk_erase.addr = flash_op_bk_erase.addr + BytesPerPage;
end
@@ -338,7 +332,7 @@
flash_op_bk_erase.partition = FlashPartInfo;
flash_op_bk_erase.addr = {flash_op.addr[19], {19{1'b0}}};
`uvm_info(`gfn, $sformatf("READ OP %p", flash_op_bk_erase), UVM_LOW)
- for (int i=0; i < 10; i++ ) begin
+ for (int i=0; i < NUM_PAGE_PART_INFO0; i++ ) begin
controller_read_page(flash_op_bk_erase);
flash_op_bk_erase.addr = flash_op_bk_erase.addr + BytesPerPage;
end
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_phy_arb_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_phy_arb_vseq.sv
index 184e425..268af64 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_phy_arb_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_phy_arb_vseq.sv
@@ -85,7 +85,7 @@
flash_op.op == flash_ctrl_pkg::FlashOpRead;
}
- if (flash_op.partition == FlashPartRedundancy) {
+ if (flash_op.partition == FlashPartInfo2) {
flash_op.op == flash_ctrl_pkg::FlashOpRead;
}
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_base_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_base_vseq.sv
index 4cc6452..3710677 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_base_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_base_vseq.sv
@@ -50,7 +50,7 @@
FlashPartData :/ cfg.seq_cfg.op_on_data_partition_pc,
FlashPartInfo :/ cfg.seq_cfg.op_on_info_partition_pc,
FlashPartInfo1 :/ cfg.seq_cfg.op_on_info1_partition_pc,
- FlashPartRedundancy :/ cfg.seq_cfg.op_on_redundancy_partition_pc
+ FlashPartInfo2 :/ cfg.seq_cfg.op_on_info2_partition_pc
};
// Bank erase is supported only for data & 1st info partitions