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