[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