※ tb.sv
class tb_c extends uvm_env;
  `uvm_component_utils(tb_c)
  
  vseqr_c vseqr;
  pipe_env_c pipe_env;

  function new(string name, uvm_component parent);
super.new(name, parent);
  endfunction    
  
  function void build_phase(uvm_phase phase);
super.build_phase(phase);
    `uvm_info(get_full_name(), $sformatf("build_phase() starts.."), UVM_LOW)
    
    vseqr = vseqr_c::type_id::create("vseqr", this);
    pipe_env = pipe_env_c::type_id::create("pipe_env", this);
  endfunction
  
  function void connect_phase(uvm_phase phase);
    super.connect_phase(phase);
    
    `uvm_info(get_type_name(), $sformatf("connect_phase() starts.."), UVM_LOW)
    if(!$cast(vseqr.pipe_seqr, pipe_env.pipe_agent.pipe_sequencer)) begin
      `uvm_error(get_type_name(), "vseqr.pipe_seqr is incompatible type.");
    end
    
    `uvm_info(get_type_name(), $sformatf("connect_phase() ends.."), UVM_LOW)
  endfunction
  
endclass

 

 tb_c 는 uvm_env 로 부터 상속받는 component class 이다. tb_c 는 test class(pipe_basic_test_c) 에서 object 로 선언 및 생성된 class 이다.

 TB Architecture 상 tb_c 에는 vseqr_c 와 pipe_env_c 를 포함하고 있다. 그래서 제일 처음 해주는 작업이 각 object 들의 이름을 선언하고 build_phase() 에서 생성하는 작업이다.

 connect_phase() 에서는 virtual sequencer 내에 선언한 pipe_sequencer 를 pipe_agent 내에 생성한 pipe_sequencer 와 연결해주기 위해 $cast 문법을 쓴다. $cast 는 쉽게 말해 괄호 안의 두 개의 object 를 동일시 하는 작업이라고 생각하면 되고, 두 object 가 유효한 경우 "1"을 return 한다. pipe_sequencer 를 virtual sequencer 에 선언한 이유에 대해서는  ⑸ virtual sequencer class 에서 자세히 설명한다.