[dv] Enable top-level scb
1. enable scb
2. enable byte access for main_ram and hmac mem in top-level
3. increase xbar test to 50 seeds
Signed-off-by: Weicai Yang <weicai@google.com>
diff --git a/hw/dv/sv/cip_lib/cip_base_vseq.sv b/hw/dv/sv/cip_lib/cip_base_vseq.sv
index 041c20e..8554428 100644
--- a/hw/dv/sv/cip_lib/cip_base_vseq.sv
+++ b/hw/dv/sv/cip_lib/cip_base_vseq.sv
@@ -18,8 +18,14 @@
// user can set the name of common seq to run directly without using $value$plusargs
string common_seq_type;
+ // address mask struct
+ typedef struct packed {
+ bit [TL_AW-1:0] addr;
+ bit [TL_DBW-1:0] mask;
+ } addr_mask_t;
+
bit [TL_DW-1:0] exp_mem[int];
- int mem_exist_addr_q[$];
+ addr_mask_t mem_exist_addr_q[$];
// mem_ranges without base address
addr_range_t updated_mem_ranges[$];
@@ -501,18 +507,21 @@
tl_access(.addr(addr), .write(1), .data(data), .mask(mask), .blocking(1));
if (!cfg.under_reset) begin
+ bit [TL_DW-1:0] data_mask;
addr[1:0] = 0;
- exp_mem[addr] = data;
- mem_exist_addr_q.push_back(addr);
+ foreach (mask[i]) data_mask[i*8+:8] = {8{mask[i]}};
+ exp_mem[addr] = (exp_mem[addr] & ~data_mask) | (data & data_mask);
+ mem_exist_addr_q.push_back(addr_mask_t'{addr, mask});
end
end
end
// Randomly pick a previously written address for partial read.
exp_mem.size > 0: begin // read
// get all the programmed addresses and randomly pick one
- addr = mem_exist_addr_q[$urandom_range(0, mem_exist_addr_q.size - 1)];
- if (get_mem_access_by_addr(ral, addr) != "WO") begin;
- mask = get_rand_contiguous_mask();
+ addr_mask_t addr_mask = mem_exist_addr_q[$urandom_range(0, mem_exist_addr_q.size - 1)];
+ addr = addr_mask.addr;
+ if (get_mem_access_by_addr(ral, addr) != "WO") begin
+ mask = get_rand_contiguous_mask(addr_mask.mask);
tl_access(.addr(addr), .write(0), .data(data), .mask(mask), .blocking(1));
if (!cfg.under_reset) begin
@@ -572,10 +581,14 @@
endtask
// TLUL mask must be contiguous, e.g. 'b1001, 'b1010 aren't allowed
- virtual function bit[TL_DBW-1:0] get_rand_contiguous_mask();
+ virtual function bit[TL_DBW-1:0] get_rand_contiguous_mask(bit [TL_DBW-1:0] valid_mask = '1);
bit [TL_DBW-1:0] mask;
`DV_CHECK_STD_RANDOMIZE_WITH_FATAL(mask,
- $countones(mask ^ {mask[TL_DBW-2:0], 1'b0}) <= 2;)
+ $countones(mask ^ {mask[TL_DBW-2:0], 1'b0}) <= 2;
+ // for data bits aren't valid (unknown), mask bit should be 0
+ foreach (valid_mask[i]) {
+ !valid_mask[i] -> !mask[i];
+ })
return mask;
endfunction
diff --git a/hw/top_earlgrey/dv/chip_sim_cfg.hjson b/hw/top_earlgrey/dv/chip_sim_cfg.hjson
index a174b8d..0d3720b 100644
--- a/hw/top_earlgrey/dv/chip_sim_cfg.hjson
+++ b/hw/top_earlgrey/dv/chip_sim_cfg.hjson
@@ -93,6 +93,7 @@
{
name: xbar_mode
run_opts: ["+xbar_mode=1"]
+ reseed: 50
}
]
diff --git a/hw/top_earlgrey/dv/env/chip_env_cfg.sv b/hw/top_earlgrey/dv/env/chip_env_cfg.sv
index 9146695..a67141a 100644
--- a/hw/top_earlgrey/dv/env/chip_env_cfg.sv
+++ b/hw/top_earlgrey/dv/env/chip_env_cfg.sv
@@ -58,8 +58,6 @@
chip_mem_e mems[] = {Rom, Ram, FlashBank0, FlashBank1};
has_devmode = 0;
- // TODO: may need to add scb later
- en_scb = 0;
super.initialize(csr_base_addr);
// create uart agent config obj
@@ -87,6 +85,10 @@
protected virtual function void apply_ral_fixes();
// Out of reset, the link is in disconnected state.
ral.usbdev.intr_state.disconnected.set_reset(1'b1);
+
+ // ram_main mem and hmac mem support partial write
+ ral.ram_main.set_mem_partial_write_support(1);
+ ral.hmac.msg_fifo.set_mem_partial_write_support(1);
endfunction
endclass
diff --git a/hw/top_earlgrey/dv/env/chip_scoreboard.sv b/hw/top_earlgrey/dv/env/chip_scoreboard.sv
index 7ac8759..680782a 100644
--- a/hw/top_earlgrey/dv/env/chip_scoreboard.sv
+++ b/hw/top_earlgrey/dv/env/chip_scoreboard.sv
@@ -49,6 +49,11 @@
end
endtask
+ // TODO, may add some checking later
+ virtual task process_tl_access(tl_seq_item item, tl_channels_e channel = DataChannel);
+ return;
+ endtask
+
virtual function void reset(string kind = "HARD");
super.reset(kind);
// reset local fifos queues and variables