※ pipe_sb.sv
`uvm_analysis_imp_decl(_pipe)

class pipe_sb_c extends uvm_scoreboard;
  `uvm_component_utils(pipe_sb_c)

  uvm_analysis_imp_pipe #(pipe_mon_pkt_c, pipe_sb_c) pipe_imp_port; // TLM implementation port

  event e_dut_out_data;
  
  bit [15:0] ref_data_out0[$];
  bit [15:0] ref_data_out1[$];
  bit [15:0] rtl_data_out0[$];
  bit [15:0] rtl_data_out1[$];
  
  function new(string name, uvm_component parent);
    super.new(name, parent);
    
    pipe_imp_port = new("pipe_imp_port", this);
  endfunction
 
  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
  endfunction
  
  virtual task run_phase(uvm_phase phase);
    super.run_phase(phase);
    
    // Add..
    forever begin
      @(e_dut_out_data);
      
      fork
        compare_data_0();
        compare_data_1();
      join
      
    end
  endtask
  
  virtual task compare_data_0();
    bit [15:0] ref_data;
    bit [15:0] rtl_data;
  
    ref_data = ref_data_out0.pop_front();
    rtl_data = rtl_data_out0.pop_front();
    if (ref_data != rtl_data) begin
      `uvm_error(get_type_name(), $sformatf("DATA MISMATCHED for data_0"))
    end
    else begin
      `uvm_info(get_type_name(), $sformatf("DATA_MATCED for data_0 ('h%0x)", rtl_data), UVM_LOW)
    end
  endtask
  
  virtual task compare_data_1();
    bit [15:0] ref_data;
    bit [15:0] rtl_data;
  
    ref_data = ref_data_out1.pop_front();
    rtl_data = rtl_data_out1.pop_front();
    if (ref_data != rtl_data) begin
      `uvm_error(get_type_name(), $sformatf("DATA MISMATCHED for data_1"))
    end
    else begin
      `uvm_info(get_type_name(), $sformatf("DATA_MATCED for data_1 ('h%0x)", rtl_data), UVM_LOW)
    end    
    
  endtask  
  
  virtual function void write_pipe (pipe_mon_pkt_c  tr);
    pipe_mon_pkt_c  cur_tr;
    
    if (tr != null) begin
      $cast(cur_tr, tr);
      if (cur_tr.i_enable) begin
        ref_data_out0.push_back(cur_tr.i_data_in0 * cur_tr.i_cf);
        ref_data_out1.push_back(cur_tr.i_data_in1 * cur_tr.i_cf);
      end
      
      if (cur_tr.o_enable) begin
        //`uvm_info(get_type_name(), $sformatf("cur_tr.o_data_in0 = 'h%x", cur_tr.o_data_in0), UVM_LOW)
        //`uvm_info(get_type_name(), $sformatf("cur_tr.o_data_in1 = 'h%x", cur_tr.o_data_in1), UVM_LOW)
        rtl_data_out0.push_back(cur_tr.o_data_in0);
        rtl_data_out1.push_back(cur_tr.o_data_in1);
        ->e_dut_out_data;
      end
    end 
    
  endfunction
  
  
endclass