※ 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 에서 자세히 설명한다.