[xbar/dv] Add fcov and remove unused files
1. add fcov for delay and max oustanding req
2. remove unused files
3. add device pinmux
diff --git a/hw/dv/sv/scoreboard/scoreboard_queue.sv b/hw/dv/sv/scoreboard/scoreboard_queue.sv
index c0305a1..4baeda3 100644
--- a/hw/dv/sv/scoreboard/scoreboard_queue.sv
+++ b/hw/dv/sv/scoreboard/scoreboard_queue.sv
@@ -39,7 +39,7 @@
end
expected_items.push_back(tr);
expected_items_timestamp.push_back(current_cycle_cnt);
- if (actual_items.size() != 0) check_item();
+ if (actual_items.size() != 0) void'(check_item());
token.put(1);
endtask
@@ -53,7 +53,7 @@
end
actual_items.push_back(tr);
actual_items_timestamp.push_back(current_cycle_cnt);
- if (expected_items.size() != 0) check_item();
+ if (expected_items.size() != 0) void'(check_item());
token.put(1);
endtask
@@ -113,7 +113,7 @@
end
// Custom checking policy
kCustomCheck: begin
- custom_check();
+ void'(custom_check());
end
default: begin
`uvm_error(get_full_name(), $sformatf("%0s check policy is not supported", policy.name()))
diff --git a/hw/dv/sv/tl_agent/tl_agent.sv b/hw/dv/sv/tl_agent/tl_agent.sv
index e654642..5cb37ce 100644
--- a/hw/dv/sv/tl_agent/tl_agent.sv
+++ b/hw/dv/sv/tl_agent/tl_agent.sv
@@ -31,6 +31,7 @@
device_driver = tl_device_driver::type_id::create("device_driver", this);
end
seqr = tl_sequencer::type_id::create("seqr", this);
+ seqr.cfg = cfg;
end
mon = tl_monitor::type_id::create("mon", this);
endfunction : build_phase
diff --git a/hw/dv/sv/tl_agent/tl_agent_cfg.sv b/hw/dv/sv/tl_agent/tl_agent_cfg.sv
index c93431c..c690fe9 100644
--- a/hw/dv/sv/tl_agent/tl_agent_cfg.sv
+++ b/hw/dv/sv/tl_agent/tl_agent_cfg.sv
@@ -16,7 +16,7 @@
// 0: Unlimited from the master perspective, might be back-pressured by the slave
// 1: Only single transaction at a time
// n: Number of maximum oustanding requests
- int unsigned max_outstanding_req = 0;
+ int unsigned max_outstanding_req = 1; // most of IPs only support 1 outstanding req
// TileLink channel valid delay (host mode)
bit use_seq_item_a_valid_delay;
diff --git a/hw/dv/sv/tl_agent/tl_host_driver.sv b/hw/dv/sv/tl_agent/tl_host_driver.sv
index b824fab..b1e1f7d 100644
--- a/hw/dv/sv/tl_agent/tl_host_driver.sv
+++ b/hw/dv/sv/tl_agent/tl_host_driver.sv
@@ -99,10 +99,6 @@
seq_item_port.item_done();
pending_a_req.push_back(req);
`uvm_info(get_full_name(), $sformatf("Req sent: %0s", req.convert2string()), UVM_HIGH)
- while((cfg.max_outstanding_req > 0) &&
- (pending_a_req.size() >= cfg.max_outstanding_req) && !reset_asserted) begin
- @(vif.host_cb);
- end
endtask : send_a_channel_request
// Collect ack from D channel
diff --git a/hw/dv/sv/tl_agent/tl_monitor.sv b/hw/dv/sv/tl_agent/tl_monitor.sv
index cc8db13..d628f36 100644
--- a/hw/dv/sv/tl_agent/tl_monitor.sv
+++ b/hw/dv/sv/tl_agent/tl_monitor.sv
@@ -6,8 +6,17 @@
// ---------------------------------------------
// TileLink interface monitor
// ---------------------------------------------
-// TODO: Implement protocl check in the monitor
+// TODO merge with Shail's PR and move to cov obj
+covergroup tl_max_outsanding_cg(string name, int max_req) with function sample(bit hit_max = 1);
+ option.per_instance = 1;
+ option.name = name;
+ cp_hit_max: coverpoint hit_max {
+ bins hit = {[1:max_req]};
+ }
+endgroup : tl_max_outsanding_cg
+
+// TODO: Implement protocl check in the monitor
class tl_monitor extends uvm_monitor;
virtual tl_if vif;
@@ -17,6 +26,8 @@
bit objection_raised;
uvm_phase run_phase_h;
+ tl_max_outsanding_cg tl_max_outsanding_cg;
+
uvm_analysis_port #(tl_seq_item) d_chan_port;
uvm_analysis_port #(tl_seq_item) a_chan_port;
@@ -38,6 +49,9 @@
if (!uvm_config_db#(tl_agent_cfg)::get(this, "", "cfg", cfg)) begin
`uvm_fatal("NO_CFG", {"cfg must be set for:", get_full_name(),".cfg"});
end
+
+ // if outstanding is only 1, don't need to sample this cg
+ if (cfg.max_outstanding_req > 1) tl_max_outsanding_cg = new(`gfn, cfg.max_outstanding_req);
endfunction : build_phase
virtual task run_phase(uvm_phase phase);
@@ -82,10 +96,14 @@
agent_name, req.convert2string()), UVM_HIGH)
a_chan_port.write(req);
pending_a_req.push_back(req);
- if ((cfg.max_outstanding_req > 0) &&
- (pending_a_req.size() > cfg.max_outstanding_req)) begin
- `uvm_error(get_full_name(), $sformatf("Number of pending a_req exceeds limit %0d",
- pending_a_req.size()))
+ if (cfg.max_outstanding_req > 0) begin
+ if (pending_a_req.size() > cfg.max_outstanding_req) begin
+ `uvm_error(get_full_name(), $sformatf("Number of pending a_req exceeds limit %0d",
+ pending_a_req.size()))
+ end
+ if (cfg.max_outstanding_req > 1 && pending_a_req.size() == cfg.max_outstanding_req) begin
+ tl_max_outsanding_cg.sample();
+ end
end
if (!objection_raised) begin
run_phase_h.raise_objection(this);
diff --git a/hw/dv/sv/tl_agent/tl_seq_lib.sv b/hw/dv/sv/tl_agent/tl_seq_lib.sv
index 13605cc..2e54090 100644
--- a/hw/dv/sv/tl_agent/tl_seq_lib.sv
+++ b/hw/dv/sv/tl_agent/tl_seq_lib.sv
@@ -15,12 +15,12 @@
tl_seq_item pending_req[$];
int min_req_delay = 0;
int max_req_delay = 10;
- int max_outstanding = 8;
`uvm_object_utils(tl_host_seq)
`uvm_object_new
virtual task body();
+ set_response_queue_depth(p_sequencer.cfg.max_outstanding_req);
fork
begin : wait_response_thread
for (int i = 0; i < req_cnt; i++) begin
@@ -48,8 +48,8 @@
begin : request_thread
`uvm_info(`gfn, $sformatf("Start sending %0d host requests", req_cnt), UVM_HIGH)
for (int i = 0; i < req_cnt; i++) begin
- wait(pending_req.size < max_outstanding);
req = tl_seq_item::type_id::create("req");
+ pre_start_item(req);
start_item(req);
randomize_req(req, i);
finish_item(req);
@@ -74,11 +74,9 @@
virtual function void process_response(tl_seq_item req, tl_seq_item rsp);
endfunction
- virtual function void set_max_outstanding(int value);
- max_outstanding = value;
- set_response_queue_depth(value);
- `uvm_info(`gfn, $sformatf("Max outstanding: %0d", value), UVM_HIGH)
- endfunction
+ // A reserved task that prevents seq runs out of source ID
+ virtual task pre_start_item(tl_seq_item req);
+ endtask
endclass : tl_host_seq
diff --git a/hw/dv/sv/tl_agent/tl_sequencer.sv b/hw/dv/sv/tl_agent/tl_sequencer.sv
index eac0026..391ccac 100644
--- a/hw/dv/sv/tl_agent/tl_sequencer.sv
+++ b/hw/dv/sv/tl_agent/tl_sequencer.sv
@@ -6,6 +6,7 @@
`uvm_component_utils(tl_sequencer)
uvm_tlm_analysis_fifo#(tl_seq_item) a_chan_req_fifo;
+ tl_agent_cfg cfg;
`uvm_component_new
diff --git a/hw/ip/tlul/dv/Makefile b/hw/ip/tlul/dv/Makefile
index aa602de..0ce4849 100644
--- a/hw/ip/tlul/dv/Makefile
+++ b/hw/ip/tlul/dv/Makefile
@@ -48,8 +48,8 @@
UVM_TEST_SEQ = xbar_sanity_vseq
RUN_OPTS += +max_host_req_delay=10
RUN_OPTS += +max_host_rsp_delay=1000
- RUN_OPTS += +max_device_req_delay=10
- RUN_OPTS += +max_device_rsp_delay=1000
+ RUN_OPTS += +max_device_req_delay=1000
+ RUN_OPTS += +max_device_rsp_delay=10
endif
ifeq (${TEST_NAME},xbar_random)
@@ -73,8 +73,8 @@
UVM_TEST_SEQ = xbar_random_vseq
RUN_OPTS += +max_host_req_delay=10
RUN_OPTS += +max_host_rsp_delay=1000
- RUN_OPTS += +max_device_req_delay=10
- RUN_OPTS += +max_device_rsp_delay=1000
+ RUN_OPTS += +max_device_req_delay=1000
+ RUN_OPTS += +max_device_rsp_delay=10
endif
ifeq (${TEST_NAME},xbar_access_same_device)
@@ -85,8 +85,8 @@
UVM_TEST_SEQ = xbar_access_same_device_vseq
RUN_OPTS += +max_host_req_delay=10
RUN_OPTS += +max_host_rsp_delay=1000
- RUN_OPTS += +max_device_req_delay=10
- RUN_OPTS += +max_device_rsp_delay=1000
+ RUN_OPTS += +max_device_req_delay=1000
+ RUN_OPTS += +max_device_rsp_delay=10
endif
ifeq (${TEST_NAME},xbar_same_source)
diff --git a/hw/ip/tlul/dv/env/seq_lib/xbar_base_vseq.sv b/hw/ip/tlul/dv/env/seq_lib/xbar_base_vseq.sv
index 5709300..61cfdcb 100644
--- a/hw/ip/tlul/dv/env/seq_lib/xbar_base_vseq.sv
+++ b/hw/ip/tlul/dv/env/seq_lib/xbar_base_vseq.sv
@@ -40,7 +40,6 @@
foreach (host_seq[i]) begin
host_seq[i] = xbar_tl_host_seq::type_id::create(
$sformatf("%0s_seq", xbar_hosts[i].host_name));
- host_seq[i].set_max_outstanding(1 << VALID_HOST_ID_WIDTH);
// Default only send request to valid devices that is accessible by the host
foreach (xbar_devices[j]) begin
if (is_valid_path(xbar_hosts[i].host_name, xbar_devices[j].device_name)) begin
diff --git a/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_vseq.sv b/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_vseq.sv
index bf8a6b0..b51af9f 100644
--- a/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_vseq.sv
+++ b/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_vseq.sv
@@ -52,7 +52,10 @@
join_none
end
wait fork;
- if ($urandom_range(0, 1)) dut_init();
+ // if this seq is called as a sub-seq, and run with another seq that contains reset,
+ // when reset is issued in both seq at the same time, can't know where is the end of reset
+ // hence, if we want to kill unfinished seq after reset, we may not kill it at a right time
+ if (do_dut_init && $urandom_range(0, 1)) dut_init();
`uvm_info(`gfn, $sformatf("finished run %0d/%0d", i, num_trans), UVM_LOW)
end // isolation thread
join
diff --git a/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_with_reset_vseq.sv b/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_with_reset_vseq.sv
index 0007550..93d3245 100644
--- a/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_with_reset_vseq.sv
+++ b/hw/ip/tlul/dv/env/seq_lib/xbar_stress_all_with_reset_vseq.sv
@@ -23,9 +23,9 @@
task body();
for (int i = 1; i <= num_trans; i++) begin
bit reset_ongoing;
+ xbar_stress_all_vseq xbar_vseq;
fork
begin : seq_wo_reset
- xbar_stress_all_vseq xbar_vseq;
xbar_vseq = xbar_stress_all_vseq::type_id::create("xbar_stress_all_vseq");
xbar_vseq.do_dut_init = 0;
@@ -52,7 +52,6 @@
`uvm_info(`gfn, $sformatf("Reset is issued for run %0d/%0d", i, num_trans), UVM_LOW)
end
join_any
- p_sequencer.stop_sequences();
disable fork;
// delay to avoid race condition when sending item and checking no item after reset occur at
// the same time
diff --git a/hw/ip/tlul/dv/env/seq_lib/xbar_tl_host_seq.sv b/hw/ip/tlul/dv/env/seq_lib/xbar_tl_host_seq.sv
index 56d4ff7..332d938 100644
--- a/hw/ip/tlul/dv/env/seq_lib/xbar_tl_host_seq.sv
+++ b/hw/ip/tlul/dv/env/seq_lib/xbar_tl_host_seq.sv
@@ -52,4 +52,9 @@
end
endfunction
+ // prevent seq runs out of source ID
+ virtual task pre_start_item(tl_seq_item req);
+ wait(pending_req.size < p_sequencer.cfg.max_outstanding_req);
+ endtask
+
endclass
diff --git a/hw/ip/tlul/dv/env/xbar_env_cfg.sv b/hw/ip/tlul/dv/env/xbar_env_cfg.sv
index 81f0558..cd4d9bb 100644
--- a/hw/ip/tlul/dv/env/xbar_env_cfg.sv
+++ b/hw/ip/tlul/dv/env/xbar_env_cfg.sv
@@ -40,6 +40,7 @@
host_agent_cfg[i] = tl_agent_cfg::type_id::
create($sformatf("%0s_agent_cfg", xbar_hosts[i].host_name));
host_agent_cfg[i].is_host = 1;
+ host_agent_cfg[i].max_outstanding_req = 1 << VALID_HOST_ID_WIDTH;
end
// Device TL agent cfg
num_devices = xbar_devices.size();
@@ -48,6 +49,14 @@
device_agent_cfg[i] = tl_agent_cfg::type_id::
create($sformatf("%0s_agent_cfg", xbar_devices[i].device_name));
device_agent_cfg[i].is_host = 0;
- end
+ // the max_outstanding_req depends on how many hosts can access the device
+ // device.max_outstanding_req = sum(all its hosts max_outstanding_req)
+ device_agent_cfg[i].max_outstanding_req = 0; // clear default value
+ foreach (xbar_hosts[j]) begin
+ if (xbar_devices[i].device_name inside {xbar_hosts[j].valid_devices}) begin
+ device_agent_cfg[i].max_outstanding_req += host_agent_cfg[j].max_outstanding_req;
+ end
+ end // foreach (xbar_hosts[j])
+ end // foreach (device_agent_cfg[i])
endfunction
endclass
diff --git a/hw/ip/tlul/dv/env/xbar_env_cov.sv b/hw/ip/tlul/dv/env/xbar_env_cov.sv
index 292b9de..25f194b 100644
--- a/hw/ip/tlul/dv/env/xbar_env_cov.sv
+++ b/hw/ip/tlul/dv/env/xbar_env_cov.sv
@@ -18,11 +18,41 @@
}
endgroup
+// wrap covergroup as a class to use it as an associative array
+// sample at xbar_env_cov::build_phase
+class max_delay_cg_obj;
+
+ covergroup max_delay_cg (string name) with function sample(uint req_dly, uint rsp_dly);
+ option.per_instance = 1;
+ option.name = name;
+ cp_req_dly: coverpoint req_dly {
+ bins zero = {0};
+ bins small_delay = {[1:20]};
+ bins big_delay = {[100:1000]};
+ }
+ cp_rsp_dly: coverpoint rsp_dly {
+ bins zero = {0};
+ bins small_delay = {[1:20]};
+ bins big_delay = {[100:1000]};
+ }
+ endgroup
+
+ function new(string name = "");
+ max_delay_cg = new(name);
+ endfunction : new
+
+ function void sample(uint req_dly, uint rsp_dly);
+ max_delay_cg.sample(req_dly, rsp_dly);
+ endfunction : sample
+endclass : max_delay_cg_obj
+
class xbar_env_cov extends dv_base_env_cov #(.CFG_T(xbar_env_cfg));
same_device_access_cg same_device_access_cg;
same_source_access_cg same_source_access_cg;
// cover mapped/unmapped addr per host
dv_base_generic_cov_obj host_access_mapped_addr_cg[string];
+ // cover max_delay per host/device
+ max_delay_cg_obj max_delay_cg_obj[string];
`uvm_component_utils(xbar_env_cov)
function new(string name, uvm_component parent);
@@ -35,6 +65,14 @@
same_source_access_cg = new(1 << VALID_HOST_ID_WIDTH);
foreach (xbar_hosts[i]) begin
host_access_mapped_addr_cg[xbar_hosts[i].host_name] = new(xbar_hosts[i].host_name);
+ max_delay_cg_obj[xbar_hosts[i].host_name] = new(xbar_hosts[i].host_name);
+ max_delay_cg_obj[xbar_hosts[i].host_name].sample(cfg.max_host_req_delay,
+ cfg.max_host_rsp_delay);
+ end
+ foreach (xbar_devices[i]) begin
+ max_delay_cg_obj[xbar_devices[i].device_name] = new(xbar_devices[i].device_name);
+ max_delay_cg_obj[xbar_devices[i].device_name].sample(cfg.max_device_req_delay,
+ cfg.max_device_rsp_delay);
end
endfunction
diff --git a/hw/ip/tlul/dv/env/xbar_params.svh b/hw/ip/tlul/dv/env/xbar_params.svh
index 5f27369..3a4fd67 100644
--- a/hw/ip/tlul/dv/env/xbar_params.svh
+++ b/hw/ip/tlul/dv/env/xbar_params.svh
@@ -18,13 +18,16 @@
'{"TlFlashCtrl", ADDR_SPACE_FLASH_CTRL, ADDR_SPACE_FLASH_CTRL | ADDR_MASK_FLASH_CTRL},
'{"TlRvTimer", ADDR_SPACE_RV_TIMER , ADDR_SPACE_RV_TIMER | ADDR_MASK_RV_TIMER },
'{"TlHmac", ADDR_SPACE_HMAC , ADDR_SPACE_HMAC | ADDR_MASK_HMAC },
- '{"TlAes", ADDR_SPACE_AES , ADDR_SPACE_AES | ADDR_MASK_AES },
- '{"TlRvPlic", ADDR_SPACE_RV_PLIC , ADDR_SPACE_RV_PLIC | ADDR_MASK_RV_PLIC }};
+ '{"TlAes", ADDR_SPACE_AES , ADDR_SPACE_AES | ADDR_MASK_AES },
+ '{"TlRvPlic", ADDR_SPACE_RV_PLIC , ADDR_SPACE_RV_PLIC | ADDR_MASK_RV_PLIC },
+ '{"TlPinmux", ADDR_SPACE_PINMUX , ADDR_SPACE_PINMUX | ADDR_MASK_PINMUX }};
// List of Xbar hosts
tl_host_t xbar_hosts[$] = '{
'{"TlCorei", 0, '{"TlRom", "TlDebugMem", "TlRamMain", "TlEflash"}},
'{"TlCored", 1, '{"TlRom", "TlDebugMem", "TlRamMain", "TlEflash", "TlUart", "TlGpio",
- "TlSpiDevice", "TlFlashCtrl", "TlRvTimer", "TlHmac", "TlAes", "TlRvPlic"}},
+ "TlSpiDevice", "TlFlashCtrl", "TlRvTimer", "TlHmac", "TlAes", "TlRvPlic",
+ "TlPinmux"}},
'{"TlDmSba", 2, '{"TlRom", "TlRamMain", "TlEflash", "TlUart", "TlGpio",
- "TlSpiDevice", "TlFlashCtrl", "TlRvTimer", "TlHmac", "TlAes", "TlRvPlic"}}};
+ "TlSpiDevice", "TlFlashCtrl", "TlRvTimer", "TlHmac", "TlAes", "TlRvPlic",
+ "TlPinmux"}}};
diff --git a/hw/ip/tlul/dv/seq/host_dir_seq.sv b/hw/ip/tlul/dv/seq/host_dir_seq.sv
deleted file mode 100644
index 16c7390..0000000
--- a/hw/ip/tlul/dv/seq/host_dir_seq.sv
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-class host_dir_seq extends xbar_seq_base;
-
- function new(string name);
- super.new(name);
- endfunction : new
-
- task body();
- logic [31:0] rdata, rdata2;
-
- write('h4, 'h DEAD_BEEF, 'hF);
-
- read('h4, rdata);
- $display("Data received");
- assert(rdata == 'h DEAD_BEEF)
- else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)",
- 'h4, 'h DEAD_BEEF, rdata);
-
- // Read back twice to check if correct randomized data received
- read('hFF0, rdata);
- read('hFF0, rdata2);
-
- assert(rdata == rdata2)
- else $error("Read twice test failed: ADDR(0x%08x) RD1(0x%08x) RD2(0x%08x)",
- 'hFF0, rdata, rdata2);
-
- endtask : body
-
-endclass
diff --git a/hw/ip/tlul/dv/seq/host_rand_seq.sv b/hw/ip/tlul/dv/seq/host_rand_seq.sv
deleted file mode 100644
index 02f9c5b..0000000
--- a/hw/ip/tlul/dv/seq/host_rand_seq.sv
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-class host_rand_seq_item extends xbar_seq_item;
- constraint addr_range { addr%4 == 0; addr > 'h0 ; addr < 'h8000_0000; }
- constraint wstrb_fixed { wstrb == 'hF; }
-endclass : host_rand_seq_item
-
-class host_rand_seq extends xbar_seq_base;
-
- function new(string name);
- super.new(name);
- endfunction : new
-
- task body();
- host_rand_seq_item item_wr;
- xbar_seq_item item_rd;
- xbar_seq_item item_rsp;
-
- int trial;
-
- trial = $urandom_range(4,20);
-
- item_wr = new;
- void'(item_wr.randomize());
- item_wr.op = xbar_pkg::BUS_WR;
-
- super.req.put(item_wr);
-
- item_rd = item_wr.copy();
- item_rd.op = xbar_pkg::BUS_RD;
-
- super.req.put(item_rd);
-
- super.rsp.get(item_rsp); // for write, discard
- super.rsp.get(item_rsp);
-
- $display("Data received");
- assert(item_rsp.data == item_wr.data)
- else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)",
- item_wr.addr, item_wr.data, item_rsp.data);
-
- // Try #req greater than FIFO depth
- for (int i = 0 ; i < trial ; i++) begin
- host_rand_seq_item req_item;
- req_item = new;
- void'(req_item.randomize());
- super.req.put(req_item);
- end
- // Accept
- for (int i = 0 ; i < trial ; i++) begin
- super.rsp.get(item_rsp);
- end
- endtask : body
-
-endclass
diff --git a/hw/ip/tlul/dv/seq/host_socket1n_seq.sv b/hw/ip/tlul/dv/seq/host_socket1n_seq.sv
deleted file mode 100644
index e05b395..0000000
--- a/hw/ip/tlul/dv/seq/host_socket1n_seq.sv
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-class host_socket1n_seq_item extends xbar_seq_item;
- constraint addr_range { addr[31:30] dist { 0:=1, 1:=1, 2:=1, 3:= 1}; }
- constraint wstrb_fixed { wstrb == 'hF; }
-endclass : host_socket1n_seq_item
-
-class host_socket1n_seq extends xbar_seq_base;
-
- function new(string name);
- super.new(name);
- endfunction : new
-
- task body();
- host_socket1n_seq_item item;
- xbar_seq_item item_rsp;
- xbar_seq_item item_cmp;
-
- int trial;
- mailbox #(xbar_seq_item) cmpbox;
- cmpbox = new;
-
- // Response handling
- fork
- forever begin
- cmpbox.get(item_cmp);
- super.rsp.get(item_rsp); // Write
- super.rsp.get(item_rsp); // Read
- assert (item_cmp.data == item_rsp.data)
- else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)",
- item_cmp.addr,
- item_cmp.data,
- item_rsp.data);
- end
- join_none
-
- trial = $urandom_range(100,200);
-
- for (int i = 0 ; i < trial ; i++) begin
- item = new;
- void'(item.randomize());
- this.write_req(item.addr, item.data, '1);
- this.read_req(item.addr);
- cmpbox.put(item);
- end
- endtask : body
-
-endclass
diff --git a/hw/ip/tlul/dv/seq/xbar_factory.sv b/hw/ip/tlul/dv/seq/xbar_factory.sv
deleted file mode 100644
index 1fe8cb8..0000000
--- a/hw/ip/tlul/dv/seq/xbar_factory.sv
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-class xbar_factory;
-
- function xbar_seq_base get_xbar_seq(string name);
- if (name == "host_dir_seq") begin
- host_dir_seq ob;
- ob = new("host_dir_seq");
- return ob;
- end else if (name == "host_rand_seq") begin
- host_rand_seq ob;
- ob = new("host_rand_seq");
- return ob;
- end else if (name == "host_socket1n_seq") begin
- host_socket1n_seq ob;
- ob = new("host_socket1n_seq");
- return ob;
- end
-
- endfunction : get_xbar_seq
-
-endclass
diff --git a/hw/ip/tlul/dv/seq/xbar_seq_base.svh b/hw/ip/tlul/dv/seq/xbar_seq_base.svh
deleted file mode 100644
index 76ff53f..0000000
--- a/hw/ip/tlul/dv/seq/xbar_seq_base.svh
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-
-class xbar_seq_base;
-
- virtual xbar_if vif;
-
- mailbox #(xbar_seq_item) req;
- mailbox #(xbar_seq_item) rsp;
-
- string name;
-
- function new(string name);
- this.name = name;
- endfunction : new
-
- task connect(mailbox #(xbar_seq_item) req,
- mailbox #(xbar_seq_item) rsp
- );
- this.req = req;
- this.rsp = rsp;
- endtask : connect
-
- task pre_start(virtual xbar_if xbar_if);
- this.vif = xbar_if;
- endtask : pre_start
-
- task run();
- // Call body
- body();
- endtask : run
-
- virtual task body();
- // FATAL: Need to override
- endtask : body
-
- task write_req(input bit [31:0] addr,
- input bit [31:0] data,
- input bit [3:0] wstrb);
- xbar_seq_item item;
- item = new;
- item.addr = addr;
- item.data = data;
- item.wstrb = wstrb;
- item.op = xbar_pkg::BUS_WR;
- this.req.put(item);
-
- endtask : write_req
-
- task write_rsp();
- xbar_seq_item item;
- this.rsp.get(item);
- endtask : write_rsp
-
- task write(input bit [31:0] addr,
- input bit [31:0] data,
- input bit [3:0] wstrb);
- this.write_req(addr, data, wstrb);
- this.write_rsp(); // 1 outstanding
- endtask : write
-
- task write_async(input bit [31:0] addr,
- input bit [31:0] data,
- input bit [3:0] wstrb);
- this.write_req(addr, data, wstrb);
- fork
- this.write_rsp();
- join_none
- endtask : write_async
-
- task read_req(input bit [31:0] addr);
- xbar_seq_item item;
- item = new;
- item.addr = addr;
- item.op = xbar_pkg::BUS_RD;
- this.req.put(item);
- endtask : read_req
-
- task read_data(output bit [31:0] data);
- xbar_seq_item item;
- this.rsp.get(item);
- data = item.data;
- endtask : read_data
-
- task read(input bit [31:0] addr,
- output bit [31:0] data);
- this.read_req(addr);
-
- this.read_data(data);
- endtask : read
-
- task compare(input bit [31:0] addr,
- input bit [31:0] data);
- logic [31:0] rdata;
- this.write_req(addr, data, '1);
- this.read_req(addr);
- this.write_rsp();
- this.read_data(rdata);
- assert(data == rdata)
- else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)", addr, data, rdata);
- endtask : compare
-
- task compare_async(input bit [31:0] addr,
- input bit [31:0] data);
- logic [31:0] rdata;
- this.write_req(addr, data, '1);
- this.read_req(addr);
- fork
- begin
- this.write_rsp();
- this.read_data(rdata);
- assert(data == rdata)
- else $error("Data mismatch: ADDR(0x%08x) EXP(0x%08x) GOT(0x%08x)", addr, data, rdata);
- end
- join_none
- endtask : compare_async
-endclass
diff --git a/hw/ip/tlul/dv/seq/xbar_seq_item.svh b/hw/ip/tlul/dv/seq/xbar_seq_item.svh
deleted file mode 100644
index 16e1a01..0000000
--- a/hw/ip/tlul/dv/seq/xbar_seq_item.svh
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-//
-class xbar_seq_item;
- rand logic [31:0] addr;
- rand logic [31:0] data;
- rand logic [3:0] wstrb;
- rand xbar_pkg::xbar_op_e op;
-
- function xbar_seq_item copy();
- copy = new;
- copy.addr = this.addr;
- copy.data = this.data;
- copy.wstrb = this.wstrb;
- copy.op = this.op;
- return copy;
- endfunction : copy
-endclass : xbar_seq_item
diff --git a/hw/ip/tlul/dv/tb/xbar_tl_if_connection.sv b/hw/ip/tlul/dv/tb/xbar_tl_if_connection.sv
index 83dc2be..41723ac 100644
--- a/hw/ip/tlul/dv/tb/xbar_tl_if_connection.sv
+++ b/hw/ip/tlul/dv/tb/xbar_tl_if_connection.sv
@@ -15,6 +15,7 @@
`CONNECT_TL_DEVICE_IF(hmac_tl_if, dut.tl_hmac_o, dut.tl_hmac_i, TlHmac)
`CONNECT_TL_DEVICE_IF(aes_tl_if, dut.tl_aes_o, dut.tl_aes_i, TlAes)
`CONNECT_TL_DEVICE_IF(rv_plic_tl_if, dut.tl_rv_plic_o, dut.tl_rv_plic_i, TlRvPlic)
+`CONNECT_TL_DEVICE_IF(pinmux_tl_if, dut.tl_pinmux_o, dut.tl_pinmux_i, TlPinmux)
// Host TileLink interface connections
`CONNECT_TL_HOST_IF(corei_tl_if, dut.tl_corei_i, dut.tl_corei_o, TlCorei)