[flash_ctrl dv] Connect opt_t interface

This sets a default value to the OTP interface to flash. In future, it
will be replaced with an actual interface.

Signed-off-by: Srikrishna Iyer <sriyer@google.com>
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 5889d00..c4b41d0 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
@@ -41,6 +41,7 @@
   uint op_on_data_partition_pc = 100;
   uint op_erase_type_bank_pc = 0;
   uint op_max_words = 512;
+  bit  op_allow_invalid = 1'b0;
 
   // Poll fifo status before writing to prog_fifo / reading from rd_fifo.
   uint poll_fifo_status_pc = 30;
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 cccb523..0969958 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
@@ -268,34 +268,33 @@
   // Ensure that the flash page / bank has indeed been erased.
   virtual function void flash_mem_bkdr_erase_check(flash_op_t flash_op);
     flash_mem_addr_attrs    addr_attrs = new(flash_op.addr);
-    bit [TL_AW-1:0]         start_addr;
+    bit [TL_AW-1:0]         erase_check_addr;
     uint                    num_words;
 
     case (flash_op.erase_type)
       flash_ctrl_pkg::FlashErasePage: begin
-        start_addr = addr_attrs.page_start_addr;
+        erase_check_addr = addr_attrs.page_start_addr;
         num_words = FlashNumBusWordsPerPage;
       end
       flash_ctrl_pkg::FlashEraseBank: begin
         // TODO: check if bank erase was supported
-        start_addr = addr_attrs.bank_start_addr;
+        erase_check_addr = addr_attrs.bank_start_addr;
         num_words = FlashNumBusWordsPerBank;
       end
       default: begin
         `uvm_fatal(`gfn, $sformatf("Invalid erase_type: %0s", flash_op.erase_type.name()))
       end
     endcase
-    `uvm_info(`gfn, $sformatf("{%s}: start_addr = 0x%0h, num_words = %0d",
-                              addr_attrs.sprint(), start_addr, num_words), UVM_MEDIUM)
+    `uvm_info(`gfn, $sformatf("flash_mem_bkdr_erase_check: addr = 0x%0h, num_words = %0d",
+                              erase_check_addr, num_words), UVM_MEDIUM)
 
     for (int i = 0; i < num_words; i++) begin
       logic [TL_DW-1:0] data;
-      addr_attrs.incr(TL_DBW);
-      data = cfg.mem_bkdr_vifs[flash_op.partition][addr_attrs.bank].read32(
-          addr_attrs.bank_addr);
-      `uvm_info(`gfn, $sformatf("flash_mem_bkdr_erase_check: {%s} = 0x%0h",
-                                addr_attrs.sprint(), data), UVM_MEDIUM)
+      data = cfg.mem_bkdr_vifs[flash_op.partition][addr_attrs.bank].read32(erase_check_addr);
+      `uvm_info(`gfn, $sformatf("flash_mem_bkdr_erase_check: bank: %0d, addr: 0x%0h, data: 0x%0h",
+                                addr_attrs.bank, erase_check_addr, data), UVM_MEDIUM)
       `DV_CHECK_CASE_EQ(data, '1)
+      erase_check_addr += TL_DBW;
     end
   endfunction
 
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_vseq.sv
index 374da5a..5660ecf 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rand_ops_vseq.sv
@@ -20,8 +20,15 @@
   rand flash_op_t flash_op;
 
   constraint flash_op_c {
+    solve flash_op.op before flash_op.erase_type;
+    solve flash_op.op before flash_op.num_words;
+
     flash_op.addr inside {[0:FlashSizeBytes-1]};
 
+    if (!cfg.seq_cfg.op_allow_invalid) {
+      flash_op.op != flash_ctrl_pkg::FlashOpInvalid;
+    }
+
     (flash_op.op == flash_ctrl_pkg::FlashOpErase) ->
         flash_op.erase_type dist {
           flash_ctrl_pkg::FlashErasePage :/ (100 - cfg.seq_cfg.op_erase_type_bank_pc),
@@ -217,7 +224,7 @@
         `DV_CHECK_MEMBER_RANDOMIZE_FATAL(flash_op_data)
 
         `uvm_info(`gfn, $sformatf("Starting flash_ctrl op: %0d/%0d: %p",
-                                  j, num_flash_ops_per_cfg, flash_op), UVM_MEDIUM)
+                                  j, num_flash_ops_per_cfg, flash_op), UVM_LOW)
 
         // Bkdr initialize the flash mem based on op.
         flash_ctrl_prep_mem(flash_op);
diff --git a/hw/ip/flash_ctrl/dv/tb/flash_ctrl_wrapper.sv b/hw/ip/flash_ctrl/dv/tb/flash_ctrl_wrapper.sv
index 4de8e1d..6469f7d 100644
--- a/hw/ip/flash_ctrl/dv/tb/flash_ctrl_wrapper.sv
+++ b/hw/ip/flash_ctrl/dv/tb/flash_ctrl_wrapper.sv
@@ -14,6 +14,9 @@
   input        tlul_pkg::tl_h2d_t eflash_tl_i,
   output       tlul_pkg::tl_d2h_t eflash_tl_o,
 
+  // OTP interface
+  input        flash_ctrl_pkg::otp_flash_t otp_i,
+
   // Interrupts
   output logic intr_prog_empty_o, // Program fifo is empty
   output logic intr_prog_lvl_o,   // Program fifo is empty
@@ -42,6 +45,7 @@
     // Inter-module signals
     .flash_o  (flash_ctrl_flash_req),
     .flash_i  (flash_ctrl_flash_rsp),
+    .otp_i    (otp_i),
 
     .clk_i    (clk_i),
     .rst_ni   (rst_ni)
diff --git a/hw/ip/flash_ctrl/dv/tb/tb.sv b/hw/ip/flash_ctrl/dv/tb/tb.sv
index 0cf6ea8..c6caa7c 100644
--- a/hw/ip/flash_ctrl/dv/tb/tb.sv
+++ b/hw/ip/flash_ctrl/dv/tb/tb.sv
@@ -34,21 +34,24 @@
 
   // dut
   flash_ctrl_wrapper dut (
-    .clk_i                (clk        ),
-    .rst_ni               (rst_n      ),
+    .clk_i              (clk      ),
+    .rst_ni             (rst_n    ),
 
-    .flash_ctrl_tl_i      (tl_if.h2d  ),
-    .flash_ctrl_tl_o      (tl_if.d2h  ),
+    .flash_ctrl_tl_i    (tl_if.h2d),
+    .flash_ctrl_tl_o    (tl_if.d2h),
 
-    .eflash_tl_i          (eflash_tl_if.h2d),
-    .eflash_tl_o          (eflash_tl_if.d2h),
+    .eflash_tl_i        (eflash_tl_if.h2d),
+    .eflash_tl_o        (eflash_tl_if.d2h),
 
-    .intr_prog_empty_o (intr_prog_empty ),
-    .intr_prog_lvl_o   (intr_prog_lvl   ),
-    .intr_rd_full_o    (intr_rd_full    ),
-    .intr_rd_lvl_o     (intr_rd_lvl     ),
-    .intr_op_done_o    (intr_op_done    ),
-    .intr_op_error_o   (intr_op_error   )
+    // TODO: create and hook this up to an interface.
+    .otp_i              (flash_ctrl_pkg::OTP_FLASH_DEFAULT),
+
+    .intr_prog_empty_o  (intr_prog_empty),
+    .intr_prog_lvl_o    (intr_prog_lvl  ),
+    .intr_rd_full_o     (intr_rd_full   ),
+    .intr_rd_lvl_o      (intr_rd_lvl    ),
+    .intr_op_done_o     (intr_op_done   ),
+    .intr_op_error_o    (intr_op_error  )
   );
 
   // bind mem_bkdr_if