UVM入门进阶1、2

发布时间 2023-07-15 15:21:33作者: Fireworks、

UVM入门进阶1

创建对象的四种方法

class trans extends uvm_object
    ...
endclass

class top extends uvm_test//uvm_test继承于uvm_component
    ...
endclass

class object_create extends top;
    trans t1,t2,t3,t4;
    `uvm_component_utils(object_create)
    function   new(string = "objecte_create",uvm_component_parent = this);//一般用this,如果是null,则表示uvm_top
        super.new(name,parent);
    endfunction
    function void build_phase(uvm_phase phase);
        uvm_factory f = uvm_factory::get();//get singleton factory,如果后面需要用工厂来创建对象就要写这句代码
        super.build_phase(phase);
        t1 = new("t1");//sv中的方式
        t2 = trans::type_id::create("t2",this); //以后经常用的
        void'($cast(t3,f.create_object_by_type(trans::get_type(),get_full_name(),"t3")));//利用factory创建
        void'($cast(t4,create_object("trans","t4")));//利用uvm_component创建
    endfunction
endclass

1.使用new函数进行创建

t1 = new();

2.使用type_id进行创建

创建uvm_component对象
    comp_type::type_id::create(string name, uvm_component parent)
创建uvm_object对象
    object_type::type_id::create(string name)

3.使用factory创建

uvm1.2中提供的原型
  pure virtual function
      uvm_object    create_object_by_type    (uvm_object_wrapper requested_type,  
                                              string parent_inst_path="",
                                              string name=""); 
  pure virtual function
      uvm_component create_component_by_type (uvm_object_wrapper requested_type,  
                                              string parent_inst_path="",
                                              string name, 
                                              uvm_component parent);
  pure virtual function
      uvm_object    create_object_by_name    (string requested_type_name,  
                                              string parent_inst_path="",
                                              string name=""); 

uvm_object_wrapper requested_type:用于表示对象类型
string parent_inst_path:父节点路径(object不需要)
string name:表示对象的句柄名
uvm_component parent:表示父节点句柄
string requested_type_name:表示类名

直接使用factory方法创建,注意要用全局唯一uvm_factory类对象factory调用上述方法,并且上述方法返回类型不是uvm_object就是uvm_component,所以要用$cast作类型转换。(t3为使用范例)

4.使用uvm_component方法创建

uvm1.2中提供的原型
  extern function uvm_component create_component (string requested_type_name,string name);
  extern function uvm_object create_object (string requested_type_name,string name="");

使用方法如t4,注意返回的函数类型是object类还是component类

一些常见的函数含义:

在工厂注册机制下,get_type_name(),get_name()在component组件类和object基类中的返回值是一样的,而get_full_name()在不同类型的类中,会有不同的返回值。
get_type():返回类型是uvm_object_wrapper,其为某一个类在工厂中注册时的句柄
uvm_object_wrapper requested_type其为某一个类在工厂中注册时的句柄
get_type_name():返回对象的class名,字符串类型
get_name():返回创建对象时,传入的字符串
get_full_name():在component类会返回当前component组件的完整路径,从uvm_test_top开始。在object类的返回值与get_name()一样,因为object类不是作为UVM树节点的,所以路径没有别的层次。
static function void set_type_override(uvm_object_wrapper override_type,bit replace=1); 代码中uvm_object_wrapper override_type并不是某一个具体实例的句柄,实际上是注册过后某一个类在工厂中注册时的句柄。使用new_type::get_type()可以找到

实验中遇到的一些函数

do_compare

virtual function bit do_compare (uvm_object rhs,uvm_comparer comparer)

A derived class should override this method to include its fields in a compare operation.
do_compare是用户自定义的compare的回调函数。如果比较成功返回1,比较失败返回0.

典型用法:

class mytype extends uvm_object;
    ...
    int f1;
    virtual function bit do_compare (uvm_object rhs,uvm_comparer comparer);
      mytype rhs_;
      do_compare = super.do_compare(rhs,comparer);
      $cast(rhs_,rhs);
      do_compare &= comparer.compare_field_int("f1", f1, rhs_.f1);
   endfunction
endclass

uvm_default_comparer.show_max=num设置显示比较时的最大错误数
function bit do_compare(uvm_object rhs,uvm_comparer comparer);
uvm_object rhs:右侧的,指的是在使用compare函数进行比较时右边的那个
uvm_comparer comparer:表示比较时采用的比较器
注:在使用回调函数时,一般要添加void'($cast(rhs_,rhs))来对句柄类型进行转换

消息打印函数

uvm_info("MYINFO1", $sformatf("val: %0d", val), UVM_LOW)
uvm_warning("MYWARN1", "This is a warning")
uvm_error("MYERR", "This is an error")
uvm_fatal("MYFATAL", "A fatal error has occurred")

phase机制

config机制

消息管理

set_report_id_verbosity_hier("ID",verbosity);//可以指定ID进行余度过滤
uvm_root::get().set_report_id_verbosity_hier("ID",verbosity);/可以从顶层对ID进行过滤