| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| class dv_base_agent #(type CFG_T = dv_base_agent_cfg, |
| type DRIVER_T = dv_base_driver, |
| type HOST_DRIVER_T = DRIVER_T, |
| type DEVICE_DRIVER_T = DRIVER_T, |
| type SEQUENCER_T = dv_base_sequencer, |
| type MONITOR_T = dv_base_monitor, |
| type COV_T = dv_base_agent_cov) extends uvm_agent; |
| |
| `uvm_component_param_utils(dv_base_agent #(CFG_T, DRIVER_T, HOST_DRIVER_T, DEVICE_DRIVER_T, |
| SEQUENCER_T, MONITOR_T, COV_T)) |
| |
| CFG_T cfg; |
| COV_T cov; |
| DRIVER_T driver; |
| SEQUENCER_T sequencer; |
| MONITOR_T monitor; |
| |
| `uvm_component_new |
| |
| function void build_phase(uvm_phase phase); |
| super.build_phase(phase); |
| // get CFG_T object from uvm_config_db |
| if (!uvm_config_db#(CFG_T)::get(this, "", "cfg", cfg)) begin |
| `uvm_fatal(`gfn, $sformatf("failed to get %s from uvm_config_db", cfg.get_type_name())) |
| end |
| `uvm_info(`gfn, $sformatf("\n%0s", cfg.sprint()), UVM_HIGH) |
| |
| // create components |
| if (cfg.en_cov) begin |
| cov = COV_T ::type_id::create("cov", this); |
| cov.cfg = cfg; |
| end |
| |
| monitor = MONITOR_T::type_id::create("monitor", this); |
| monitor.cfg = cfg; |
| monitor.cov = cov; |
| |
| if (cfg.is_active) begin |
| sequencer = SEQUENCER_T::type_id::create("sequencer", this); |
| sequencer.cfg = cfg; |
| |
| if (cfg.has_driver) begin |
| if (cfg.if_mode == Host) driver = HOST_DRIVER_T::type_id::create("driver", this); |
| else driver = DEVICE_DRIVER_T::type_id::create("driver", this); |
| driver.cfg = cfg; |
| end |
| end |
| endfunction |
| |
| function void connect_phase(uvm_phase phase); |
| super.connect_phase(phase); |
| if (cfg.is_active && cfg.has_driver) begin |
| driver.seq_item_port.connect(sequencer.seq_item_export); |
| end |
| if (cfg.has_req_fifo) begin |
| monitor.req_analysis_port.connect(sequencer.req_analysis_fifo.analysis_export); |
| end |
| if (cfg.has_rsp_fifo) begin |
| monitor.rsp_analysis_port.connect(sequencer.rsp_analysis_fifo.analysis_export); |
| end |
| endfunction |
| |
| endclass |
| |