`ifndefGPIO_UVC_MONITOR_SV`define GPIO_UVC_MONITOR_SVclassgpio_uvc_monitorextendsuvm_monitor;`uvm_component_utils(gpio_uvc_monitor)uvm_analysis_port#(gpio_uvc_sequence_item)analysis_port;virtualgpio_uvc_ifvif;gpio_uvc_configm_config;gpio_uvc_sequence_itemm_trans;externfunctionnew(stringname,uvm_componentparent);externfunctionvoidbuild_phase(uvm_phasephase);externtaskrun_phase(uvm_phasephase);externtaskdo_mon();endclass:gpio_uvc_monitorfunctiongpio_uvc_monitor::new(stringname,uvm_componentparent);super.new(name,parent);endfunction:newfunctionvoidgpio_uvc_monitor::build_phase(uvm_phasephase);if(!uvm_config_db#(virtualgpio_uvc_if)::get(get_parent(),"","vif",vif))begin`uvm_fatal(get_name(),"Could not retrieve gpio_uvc_if from config db")endif(!uvm_config_db#(gpio_uvc_config)::get(get_parent(),"","config",m_config))begin`uvm_fatal(get_name(),"Could not retrieve gpio_uvc_config from config db")endanalysis_port=new("analysis_port",this);endfunction:build_phasetaskgpio_uvc_monitor::run_phase(uvm_phasephase);m_trans=gpio_uvc_sequence_item::type_id::create("m_trans");do_mon();endtask:run_phasetaskgpio_uvc_monitor::do_mon();foreverbeginif(m_config.is_active)begin@(vif.gpio_pin);m_trans.gpio_pin=vif.gpio_pin&m_config.get_mask();endelsebegin@(vif.gpio_pin_passive);m_trans.gpio_pin=vif.gpio_pin_passive&m_config.get_mask();end`uvm_info(get_type_name(),{"Got item: ",m_trans.convert2string()},UVM_MEDIUM)analysis_port.write(m_trans);endendtask:do_mon`endif// GPIO_UVC_MONITOR_SV