20 UVM comparer

在uvm_object中,我们讨论了print、clone、copy、compare方法等。compare()方法比较两个对象,如果比较成功则返回1。uvm_comparer 添加比较策略并计算错误比较的数量(如果有)。

1 Variables in uvm_comparer class

20 UVM comparer_第1张图片

注:physical和abstract位用来区别两个不同类别域的对象。 

2 Methods in uvm_comparer class

20 UVM comparer_第2张图片

2.1 UVM Comparer example

class transaction extends uvm_object;
  rand bit[15:0] addr;
  rand bit[15:0] data;
  `uvm_object_utils_begin(transaction)
    `uvm_field_int(addr, UVM_PRINT);
    `uvm_field_int(data, UVM_PRINT);
  `uvm_object_utils_end
  
  function new(string name = "transaction");
    super.new(name);
  endfunction
endclass

class base_test extends uvm_test;
  transaction tr1, tr2;
  uvm_comparer comp;

  `uvm_component_utils(base_test)
  
  function new(string name = "base_test", uvm_component parent = null);
    super.new(name, parent);
  endfunction
  
  function void build_phase(uvm_phase phase);
    super.build_phase(phase);
    tr1 = transaction::type_id::create("tr1", this);
    tr2 = transaction::type_id::create("tr2", this);
    comp = new();
  endfunction
 
  task run_phase(uvm_phase phase);
    super.run_phase(phase);
    assert(tr1.randomize());
    assert(tr2.randomize());
    
    comp.verbosity = UVM_LOW;
    comp.sev = UVM_ERROR;
    comp.show_max = 100;
    
    `uvm_info(get_full_name(), "Comparing objects", UVM_LOW)
    comp.compare_object("tr_compare", tr1, tr2);
    tr2.copy(tr1);
    comp.compare_object("tr_compare", tr1, tr2);
    `uvm_info(get_full_name(), $sformatf("Comparing objects: result = %0d", comp.result), UVM_LOW)
    
    comp.compare_field_int("int_compare", 5'h2, 5'h4, 5);
    comp.compare_string("string_compare", "name", "names");
    
    `uvm_info(get_full_name(), $sformatf("Comparing objects: result = %0d", comp.result), UVM_LOW)
    
    comp.compare_field_int("int_compare", 5'h4, 5'h4, 5);
    comp.compare_string("string_compare", "name", "name");
  endtask
endclass

module tb_top;
  initial begin
    run_test("base_test");
  end
endmodule

Output:

UVM_INFO testbench.sv(33) @ 0: uvm_test_top [uvm_test_top] Comparing objects
UVM_ERROR /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_comparer.svh(351) @ 0: reporter [MISCMP] Miscompare for tr_compare.addr: lhs = 'hf87e : rhs = 'h7781
UVM_ERROR /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_comparer.svh(351) @ 0: reporter [MISCMP] Miscompare for tr_compare.data: lhs = 'h6139 : rhs = 'hf210
UVM_ERROR /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_comparer.svh(382) @ 0: reporter [MISCMP] 2 Miscompare(s) for object tr2@1874 vs. tr1@1872
UVM_ERROR /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_comparer.svh(382) @ 0: reporter [MISCMP] 2 Miscompare(s) for object tr2@1874 vs. tr1@1872
UVM_INFO testbench.sv(44) @ 0: uvm_test_top [uvm_test_top] Comparing objects: result = 2
UVM_ERROR /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_comparer.svh(351) @ 0: reporter [MISCMP] Miscompare for int_compare: lhs = 'h2 : rhs = 'h4
UVM_ERROR /xcelium20.09/tools//methodology/UVM/CDNS-1.2/sv/src/base/uvm_comparer.svh(351) @ 0: reporter [MISCMP] Miscompare for string_compare: lhs = "name" : rhs = "names"
UVM_INFO testbench.sv(49) @ 0: uvm_test_top [uvm_test_top] Comparing objects: result = 4

你可能感兴趣的:(UVM,vlsiverify_uvm)