[flash_ctrl/dv] Ordering data types and some CS model related updates
Signed-off-by: Eitan Shapira <eitanshapira89@gmail.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 ccb9b14..e6c6554 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
@@ -37,10 +37,10 @@
bit bank_erase_enable = 1;
// 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};
+ data_model_t scb_flash_data = '{default: 1};
+ data_model_t scb_flash_info = '{default: 1};
+ data_model_t scb_flash_info1 = '{default: 1};
+ data_model_t scb_flash_info2 = '{default: 1};
// Max delay for alerts in clocks
uint alert_max_delay;
@@ -56,7 +56,7 @@
string flash_ral_name = "flash_ctrl_eflash_reg_block";
- virtual function void initialize(bit [TL_AW-1:0] csr_base_addr = '1);
+ virtual function void initialize(addr_t csr_base_addr = '1);
list_of_alerts = flash_ctrl_env_pkg::LIST_OF_ALERTS;
has_shadowed_regs = 1;
tl_intg_alert_name = "fatal_std_err";
@@ -89,6 +89,17 @@
`uvm_info(`gfn, $sformatf("ral_model_names: %0p", ral_model_names), UVM_LOW)
endfunction : initialize
+ // For a given partition returns its size in bytes in each of the banks.
+ function uint get_partition_words_num(flash_dv_part_e part);
+ case(part)
+ FlashPartData: return BytesPerBank / 4;
+ FlashPartInfo: return InfoTypeBytes[0] / 4;
+ FlashPartInfo1: return InfoTypeBytes[1] / 4;
+ FlashPartInfo2: return InfoTypeBytes[2] / 4;
+ default: `uvm_error(`gfn, $sformatf("Undefined partition - %s", part.name()))
+ endcase
+ endfunction : get_partition_words_num
+
// Backdoor initialize flash memory elements.
//
// Applies the initialization scheme to the given flash partition in all banks.
@@ -109,6 +120,9 @@
FlashMemInitInvalidate: begin
foreach (mem_bkdr_util_h[part][i]) mem_bkdr_util_h[part][i].invalidate_mem();
end
+ default: begin
+ `uvm_error(`gfn, $sformatf("Undefined initialization scheme - %s", scheme.name()))
+ end
endcase
endfunction : flash_mem_bkdr_init
@@ -118,16 +132,15 @@
// TODO: add support for partition.
virtual function void flash_mem_bkdr_read(flash_op_t flash_op, ref data_q_t data);
flash_mem_addr_attrs addr_attrs = new(flash_op.addr);
- bit [TL_AW-1:0] read_addr;
if (flash_op.op == flash_ctrl_pkg::FlashOpErase) begin
case (flash_op.erase_type)
flash_ctrl_pkg::FlashErasePage: begin
- read_addr = addr_attrs.page_start_addr;
+ addr_attrs.set_attrs(addr_attrs.page_start_addr);
flash_op.num_words = FlashNumBusWordsPerPage;
end
flash_ctrl_pkg::FlashEraseBank: begin
- read_addr = 0;
+ addr_attrs.set_attrs(addr_attrs.bank * BytesPerBank);
case (flash_op.partition)
FlashPartData: begin
flash_op.num_words = FlashNumBusWordsPerBank;
@@ -152,20 +165,18 @@
`uvm_fatal(`gfn, $sformatf("Invalid erase_type: %0s", flash_op.erase_type.name()))
end
endcase
- end else begin // FlashOpProgram, FlashOpRead
- read_addr = addr_attrs.bank_addr;
end
data.delete();
for (int i = 0; i < flash_op.num_words; i++) begin
- data[i] = mem_bkdr_util_h[flash_op.partition][addr_attrs.bank].read32(read_addr);
+ data[i] = mem_bkdr_util_h[flash_op.partition][addr_attrs.bank].read32(addr_attrs.bank_addr);
`uvm_info(`gfn, $sformatf(
"flash_mem_bkdr_read: partition = %s , {%s} = 0x%0h",
flash_op.partition.name(),
addr_attrs.sprint(),
data[i]
), UVM_MEDIUM)
- read_addr += TL_DBW;
+ addr_attrs.incr(TL_DBW);
end
endfunction : flash_mem_bkdr_read
@@ -177,7 +188,7 @@
virtual function void flash_mem_bkdr_write(flash_op_t flash_op, flash_mem_init_e scheme,
data_q_t data = {});
flash_mem_addr_attrs addr_attrs = new(flash_op.addr);
- logic [TL_DW-1:0] wr_data;
+ data_4s_t wr_data;
// Randomize the lower half-word (if Xs) if the first half-word written in the below loop is
// corresponding upper half-word.
@@ -202,7 +213,7 @@
endcase
for (int i = 0; i < flash_op.num_words; i++) begin
- logic [TL_DW-1:0] loc_data = (scheme == FlashMemInitCustom) ? data[i] :
+ data_4s_t loc_data = (scheme == FlashMemInitCustom) ? data[i] :
(scheme == FlashMemInitRandomize) ? $urandom() : wr_data;
_flash_full_write(flash_op.partition, addr_attrs.bank, addr_attrs.bank_addr, loc_data);
@@ -227,17 +238,14 @@
//
function void _flash_full_write(flash_dv_part_e partition, uint bank,
// bus word aligned address
- bit [TL_AW-1:0] addr,
- bit [TL_DW-1:0] wr_data);
+ addr_t addr,
+ data_t wr_data);
// read back the full flash word
logic [flash_ctrl_pkg::DataWidth-1:0] data;
logic [7:0] intg_data;
logic is_upper = addr[flash_ctrl_pkg::DataByteWidth-1];
- logic [TL_AW-1:0] aligned_addr = addr;
-
- // update memory in the scoreboard
- write_data_all_part(partition, {bank,addr}, wr_data);
+ addr_t aligned_addr = addr;
if (is_upper) begin
aligned_addr = {addr[TL_AW-1:FlashDataByteWidth], {FlashDataByteWidth{1'b0}}};
@@ -259,7 +267,13 @@
// program fully via backdoor
mem_bkdr_util_h[partition][bank].write64(aligned_addr, {intg_data[3:0], data});
- endfunction
+ // Update scoreboard memory model with this back-door write
+ if (scb_check) begin
+ write_data_all_part(.part(partition), .addr({bank, addr[FlashMemAddrPageMsbBit:0]}),
+ .is_front_door(1'b0), .data(wr_data));
+ end
+
+ endfunction : _flash_full_write
// Helper function that randomizes the half-word at the given address if unknown.
@@ -269,8 +283,8 @@
// unknown. This is needed because the flash_ctrl RTL internally fetches full words. This method
// randomizes the data at the given address via backdoor.
function void _randomize_uninitialized_half_word(flash_dv_part_e partition, uint bank,
- bit [TL_AW-1:0] addr);
- logic [TL_DW-1:0] data = mem_bkdr_util_h[partition][bank].read32(addr);
+ addr_t addr);
+ data_4s_t data = mem_bkdr_util_h[partition][bank].read32(addr);
if ($isunknown(data)) begin
`DV_CHECK_STD_RANDOMIZE_FATAL(data)
`uvm_info(`gfn, $sformatf("Data at 0x%0h is Xs, writing random 0x%0h", addr, data), UVM_HIGH)
@@ -346,7 +360,7 @@
), UVM_MEDIUM)
for (int i = 0; i < num_words; i++) begin
- logic [TL_DW-1:0] data;
+ data_4s_t data;
data = mem_bkdr_util_h[flash_op.partition][addr_attrs.bank].read32(erase_check_addr);
`uvm_info(`gfn, $sformatf(
{
@@ -378,10 +392,15 @@
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("WR SCB MEM part: %0s addr:%0h data:0x%0h", part.name, addr, data),
- UVM_HIGH)
+ // Writing data to the scoreboard memory model, this writes one word of data to the selected
+ // address in the selected partition.
+ // is_front_door added to indicate if this method called by front-door
+ // write (program transaction), which is the default, or by back-door methods.
+ // This is required for extending env.
+ virtual function void write_data_all_part(flash_dv_part_e part, addr_t addr,
+ bit is_front_door = 1'b1, ref data_t 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;
@@ -401,10 +420,10 @@
// Task for set scb memory
virtual function set_scb_mem(int bkd_num_words, flash_dv_part_e bkd_partition,
- bit [TL_AW-1:0] write_bkd_addr,flash_scb_wr_e val_type,
+ addr_t write_bkd_addr,flash_scb_wr_e val_type,
data_b_t custom_val = {});
- bit [TL_AW-1:0] wr_bkd_addr;
- bit [TL_DW-1:0] wr_value;
+ addr_t wr_bkd_addr;
+ data_t wr_value;
`uvm_info(`gfn, $sformatf(
"SET SCB MEM TEST part: %0s addr:%0h data:0x%0h num: %0d",
@@ -435,7 +454,8 @@
wr_value,
bkd_num_words
), UVM_HIGH)
- write_data_all_part(bkd_partition, wr_bkd_addr, wr_value);
+ write_data_all_part(.part(bkd_partition), .addr(wr_bkd_addr), .is_front_door(1'b0),
+ .data(wr_value));
wr_bkd_addr = wr_bkd_addr + 4;
end
endfunction : set_scb_mem
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 4dec2bc..cd66bd0 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
@@ -182,19 +182,28 @@
mubi4_t he_en; // enable high endurance
} flash_bank_mp_info_page_cfg_t;
+ // 2-states flash data type
+ typedef bit [TL_DW-1:0] data_t;
+ // 4-states flash data type
+ typedef logic [TL_DW-1:0] data_4s_t;
+ // flash address type
+ typedef bit [TL_AW-1:0] addr_t;
+ // Queue of 4-states data words
+ typedef data_4s_t data_q_t[$];
+ // Queue of 2-states data words
+ typedef data_t data_b_t[$];
+ // Array of 2-states data words indexed with flash addresses.
+ // Useful for the flash model.
+ typedef data_t data_model_t[addr_t];
+
typedef struct packed {
flash_dv_part_e partition; // data or one of the info partitions
flash_erase_e erase_type; // erase page or the whole bank
flash_op_e op; // read / program or erase
uint num_words; // number of words to read or program (TL_DW)
- bit [TL_AW-1:0] addr; // starting addr for the op
+ addr_t addr; // starting addr for the op
} flash_op_t;
- // Data queue for flash transactions
- typedef logic [TL_DW-1:0] data_q_t[$];
- typedef bit [TL_DW-1:0] data_b_t[$];
- typedef bit [TL_DW-1:0] data_t;
- typedef bit [TL_AW-1:0] addr_t;
parameter uint ALL_ZEROS = 32'h0000_0000;
parameter uint ALL_ONES = 32'hffff_ffff;
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 b87ca21..02e24e0 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
@@ -40,7 +40,7 @@
uvm_tlm_analysis_fifo #(tl_seq_item) eflash_tl_d_chan_fifo;
// utility function to word-align an input TL address
- function bit [TL_AW-1:0] word_align_addr(bit [TL_AW-1:0] addr);
+ function addr_t word_align_addr(addr_t addr);
return {addr[TL_AW-1:2], 2'b00};
endfunction
@@ -172,7 +172,7 @@
write_allowed(part, wr_addr);
`uvm_info(`gfn, $sformatf("wr_access: 0x%0b wr_addr: 0x%0h", wr_access, wr_addr), UVM_LOW)
if (wr_access) begin
- cfg.write_data_all_part(part, wr_addr, item.a_data);
+ cfg.write_data_all_part(.part(part), .addr(wr_addr), .data(item.a_data));
end
if (idx_wr == num_wr) begin
idx_wr = 0;
@@ -348,8 +348,8 @@
end
endfunction
- virtual function void check_rd_data(flash_dv_part_e part, bit [TL_AW-1:0] addr,
- ref bit [TL_DW-1:0] data);
+ virtual function void check_rd_data(flash_dv_part_e part, addr_t addr,
+ ref data_t data);
case (part)
FlashPartData: begin
check_rd_part(cfg.scb_flash_data, addr, data);
@@ -367,7 +367,7 @@
endcase
endfunction
- virtual function void erase_data(flash_dv_part_e part, bit [TL_AW-1:0] addr, bit sel);
+ virtual function void erase_data(flash_dv_part_e part, addr_t addr, bit sel);
case (part)
FlashPartData: begin
erase_page_bank(NUM_BK_DATA_WORDS, addr, sel, cfg.scb_flash_data);
@@ -397,7 +397,7 @@
endfunction
- virtual task write_allowed(ref flash_dv_part_e part, ref bit [TL_AW-1:0] in_addr);
+ virtual task write_allowed(ref flash_dv_part_e part, ref addr_t in_addr);
bit en;
bit prog_en;
bit prog_en_def;
@@ -458,7 +458,7 @@
endcase
endtask
- virtual task read_allowed(ref flash_dv_part_e part, ref bit [TL_AW-1:0] in_rd_addr);
+ virtual task read_allowed(ref flash_dv_part_e part, ref addr_t in_rd_addr);
bit en;
bit read_en;
bit read_en_def;
@@ -519,7 +519,7 @@
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);
+ ref addr_t in_erase_addr, bit [1:0] bk_en);
bit en;
bit erase_en;
bit erase_en_def;
@@ -584,8 +584,8 @@
end
endtask
- virtual function void check_rd_part(const ref data_t exp_data_part[addr_t],
- bit [TL_AW-1:0] addr, ref bit [TL_DW-1:0] data);
+ virtual function void check_rd_part(const ref data_model_t exp_data_part,
+ addr_t addr, ref data_t data);
if (exp_data_part.exists(addr)) begin
`uvm_info(
`gfn, $sformatf(
@@ -648,8 +648,8 @@
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]);
+ virtual function void erase_page_bank(int num_bk_words, addr_t addr, bit sel,
+ ref data_model_t exp_part);
int num_wr;
if (sel) begin // bank sel
num_wr = num_bk_words;
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 e0d13d7..a651ac1 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
@@ -36,12 +36,6 @@
uint mp_region_he_en_pc;
uint mp_region_max_pages;
- // 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};
-
// Knob to control bank level erasability.
uint bank_erase_en_pc;
@@ -87,7 +81,7 @@
// Chances to start flash with all 1s and not with random values (default is 30%).
uint flash_init_set_pc;
- // Set by a higher level vseq that invokes this vseq
+ // Set by a higher level vseq that invokes this vseq.
bit external_cfg;
// If pre-transaction back-door memory preperation isn't needed, set do_tran_prep_mem to 0.
diff --git a/hw/ip/flash_ctrl/dv/env/flash_mem_addr_attrs.sv b/hw/ip/flash_ctrl/dv/env/flash_mem_addr_attrs.sv
index 503b7cc..385e961 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_mem_addr_attrs.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_mem_addr_attrs.sv
@@ -5,25 +5,25 @@
// Provides abstraction for mapping a flash memory address in flash organization.
class flash_mem_addr_attrs;
- bit [TL_AW-1:0] addr; // Input addr, bus-word aligned.
- bit [TL_AW-1:0] bank_addr; // Addr within the bank, bus-word aligned.
- bit [TL_AW-1:0] word_addr; // Addr within the bank, flash word aligned.
+ addr_t addr; // Input addr, bus-word aligned.
+ addr_t bank_addr; // Addr within the bank, bus-word aligned.
+ addr_t word_addr; // Addr within the bank, flash word aligned.
int offset; // Byte offset within the flash word.
- bit [TL_AW-1:0] bank_start_addr; // Start addr of the bank (bus word aligned).
- bit [TL_AW-1:0] page_start_addr; // Start addr of the page within the bank.
+ addr_t bank_start_addr; // Start addr of the bank (bus word aligned).
+ addr_t page_start_addr; // Start addr of the page within the bank.
uint bank; // The bank the address belongs to.
uint page; // The page within the bank.
uint line; // The word line within the page.
uint byte_offset; // Byte offset within the flash word.
- function new(bit [TL_AW-1:0] addr = 0);
+ function new(addr_t addr = 0);
set_attrs(addr);
endfunction
// Set attributes from a sample input addr.
- function void set_attrs(bit [TL_AW-1:0] addr);
+ function void set_attrs(addr_t addr);
this.addr = {addr[TL_AW-1:TL_SZW], {TL_SZW{1'b0}}};
bank_addr = this.addr[FlashMemAddrPageMsbBit : 0];
word_addr = {bank_addr[TL_AW-1:FlashDataByteWidth], {FlashDataByteWidth{1'b0}}};
@@ -38,7 +38,7 @@
byte_offset = addr[FlashDataByteWidth-1 : 0];
endfunction
- function void incr(bit [TL_AW-1:0] offset);
+ function void incr(addr_t offset);
// TODO: Check for overflow
set_attrs(addr + offset);
endfunction
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 23556b0..06283f7 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
@@ -316,10 +316,10 @@
// Task to perform a direct Flash read at the specified location
virtual task do_direct_read(
- input bit [TL_AW-1:0] addr, input bit [TL_DBW-1:0] mask = get_rand_contiguous_mask(),
+ input addr_t addr, input bit [TL_DBW-1:0] mask = get_rand_contiguous_mask(),
input bit blocking = $urandom_range(0, 1), input bit check_rdata = 0,
- input bit [TL_DW-1:0] exp_rdata = '0, input mubi4_t instr_type = MuBi4False,
- output logic [TL_DW-1:0] rdata, input bit exp_err_rsp = 1'b0);
+ input data_t exp_rdata = '0, input mubi4_t instr_type = MuBi4False,
+ output data_4s_t rdata, input bit exp_err_rsp = 1'b0);
tl_access(.addr(addr), .write(1'b0), .data(rdata), .mask(mask), .blocking(blocking),
.check_exp_data(check_rdata), .exp_data(exp_rdata), .compare_mask(mask),
.instr_type(instr_type), .exp_err_rsp(exp_err_rsp),
@@ -336,7 +336,7 @@
// Local Signals
bit poll_fifo_status;
- logic [TL_DW-1:0] exp_data[$];
+ data_q_t exp_data;
flash_op_t flash_op;
// Flash Operation Assignments
@@ -455,7 +455,6 @@
endtask : lc_ctrl_if_rst
// Simple Model For The OTP Key Seeds
- // Communicates with the TB via the flash_ctrl_vif
virtual task otp_model();
`uvm_info(`gfn, "Starting OTP Model ...", UVM_LOW)
@@ -581,7 +580,7 @@
// Local Variables
bit poll_fifo_status;
- logic [TL_DW-1:0] exp_data[$];
+ data_q_t exp_data;
flash_op_t flash_op;
data_q_t flash_op_rdata;
int match_cnt;
@@ -721,9 +720,9 @@
int num;
int num_full;
int num_part;
- logic [TL_DW-1:0] fifo_data;
- logic [TL_AW-1:0] flash_addr;
- logic [TL_DW-1:0] exp_data[$];
+ data_4s_t fifo_data;
+ addr_t flash_addr;
+ data_q_t exp_data;
flash_op_t flash_op_copy;
data_q_t data_copy;
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv
index 17365da..429b277 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_erase_suspend_vseq.sv
@@ -182,7 +182,7 @@
data_q_t flash_rd_data;
uvm_reg_data_t data;
- localparam bit [TL_DW-1:0] ALL_ONES = {TL_DW{1'b1}};
+ localparam data_t ALL_ONES = {TL_DW{1'b1}};
virtual task body();
repeat (cfg.seq_cfg.max_num_trans) begin
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_fetch_code_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_fetch_code_vseq.sv
index 3b19ea6..812735a 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_fetch_code_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_fetch_code_vseq.sv
@@ -299,9 +299,9 @@
virtual task check_code_access(input bit opt);
// Local Variables
- bit [TL_AW-1:0] read_addr;
- bit [TL_DW-1:0] rdata;
- bit [TL_DW-1:0] rdata_unused;
+ addr_t read_addr;
+ data_t rdata;
+ data_t rdata_unused;
// Note : opt 'CODE_FETCH_ALLOWED' - Access Allowed, 'CODE_FETCH_DENIED' - Access Denied
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_full_mem_access_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_full_mem_access_vseq.sv
index 594ac21..ab31a58 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_full_mem_access_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_full_mem_access_vseq.sv
@@ -20,7 +20,7 @@
rand flash_op_t flash_op;
rand bit selected_bank;
- bit [TL_AW-1:0] bank_start_addr;
+ addr_t bank_start_addr;
// Memory protection regions settings.
flash_mp_region_cfg_t mp_regions[flash_ctrl_pkg::MpRegions];
@@ -182,7 +182,7 @@
virtual task do_direct_rd();
bit [TL_AW-1:0] read_addr;
bit [TL_AW-1:0] start_addr;
- logic [TL_DW-1:0] rdata;
+ data_4s_t rdata;
start_addr = bank_start_addr;
cfg.dir_rd_in_progress = 1'b1;
for (int i = 0; i < NUM_BK_DATA_WORDS; i++) begin
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_dir_rd_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_dir_rd_vseq.sv
index 24440a8..07a1282 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_dir_rd_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_host_dir_rd_vseq.sv
@@ -52,7 +52,7 @@
rand data_q_t flash_op_data;
// Single direct read data
- bit [TL_DW-1:0] flash_rd_one_data;
+ data_t flash_rd_one_data;
constraint flash_op_data_c {
solve flash_op before flash_op_data;
@@ -138,7 +138,7 @@
constraint default_region_ecc_en_c {default_region_ecc_en == MuBi4False;}
bit [TL_AW-1:0] read_addr;
- logic [TL_DW-1:0] rdata;
+ data_4s_t rdata;
virtual task body();
repeat (num_trans) begin
// Randomize self
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 3d1b548..663fa7e 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
@@ -233,12 +233,12 @@
constraint default_region_ecc_en_c {default_region_ecc_en == MuBi4False;}
- bit [TL_AW-1:0] read_addr;
+ addr_t read_addr;
// Single direct read data
- bit [TL_DW-1:0] flash_rd_one_data;
+ data_t flash_rd_one_data;
- localparam bit [TL_DW-1:0] ALL_ONES = {TL_DW{1'b1}};
+ localparam data_t ALL_ONES = {TL_DW{1'b1}};
virtual task body();
@@ -276,7 +276,7 @@
cfg.flash_mem_bkdr_init(flash_op_host_rd.partition, FlashMemInitInvalidate);
if (flash_op.op == flash_ctrl_pkg::FlashOpProgram) begin
cfg.flash_mem_bkdr_write(.flash_op(flash_op), .scheme(FlashMemInitSet));
- end else begin
+ end else if (flash_op.op == flash_ctrl_pkg::FlashOpRead) begin
cfg.flash_mem_bkdr_write(.flash_op(flash_op), .scheme(FlashMemInitRandomize));
end
cfg.flash_mem_bkdr_write(.flash_op(flash_op_host_rd), .scheme(FlashMemInitRandomize));
@@ -301,7 +301,7 @@
cfg.flash_mem_bkdr_init(flash_op_host_rd.partition, FlashMemInitInvalidate);
if (flash_op.op == flash_ctrl_pkg::FlashOpProgram) begin
cfg.flash_mem_bkdr_write(.flash_op(flash_op), .scheme(FlashMemInitSet));
- end else begin
+ end else if (flash_op.op == flash_ctrl_pkg::FlashOpRead) begin
cfg.flash_mem_bkdr_write(.flash_op(flash_op), .scheme(FlashMemInitRandomize));
end
cfg.flash_mem_bkdr_write(.flash_op(flash_op_host_rd), .scheme(FlashMemInitRandomize));
@@ -350,34 +350,34 @@
fork
begin
// host read data and init of selected chunk of memory
- host_read_op_data(flash_op_host_rd);
+ host_read_data(flash_op_host_rd);
end
begin
// controller read, program or erase
if (flash_op.op == flash_ctrl_pkg::FlashOpRead) begin
- controller_read_op_data(flash_op);
+ controller_read_data(flash_op);
end else if (flash_op.op == flash_ctrl_pkg::FlashOpProgram) begin
controller_program_data(flash_op, flash_op_data);
end else begin //flash_op.op == flash_ctrl_pkg::FlashOpErase
- controller_program_erase(flash_op);
+ controller_erase_data(flash_op);
end
end
join;
endtask : do_operations
// host read data.
- virtual task host_read_op_data(flash_op_t flash_op);
- logic [TL_DW-1:0] rdata;
+ virtual task host_read_data(flash_op_t flash_op);
+ data_4s_t rdata;
for (int j = 0; j < flash_op.num_words; j++) begin
read_addr = flash_op.addr + 4 * j;
do_direct_read(.addr(read_addr), .mask('1), .blocking(cfg.block_host_rd), .check_rdata(0),
.rdata(rdata));
cfg.clk_rst_vif.wait_clks($urandom_range(0, 10));
end
- endtask : host_read_op_data
+ endtask : host_read_data
// Controller read data.
- virtual task controller_read_op_data(flash_op_t flash_op);
+ virtual task controller_read_data(flash_op_t flash_op);
flash_rd_data.delete();
flash_ctrl_start_op(flash_op);
flash_ctrl_read(flash_op.num_words, flash_rd_data, poll_fifo_status);
@@ -385,7 +385,7 @@
`uvm_info(`gfn, $sformatf("FLASH OP READ DATA: %0p", flash_rd_data), UVM_HIGH)
cfg.flash_mem_bkdr_read_check(flash_op, flash_rd_data);
cfg.clk_rst_vif.wait_clks($urandom_range(0, 10));
- endtask : controller_read_op_data
+ endtask : controller_read_data
// Controller program data.
virtual task controller_program_data(flash_op_t flash_op, data_q_t flash_op_data);
@@ -400,17 +400,17 @@
endtask : controller_program_data
// Controller erase data.
- virtual task controller_program_erase(flash_op_t flash_op);
+ virtual task controller_erase_data(flash_op_t flash_op);
data_q_t exp_data;
exp_data = cfg.calculate_expected_data(flash_op, flash_op_data);
flash_ctrl_start_op(flash_op);
wait_flash_op_done(.timeout_ns(cfg.seq_cfg.erase_timeout_ns));
`uvm_info(`gfn, $sformatf("FLASH OP ERASE DATA DONE"), UVM_HIGH)
cfg.flash_mem_bkdr_erase_check(flash_op, exp_data);
- endtask : controller_program_erase
+ endtask : controller_erase_data
virtual task do_arb();
- logic [TL_DW-1:0] rdata;
+ data_4s_t rdata;
data_q_t exp_data;
// setting non blocking host reads
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rd_buff_evict_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rd_buff_evict_vseq.sv
index 1333ab3..3b607e7 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rd_buff_evict_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_rd_buff_evict_vseq.sv
@@ -54,7 +54,7 @@
data_q_t flash_rd_data;
// Single host read data
- bit [TL_DW-1:0] flash_rd_one_data;
+ data_t flash_rd_one_data;
constraint flash_op_data_c {
solve flash_op before flash_op_data;
@@ -130,9 +130,9 @@
};
}
- bit [TL_AW-1:0] read_addr;
- logic [TL_DW-1:0] exp_data[$];
- logic [TL_DW-1:0] all_ones = {TL_DW{1'b1}};
+ addr_t read_addr;
+ data_q_t exp_data;
+ data_4s_t all_ones = {TL_DW{1'b1}};
task body();
@@ -389,7 +389,7 @@
// host read data.
virtual task host_read_op_data(flash_op_t flash_op);
- logic [TL_DW-1:0] rdata;
+ data_4s_t rdata;
exp_data.delete();
for (int j = 0; j < flash_op.num_words; j++) begin
read_addr = flash_op.addr + 4 * j;
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_smoke_hw_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_smoke_hw_vseq.sv
index 3999672..9dffe0c 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_smoke_hw_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_smoke_hw_vseq.sv
@@ -20,8 +20,8 @@
endfunction
task body();
- logic [TL_DW-1:0] rdata;
- logic [TL_DW-1:0] exp_data[$];
+ data_4s_t rdata;
+ data_q_t exp_data;
int flash_depth = flash_ctrl_reg_pkg::BytesPerBank / 4;