[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