[5] DV Practice/└ ⑼ scoreboard class
scoreboard class
OPPRU
2025. 3. 3. 12:20
※ 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 |