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