uvm_config_db is how tb_top hands a virtual interface (and config objects) into the UVM tree without globals.
flowchart TB top[tb_top] -->|set| db[uvm_config_db] db -->|get| drv[driver]
// tb_top
uvm_config_db #(virtual fifo_if)::set(null, "uvm_test_top.*", "vif", vif);
// driver
if (!uvm_config_db #(virtual fifo_if)::get(this, "", "vif", vif))
`uvm_fatal("DRV", "no vif")
Match the instance path (uvm_test_top.env.agent.*) or use "*" carefully. Prefer a config object for many knobs.
Wrong vs right
Wrong — uvm_config_db #(virtual fifo_if)::get ignored return value, then null-pointer in run_phase.
Right — get must succeed or uvm_fatal; set from tb_top before run_test().