[dv] Add support for multiple ral models
- This commit adds support for running the common CSR suite of tests
with multiple RAL models in the testbench
Signed-off-by: Srikrishna Iyer <sriyer@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 8554428..ecf2708 100644
--- a/hw/dv/sv/cip_lib/cip_base_vseq.sv
+++ b/hw/dv/sv/cip_lib/cip_base_vseq.sv
@@ -78,14 +78,15 @@
input bit [TL_DW-1:0] exp_data = 0,
input bit check_exp_data = 1'b0,
input bit [TL_DW-1:0] compare_mask = '1,
- input bit blocking = csr_utils_pkg::default_csr_blocking);
+ input bit blocking = csr_utils_pkg::default_csr_blocking,
+ tl_sequencer tl_sequencer_h = p_sequencer.tl_sequencer_h);
if (blocking) begin
tl_access_sub(addr, write, data, mask, check_rsp, exp_err_rsp, exp_data,
- compare_mask, check_exp_data);
+ compare_mask, check_exp_data, tl_sequencer_h);
end else begin
fork
tl_access_sub(addr, write, data, mask, check_rsp, exp_err_rsp, exp_data,
- compare_mask, check_exp_data);
+ compare_mask, check_exp_data, tl_sequencer_h);
join_none
// Add #0 to ensure that this thread starts executing before any subsequent call
#0;
@@ -100,11 +101,12 @@
input bit exp_err_rsp = 1'b0,
input bit [TL_DW-1:0] exp_data = 0,
input bit [TL_DW-1:0] compare_mask = '1,
- input bit check_exp_data = 1'b0);
+ input bit check_exp_data = 1'b0,
+ tl_sequencer tl_sequencer_h = p_sequencer.tl_sequencer_h);
`DV_SPINWAIT(
// thread to read/write tlul
tl_host_single_seq tl_seq;
- `uvm_create_on(tl_seq, p_sequencer.tl_sequencer_h)
+ `uvm_create_on(tl_seq, tl_sequencer_h)
if (cfg.zero_delays) begin
tl_seq.min_req_delay = 0;
tl_seq.max_req_delay = 0;
@@ -423,8 +425,9 @@
virtual task run_same_csr_outstanding_vseq(int num_times);
csr_excl_item csr_excl = add_and_return_csr_excl("csr_excl");
csr_test_type_e csr_test_type = CsrRwTest; // share the same exclusion as csr_rw_test
- uvm_reg test_csrs[$];
- ral.get_registers(test_csrs);
+ uvm_reg test_csrs[$];
+
+ foreach (cfg.ral_models[i]) cfg.ral_models[i].get_registers(test_csrs);
for (int trans = 1; trans <= num_times; trans++) begin
`uvm_info(`gfn, $sformatf("Running same CSR outstanding test iteration %0d/%0d",
diff --git a/hw/dv/sv/dv_lib/dv_base_env_cfg.sv b/hw/dv/sv/dv_lib/dv_base_env_cfg.sv
index 1360ff6..0512e1e 100644
--- a/hw/dv/sv/dv_lib/dv_base_env_cfg.sv
+++ b/hw/dv/sv/dv_lib/dv_base_env_cfg.sv
@@ -15,6 +15,7 @@
// reg model & q of valid csr addresses
RAL_T ral;
+ dv_base_reg_block ral_models[$];
bit [TL_AW-1:0] csr_addrs[$];
addr_range_t mem_ranges[$];
@@ -64,6 +65,7 @@
ral = RAL_T::type_id::create("ral");
ral.build(this.csr_base_addr, null);
apply_ral_fixes();
+ ral_models.push_back(ral);
end
endfunction
diff --git a/hw/dv/sv/dv_lib/dv_base_vseq.sv b/hw/dv/sv/dv_lib/dv_base_vseq.sv
index 6b0e8c5..7cade3b 100644
--- a/hw/dv/sv/dv_lib/dv_base_vseq.sv
+++ b/hw/dv/sv/dv_lib/dv_base_vseq.sv
@@ -71,7 +71,9 @@
cfg.clk_rst_vif.apply_reset();
csr_utils_pkg::reset_deasserted();
end
- if (cfg.has_ral) ral.reset(kind);
+ if (cfg.has_ral) begin
+ foreach (cfg.ral_models[i]) cfg.ral_models[i].reset(kind);
+ end
endtask
virtual task wait_for_reset(string reset_kind = "HARD",
@@ -167,7 +169,7 @@
// run write-only sequence to randomize the csr values
m_csr_write_seq = csr_write_seq::type_id::create("m_csr_write_seq");
- m_csr_write_seq.models.push_back(ral);
+ m_csr_write_seq.models = cfg.ral_models;
m_csr_write_seq.set_csr_excl_item(csr_excl);
m_csr_write_seq.external_checker = cfg.en_scb;
if (!enable_asserts_in_hw_reset_rand_wr) $assertoff;
@@ -184,7 +186,7 @@
// create base csr seq and pass our ral
m_csr_seq = csr_base_seq::type_id::create("m_csr_seq");
m_csr_seq.num_test_csrs = num_test_csrs;
- m_csr_seq.models.push_back(ral);
+ m_csr_seq.models = cfg.ral_models;
m_csr_seq.set_csr_excl_item(csr_excl);
m_csr_seq.external_checker = cfg.en_scb;
m_csr_seq.start(null);