In reply to UVM_LOVE:
You should do the get on the config_db where you are need this interface. Looking to your env you do nothing with the virtual interface. But the env is a good place to perform the get to retrieve the virtual interface from the config_db, because from there you can connect this to your driver and your monitor. Then you have to make the get only ones.
BTW the get on the config_db should be made in the connect_phase. Then you can be sure all components are existing.
the connect-_phase could look like:
function void connect_phase();
if(! uvm_config_db#(virtual my_interface)::get(this, "", "vintf_my_interface", vintf))
`uvm_error("", "!!uvm_config_db get fail!!!!")
p_driver.vintf = vintf;
p_monitor.vintf = vintf;
endfunction