[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)