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