[dv, mem_bkdr_util] Address #6850 comments

This commit address 2 comments:
- Add enum that encompasses `prim_secded_e` and adds parity and none to
it, so that we can set the error detection scheme as a single enum var.
- Macrofy the repeated addr and data width checks

Signed-off-by: Srikrishna Iyer <sriyer@google.com>
diff --git a/hw/dv/sv/mem_bkdr_util/mem_bkdr_util.sv b/hw/dv/sv/mem_bkdr_util/mem_bkdr_util.sv
index 839d983..aba09ec 100644
--- a/hw/dv/sv/mem_bkdr_util/mem_bkdr_util.sv
+++ b/hw/dv/sv/mem_bkdr_util/mem_bkdr_util.sv
@@ -22,11 +22,12 @@
   // The width of the memory.
   protected uint32_t width;
 
-  // Indicates whether the memory implements parity protection per byte.
-  protected bit parity;
+  // Indicates the error detection scheme implemented for this memory.
+  protected err_detection_e err_detection_scheme = ErrDetectionNone;
 
-  // Indicates whether the memory implements ECC protection.
-  protected prim_secded_pkg::prim_secded_e ecc = prim_secded_pkg::SecdedNone;
+  // Convenience macro to check if ECC / parity is enabled.
+  `define HAS_ECC (!(err_detection_scheme inside {ErrDetectionNone, ParityEven, ParityOdd}))
+  `define HAS_PARITY (err_detection_scheme inside {ParityEven, ParityOdd})
 
   // TODO: Indicates whether the memory implements scrambling.
 
@@ -63,49 +64,47 @@
 
   // Initialize the class instance.
   function new(string name = "", string path, int unsigned depth,
-               longint unsigned n_bits, bit parity, prim_secded_pkg::prim_secded_e ecc);
+               longint unsigned n_bits, err_detection_e err_detection_scheme);
 
     bit res;
     super.new(name);
-    `DV_CHECK_FATAL(!(parity && (ecc != SecdedNone)), "Cannot enable both parity & ecc.")
     `DV_CHECK_FATAL(!(n_bits % depth), "n_bits must be divisible by depth.")
     res = uvm_hdl_check_path(path);
     `DV_CHECK_EQ_FATAL(res, 1, $sformatf("Hierarchical path %0s appears to be invalid.", path))
 
-    this.path   = path;
-    this.depth  = depth;
-    this.width  = n_bits / depth;
-    this.parity = parity;
-    this.ecc    = ecc;
-    data_width  = (ecc == prim_secded_pkg::SecdedNone) ? width :
-                                                         prim_secded_pkg::get_ecc_data_width(ecc);
-    byte_width      = parity ? 9 : 8;
-    bytes_per_word  = data_width / byte_width;
+    this.path  = path;
+    this.depth = depth;
+    this.width = n_bits / depth;
+    this.err_detection_scheme = err_detection_scheme;
+
+    data_width = `HAS_ECC ? prim_secded_pkg::get_ecc_data_width(
+        prim_secded_pkg::prim_secded_e'(err_detection_scheme)) : width;
+    byte_width = `HAS_PARITY ? 9 : 8;
+    bytes_per_word = data_width / byte_width;
     `DV_CHECK_LE_FATAL(bytes_per_word, 16, "data width > 16 bytes is not supported")
-    size_bytes      = depth * bytes_per_word;
-    addr_lsb        = $clog2(bytes_per_word);
-    addr_width      = $clog2(depth);
+    size_bytes = depth * bytes_per_word;
+    addr_lsb   = $clog2(bytes_per_word);
+    addr_width = $clog2(depth);
     byte_addr_width = addr_width + addr_lsb;
-    max_errors      = width;
+    max_errors = width;
     if (name == "") set_name({path, "::mem_bkdr_util"});
     `uvm_info(`gfn, this.convert2string(), UVM_MEDIUM)
   endfunction
 
   virtual function string convert2string();
     return {"\n",
-            $sformatf("path             = %0s\n", path),
-            $sformatf("depth            = %0d\n", depth),
-            $sformatf("width            = %0d\n", width),
-            $sformatf("parity           = %0b\n", parity),
-            $sformatf("ecc              = %0s\n", ecc.name),
-            $sformatf("data_width       = %0d\n", data_width),
-            $sformatf("byte_width       = %0d\n", byte_width),
-            $sformatf("bytes_per_word   = %0d\n", bytes_per_word),
-            $sformatf("size_bytes       = 0x%0h\n", size_bytes),
-            $sformatf("addr_lsb         = %0d\n", addr_lsb),
-            $sformatf("addr_width       = %0d\n", addr_width),
-            $sformatf("byte_addr_width  = %0d\n", byte_addr_width),
-            $sformatf("max_errors       = %0d\n", max_errors)};
+            $sformatf("path = %0s\n", path),
+            $sformatf("depth = %0d\n", depth),
+            $sformatf("width = %0d\n", width),
+            $sformatf("err_detection_scheme = %0s\n", err_detection_scheme.name),
+            $sformatf("data_width = %0d\n", data_width),
+            $sformatf("byte_width = %0d\n", byte_width),
+            $sformatf("bytes_per_word = %0d\n", bytes_per_word),
+            $sformatf("size_bytes = 0x%0h\n", size_bytes),
+            $sformatf("addr_lsb = %0d\n", addr_lsb),
+            $sformatf("addr_width = %0d\n", addr_width),
+            $sformatf("byte_addr_width = %0d\n", byte_addr_width),
+            $sformatf("max_errors = %0d\n", max_errors)};
   endfunction
 
   function string get_path();
@@ -120,12 +119,8 @@
     return width;
   endfunction
 
-  function bit get_parity();
-    return parity;
-  endfunction
-
-  function prim_secded_pkg::prim_secded_e get_ecc();
-    return ecc;
+  function err_detection_e get_err_detection_scheme();
+    return err_detection_scheme;
   endfunction
 
   function uint32_t get_data_width();
@@ -192,6 +187,11 @@
     return data;
   endfunction
 
+  // Convenience macro to check the addr and data width for each flavor of read and write functions.
+  `define _ADDR_DW_CHECKS(_ADDR, _DW) \
+    `DV_CHECK_GE_FATAL(data_width, _DW, $sformatf("data_width %0d is < ``_DW``!", data_width)) \
+    `DV_CHECK_EQ_FATAL(_ADDR % (_DW / 8), 0, $sformatf("addr 0x%0h not ``_DW``-bit aligned", _ADDR))
+
   // Read a single byte at specified address.
   //
   // The data returned does not include the parity bits.
@@ -202,26 +202,22 @@
   endfunction
 
   virtual function logic [15:0] read16(bit [bus_params_pkg::BUS_AW-1:0] addr);
-    `DV_CHECK_EQ_FATAL(addr[0], 0, $sformatf("addr 0x%0h not 16-bit aligned", addr))
-    `DV_CHECK_GE_FATAL(data_width, 16, $sformatf("data_width %0d is < 16!", data_width))
+    `_ADDR_DW_CHECKS(addr, 16)
     return {read8(addr + 1), read8(addr)};
   endfunction
 
   virtual function logic [31:0] read32(bit [bus_params_pkg::BUS_AW-1:0] addr);
-    `DV_CHECK_EQ_FATAL(addr[1:0], '0, $sformatf("addr 0x%0h not 32-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 32, $sformatf("data_width %0d is < 32!", data_width))
+    `_ADDR_DW_CHECKS(addr, 32)
     return {read16(addr + 2), read16(addr)};
   endfunction
 
   virtual function logic [63:0] read64(bit [bus_params_pkg::BUS_AW-1:0] addr);
-    `DV_CHECK_EQ_FATAL(addr[2:0], '0, $sformatf("addr 0x%0h not 64-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 64, $sformatf("data_width %0d is < 64!", data_width))
+    `_ADDR_DW_CHECKS(addr, 64)
     return {read32(addr + 4), read32(addr)};
   endfunction
 
   virtual function logic [127:0] read128(bit [bus_params_pkg::BUS_AW-1:0] addr);
-    `DV_CHECK_EQ_FATAL(addr[3:0], '0, $sformatf("addr 0x%0h not 128-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 128, $sformatf("data_width %0d is < 128!", data_width))
+    `_ADDR_DW_CHECKS(addr, 128)
     return {read64(addr + 8), read64(addr)};
   endfunction
 
@@ -258,8 +254,9 @@
     word_idx = addr >> addr_lsb;
     byte_idx = addr - (word_idx << addr_lsb);
 
-    if (parity) begin
-      bit [8:0] lane = {~(^data), data};
+    if (`HAS_PARITY) begin
+      bit parity = (err_detection_scheme == ParityOdd) ? ~(^data) : (^data);
+      bit [8:0] lane = {parity, data};
       if (inject_num_errors) begin
         lane ^= (1 << $urandom_range(0, byte_width - 1));
       end
@@ -269,28 +266,28 @@
     end
 
     rw_data[byte_idx * 8 +: 8] = data;
-    case (ecc)
-      prim_secded_pkg::SecdedNone: ;
-      prim_secded_pkg::Secded_22_16: begin
+    case (err_detection_scheme)
+      ErrDetectionNone: ;
+      Ecc_22_16: begin
         rw_data = prim_secded_pkg::prim_secded_22_16_enc(rw_data[15:0]);
       end
-      prim_secded_pkg::SecdedHamming_22_16: begin
+      EccHamming_22_16: begin
         rw_data = prim_secded_pkg::prim_secded_hamming_22_16_enc(rw_data[15:0]);
       end
-      prim_secded_pkg::Secded_39_32: begin
+      Ecc_39_32: begin
         rw_data = prim_secded_pkg::prim_secded_39_32_enc(rw_data[31:0]);
       end
-      prim_secded_pkg::SecdedHamming_39_32: begin
+      EccHamming_39_32: begin
         rw_data = prim_secded_pkg::prim_secded_hamming_39_32_enc(rw_data[31:0]);
       end
-      prim_secded_pkg::Secded_72_64: begin
+      Ecc_72_64: begin
         rw_data = prim_secded_pkg::prim_secded_72_64_enc(rw_data[63:0]);
       end
-      prim_secded_pkg::SecdedHamming_72_64: begin
+      EccHamming_72_64: begin
         rw_data = prim_secded_pkg::prim_secded_hamming_72_64_enc(rw_data[63:0]);
       end
       default: begin
-        `uvm_error(`gfn, $sformatf("ECC scheme %0s is unsupported.", ecc))
+        `uvm_error(`gfn, $sformatf("ECC scheme %0s is unsupported.", err_detection_scheme))
       end
     endcase
     if (inject_num_errors) rw_data = inject_errors(rw_data, inject_num_errors);
@@ -300,8 +297,7 @@
   virtual function void write16(bit [bus_params_pkg::BUS_AW-1:0] addr, logic [15:0] data,
                                 uint32_t inject_num_errors = 0);
     int_pair_t inject_num_errors_split;
-    `DV_CHECK_EQ_FATAL(addr[0], '0, $sformatf("addr 0x%0h not 16-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 16, $sformatf("data_width %0d is < 16!", data_width))
+    `_ADDR_DW_CHECKS(addr, 16)
     if (!check_addr_valid(addr)) return;
     // Split the number of errors into different sub-byte write.
     inject_num_errors_split = rand_split(inject_num_errors);
@@ -312,8 +308,7 @@
   virtual function void write32(bit [bus_params_pkg::BUS_AW-1:0] addr, logic [31:0] data,
                                 uint32_t inject_num_errors = 0);
     int_pair_t inject_num_errors_split;
-    `DV_CHECK_EQ_FATAL(addr[1:0], '0, $sformatf("addr 0x%0h not 32-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 32, $sformatf("data_width %0d is < 32!", data_width))
+    `_ADDR_DW_CHECKS(addr, 32)
     if (!check_addr_valid(addr)) return;
     // Split the number of errors into different sub-byte write.
     inject_num_errors_split = rand_split(inject_num_errors);
@@ -324,8 +319,7 @@
   virtual function void write64(bit [bus_params_pkg::BUS_AW-1:0] addr, logic [63:0] data,
                                 uint32_t inject_num_errors = 0);
     int_pair_t inject_num_errors_split;
-    `DV_CHECK_EQ_FATAL(addr[2:0], '0, $sformatf("addr 0x%0h not 64-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 64, $sformatf("data_width %0d is < 64!", data_width))
+    `_ADDR_DW_CHECKS(addr, 64)
     if (!check_addr_valid(addr)) return;
     // Split the number of errors into different sub-byte write.
     inject_num_errors_split = rand_split(inject_num_errors);
@@ -336,8 +330,7 @@
   virtual function void write128(bit [bus_params_pkg::BUS_AW-1:0] addr, logic [127:0] data,
                                  uint32_t inject_num_errors = 0);
     int_pair_t inject_num_errors_split;
-    `DV_CHECK_EQ_FATAL(addr[3:0], '0, $sformatf("addr 0x%0h not 128-bit aligned", addr), path)
-    `DV_CHECK_GE_FATAL(data_width, 128, $sformatf("data_width %0d is < 128!", data_width))
+    `_ADDR_DW_CHECKS(addr, 128)
     if (!check_addr_valid(addr)) return;
     // Split the number of errors into different sub-byte write.
     inject_num_errors_split = rand_split(inject_num_errors);
@@ -345,6 +338,8 @@
     write64(addr + 4, data[127:63], inject_num_errors_split.y);
   endfunction
 
+  `undef _ADDR_DW_CHECKS
+
   /////////////////////////////////////////////////////////
   // Wrapper functions for memory reads with ECC enabled //
   /////////////////////////////////////////////////////////
@@ -357,11 +352,11 @@
     uvm_hdl_data_t data;
     if (!check_addr_valid(addr)) return 'x;
     data = read(addr);
-    case (ecc)
-      prim_secded_pkg::Secded_22_16: begin
+    case (err_detection_scheme)
+      Ecc_22_16: begin
         return prim_secded_pkg::prim_secded_22_16_dec(data);
       end
-      prim_secded_pkg::SecdedHamming_22_16: begin
+      EccHamming_22_16: begin
         return prim_secded_pkg::prim_secded_hamming_22_16_dec(data);
       end
       default: return 'x;
@@ -373,11 +368,11 @@
     uvm_hdl_data_t data;
     if (!check_addr_valid(addr)) return 'x;
     data = read(addr);
-    case (ecc)
-      prim_secded_pkg::Secded_39_32: begin
+    case (err_detection_scheme)
+      Ecc_39_32: begin
         return prim_secded_pkg::prim_secded_39_32_dec(data);
       end
-      prim_secded_pkg::SecdedHamming_39_32: begin
+      EccHamming_39_32: begin
         return prim_secded_pkg::prim_secded_hamming_39_32_dec(data);
       end
       default: return 'x;
@@ -389,11 +384,11 @@
     uvm_hdl_data_t data;
     if (!check_addr_valid(addr)) return 'x;
     data = read(addr);
-    case (ecc)
-      prim_secded_pkg::Secded_72_64: begin
+    case (err_detection_scheme)
+      Ecc_72_64: begin
         return prim_secded_pkg::prim_secded_72_64_dec(data);
       end
-      prim_secded_pkg::SecdedHamming_72_64: begin
+      EccHamming_72_64: begin
         return prim_secded_pkg::prim_secded_hamming_72_64_dec(data);
       end
       default: return 'x;
@@ -875,6 +870,9 @@
     return data ^ err_mask;
   endfunction
 
+  `undef HAS_ECC
+  `undef HAS_PARITY
+
 endclass
 
 // Convenience macro to enable file operations on the memory.
diff --git a/hw/dv/sv/mem_bkdr_util/mem_bkdr_util_pkg.sv b/hw/dv/sv/mem_bkdr_util/mem_bkdr_util_pkg.sv
index 9a96680..cce7562 100644
--- a/hw/dv/sv/mem_bkdr_util/mem_bkdr_util_pkg.sv
+++ b/hw/dv/sv/mem_bkdr_util/mem_bkdr_util_pkg.sv
@@ -10,11 +10,20 @@
   import sram_scrambler_pkg::*;
   import uvm_pkg::*;
 
-  typedef enum {
-    MemParityNone,
-    MemParityOdd,
-    MemParityEven
-  } mem_parity_e;
+  // Represents the various forms of error detection / correction supported.
+  typedef enum int {
+    ErrDetectionNone = prim_secded_pkg::SecdedNone,
+    Ecc_22_16        = prim_secded_pkg::Secded_22_16,
+    Ecc_28_22        = prim_secded_pkg::Secded_28_22,
+    Ecc_39_32        = prim_secded_pkg::Secded_39_32,
+    Ecc_64_57        = prim_secded_pkg::Secded_64_57,
+    Ecc_72_64        = prim_secded_pkg::Secded_72_64,
+    EccHamming_22_16 = prim_secded_pkg::SecdedHamming_22_16,
+    EccHamming_39_32 = prim_secded_pkg::SecdedHamming_39_32,
+    EccHamming_72_64 = prim_secded_pkg::SecdedHamming_72_64,
+    ParityEven,
+    ParityOdd
+  } err_detection_e;
 
   // macro includes
   `include "uvm_macros.svh"
diff --git a/hw/ip/flash_ctrl/dv/tb/tb.sv b/hw/ip/flash_ctrl/dv/tb/tb.sv
index d9192da..cf7589c 100644
--- a/hw/ip/flash_ctrl/dv/tb/tb.sv
+++ b/hw/ip/flash_ctrl/dv/tb/tb.sv
@@ -137,8 +137,7 @@
                               .path  (`FLASH_DATA_MEM_HIER_STR(i)),
                               .depth ($size(`FLASH_DATA_MEM_HIER(i))),
                               .n_bits($bits(`FLASH_DATA_MEM_HIER(i))),
-                              .parity(1'b0),
-                              .ecc   (prim_secded_pkg::SecdedNone));
+                              .err_detection_scheme(mem_bkdr_util_pkg::ErrDetectionNone));
         uvm_config_db#(mem_bkdr_util)::set(null, "*.env", m_mem_bkdr_util.get_name(),
                                            m_mem_bkdr_util);
         part = part.next();
@@ -151,8 +150,7 @@
                                 .path  (`FLASH_INFO_MEM_HIER_STR(i, j)),
                                 .depth ($size(`FLASH_INFO_MEM_HIER(i, j))),
                                 .n_bits($bits(`FLASH_INFO_MEM_HIER(i, j))),
-                                .parity(1'b0),
-                                .ecc   (prim_secded_pkg::SecdedNone));
+                                .err_detection_scheme(mem_bkdr_util_pkg::ErrDetectionNone));
           uvm_config_db#(mem_bkdr_util)::set(null, "*.env", m_mem_bkdr_util.get_name(),
                                              m_mem_bkdr_util);
           part = part.next();
diff --git a/hw/ip/otp_ctrl/dv/tb.sv b/hw/ip/otp_ctrl/dv/tb.sv
index c6fc60c..4612302 100644
--- a/hw/ip/otp_ctrl/dv/tb.sv
+++ b/hw/ip/otp_ctrl/dv/tb.sv
@@ -153,8 +153,7 @@
                           .path  (`DV_STRINGIFY(`OTP_CTRL_MEM_HIER)),
                           .depth ($size(`OTP_CTRL_MEM_HIER)),
                           .n_bits($bits(`OTP_CTRL_MEM_HIER)),
-                          .parity(1'b0),
-                          .ecc   (prim_secded_pkg::SecdedHamming_22_16));
+                          .err_detection_scheme(mem_bkdr_util_pkg::EccHamming_22_16));
 
     // These SVA checks the lc_escalate_en is either Off or On, we will use more than these
     // 2 values.
diff --git a/hw/ip/rom_ctrl/dv/tb.sv b/hw/ip/rom_ctrl/dv/tb.sv
index 0be5183..febf05e 100644
--- a/hw/ip/rom_ctrl/dv/tb.sv
+++ b/hw/ip/rom_ctrl/dv/tb.sv
@@ -72,8 +72,7 @@
                           .path  (`DV_STRINGIFY(`ROM_CTRL_MEM_HIER)),
                           .depth ($size(`ROM_CTRL_MEM_HIER)),
                           .n_bits($bits(`ROM_CTRL_MEM_HIER)),
-                          .parity(1'b0),
-                          .ecc   (prim_secded_pkg::Secded_39_32));
+                          .err_detection_scheme(mem_bkdr_util_pkg::Ecc_39_32));
 
     // drive clk and rst_n from clk_if
     clk_rst_if.set_active();
diff --git a/hw/ip/sram_ctrl/dv/tb.sv b/hw/ip/sram_ctrl/dv/tb.sv
index 1687ce0..5d8b761 100644
--- a/hw/ip/sram_ctrl/dv/tb.sv
+++ b/hw/ip/sram_ctrl/dv/tb.sv
@@ -117,8 +117,7 @@
                           .path  (`DV_STRINGIFY(`SRAM_CTRL_MEM_HIER)),
                           .depth ($size(`SRAM_CTRL_MEM_HIER)),
                           .n_bits($bits(`SRAM_CTRL_MEM_HIER)),
-                          .parity(1'b1),
-                          .ecc   (prim_secded_pkg::SecdedNone));
+                          .err_detection_scheme(mem_bkdr_util_pkg::ParityOdd));
 
     // drive clk and rst_n from clk_if
     clk_rst_if.set_active();
diff --git a/hw/top_earlgrey/dv/tb/tb.sv b/hw/top_earlgrey/dv/tb/tb.sv
index 22b45da..3122139 100644
--- a/hw/top_earlgrey/dv/tb/tb.sv
+++ b/hw/top_earlgrey/dv/tb/tb.sv
@@ -285,68 +285,64 @@
     initial begin
       mem_bkdr_util m_mem_bkdr_util[chip_mem_e];
 
-      m_mem_bkdr_util[FlashBank0Data] = new(.name  ("mem_bkdr_util[FlashBank0Data]"),
-                                            .path  (`DV_STRINGIFY(`FLASH0_DATA_MEM_HIER)),
-                                            .depth ($size(`FLASH0_DATA_MEM_HIER)),
-                                            .n_bits($bits(`FLASH0_DATA_MEM_HIER)),
-                                            .parity(1'b0),
-                                            .ecc   (prim_secded_pkg::SecdedNone));
+      m_mem_bkdr_util[FlashBank0Data] = new(
+          .name  ("mem_bkdr_util[FlashBank0Data]"),
+          .path  (`DV_STRINGIFY(`FLASH0_DATA_MEM_HIER)),
+          .depth ($size(`FLASH0_DATA_MEM_HIER)),
+          .n_bits($bits(`FLASH0_DATA_MEM_HIER)),
+          .err_detection_scheme(mem_bkdr_util_pkg::ErrDetectionNone));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[FlashBank0Data], `FLASH0_DATA_MEM_HIER)
 
-      m_mem_bkdr_util[FlashBank0Info] = new(.name  ("mem_bkdr_util[FlashBank0Info]"),
-                                            .path  (`DV_STRINGIFY(`FLASH0_INFO_MEM_HIER)),
-                                            .depth ($size(`FLASH0_INFO_MEM_HIER)),
-                                            .n_bits($bits(`FLASH0_INFO_MEM_HIER)),
-                                            .parity(1'b0),
-                                            .ecc   (prim_secded_pkg::SecdedNone));
+      m_mem_bkdr_util[FlashBank0Info] = new(
+          .name  ("mem_bkdr_util[FlashBank0Info]"),
+          .path  (`DV_STRINGIFY(`FLASH0_INFO_MEM_HIER)),
+          .depth ($size(`FLASH0_INFO_MEM_HIER)),
+          .n_bits($bits(`FLASH0_INFO_MEM_HIER)),
+          .err_detection_scheme(mem_bkdr_util_pkg::ErrDetectionNone));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[FlashBank0Info], `FLASH0_INFO_MEM_HIER)
 
-      m_mem_bkdr_util[FlashBank1Data] = new(.name  ("mem_bkdr_util[FlashBank1Data]"),
-                                            .path  (`DV_STRINGIFY(`FLASH1_DATA_MEM_HIER)),
-                                            .depth ($size(`FLASH1_DATA_MEM_HIER)),
-                                            .n_bits($bits(`FLASH1_DATA_MEM_HIER)),
-                                            .parity(1'b0),
-                                            .ecc   (prim_secded_pkg::SecdedNone));
+      m_mem_bkdr_util[FlashBank1Data] = new(
+          .name  ("mem_bkdr_util[FlashBank1Data]"),
+          .path  (`DV_STRINGIFY(`FLASH1_DATA_MEM_HIER)),
+          .depth ($size(`FLASH1_DATA_MEM_HIER)),
+          .n_bits($bits(`FLASH1_DATA_MEM_HIER)),
+          .err_detection_scheme(mem_bkdr_util_pkg::ErrDetectionNone));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[FlashBank1Data], `FLASH0_DATA_MEM_HIER)
 
-      m_mem_bkdr_util[FlashBank1Info] = new(.name  ("mem_bkdr_util[FlashBank1Info]"),
-                                            .path  (`DV_STRINGIFY(`FLASH1_INFO_MEM_HIER)),
-                                            .depth ($size(`FLASH1_INFO_MEM_HIER)),
-                                            .n_bits($bits(`FLASH1_INFO_MEM_HIER)),
-                                            .parity(1'b0),
-                                            .ecc   (prim_secded_pkg::SecdedNone));
+      m_mem_bkdr_util[FlashBank1Info] = new(
+          .name  ("mem_bkdr_util[FlashBank1Info]"),
+          .path  (`DV_STRINGIFY(`FLASH1_INFO_MEM_HIER)),
+          .depth ($size(`FLASH1_INFO_MEM_HIER)),
+          .n_bits($bits(`FLASH1_INFO_MEM_HIER)),
+          .err_detection_scheme(mem_bkdr_util_pkg::ErrDetectionNone));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[FlashBank1Info], `FLASH1_INFO_MEM_HIER)
 
       m_mem_bkdr_util[Otp] = new(.name  ("mem_bkdr_util[Otp]"),
                                  .path  (`DV_STRINGIFY(`OTP_MEM_HIER)),
                                  .depth ($size(`OTP_MEM_HIER)),
                                  .n_bits($bits(`OTP_MEM_HIER)),
-                                 .parity(1'b0),
-                                 .ecc   (prim_secded_pkg::SecdedHamming_22_16));
+                                 .err_detection_scheme(mem_bkdr_util_pkg::EccHamming_22_16));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[Otp], `OTP_MEM_HIER)
 
       m_mem_bkdr_util[RamMain] = new(.name  ("mem_bkdr_util[RamMain]"),
                                      .path  (`DV_STRINGIFY(`RAM_MAIN_MEM_HIER)),
                                      .depth ($size(`RAM_MAIN_MEM_HIER)),
                                      .n_bits($bits(`RAM_MAIN_MEM_HIER)),
-                                     .parity(1'b1),
-                                     .ecc   (prim_secded_pkg::SecdedNone));
+                                     .err_detection_scheme(mem_bkdr_util_pkg::ParityOdd));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[RamMain], `RAM_MAIN_MEM_HIER)
 
       m_mem_bkdr_util[RamRet] = new(.name  ("mem_bkdr_util[RamRet]"),
                                     .path  (`DV_STRINGIFY(`RAM_RET_MEM_HIER)),
                                     .depth ($size(`RAM_RET_MEM_HIER)),
                                     .n_bits($bits(`RAM_RET_MEM_HIER)),
-                                    .parity(1'b0),
-                                    .ecc   (prim_secded_pkg::SecdedNone));
+                                    .err_detection_scheme(mem_bkdr_util_pkg::ParityOdd));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[RamRet], `RAM_RET_MEM_HIER)
 
       m_mem_bkdr_util[Rom] = new(.name  ("mem_bkdr_util[Rom]"),
                                  .path  (`DV_STRINGIFY(`ROM_MEM_HIER)),
                                  .depth ($size(`ROM_MEM_HIER)),
                                  .n_bits($bits(`ROM_MEM_HIER)),
-                                 .parity(1'b0),
-                                 .ecc   (prim_secded_pkg::Secded_39_32));
+                                 .err_detection_scheme(mem_bkdr_util_pkg::Ecc_39_32));
       `MEM_BKDR_UTIL_FILE_OP(m_mem_bkdr_util[Rom], `ROM_MEM_HIER)
 
       for (chip_mem_e mem = mem.first(), int i = 0; i < mem.num(); mem = mem.next(), i++) begin