UVM库中常用方法总结
1. UVM-1.2库中常在基类中定义返回扩展类对象的方法
-
类的预定义,在定义基类时有时候需要用到将来所定义的扩展类,此时需要进行类的预定义,如以下类并没有真正被定义:预定义的类可被基类的方法使用从而返回一个类的对象。
typedef class uvm_factory; typedef class uvm_default_factory; typedef class uvm_report_server; typedef class uvm_default_report_server; typedef class uvm_root; typedef class uvm_visitor;
-
在查看源码时会遇到基类中定义返回扩展类对象的方法,乍一看觉得不可思议,仔细一看,这原来是UVM库的实现方法之一,以虚类uvm_coreservice_t为例:
常用以下方式返回uvm_factory的实例:
// 虽然返回的是子类对象,但是调用的却是父类中的静态方法,因此返回的是提供uvm_coreservice_t接口的实例。 uvm_coreservice_t cs = uvm_coreservice_t::get(); // 返回uvm_default_coreservice_t类的对象; uvm_factory factory = cs.get_factory(); // 返回uvm_factory的实例对象;
-
下面我们逐步揭开上面两句话的含义:
-
首先UVM库中定义虚类uvm_coreservice_t,而后定义其中的纯虚方法get_factory()以及静态方法get(),具体定义如下:
`ifndef UVM_CORESERVICE_TYPE `define UVM_CORESERVICE_TYPE uvm_default_coreservice_t `endif typedef class uvm_factory; // 类的预定义 typedef class `UVM_CORESERVICE_TYPE; // 预定义,此时uvm_default_coreservice_t还没有被定义,但需要在uvm_coreservice_t中使用该类,因此预先定义该类; virtual class uvm_coreservice_t; // 虚类,不可以被直接实例化; pure virtual function uvm_factory get_factory(); // 纯虚方法必须在子类中全部实现后方可例化子类; ... local static `UVM_CORESERVICE_TYPE inst; // 子类句柄 static function uvm_coreservice_t get(); // uvm_coreservice_t的静态方法,用于实例化并返回uvm_default_coreservice_t子类对象; if(inst==null) inst=new; // 已经预定义子类,虽然此时仍为定义子类,但是在父类中可以例化该子类; return inst; // 返回子类对象; endfunction endclass
-
虚类不可以被直接实例化,需要被扩展后,例化子类来调用虚类中的方法,并且子类中必须实现虚类中所有的纯虚方法才可以使用new()方法来进行例化。因此在UVM中uvm_coreservice_t被扩展并重新实现了虚类中所有纯虚方法:
class uvm_default_coreservice_t extends uvm_coreservice_t; // 扩展类,父类中所有纯虚方法实现后可使用new函数实例化该子类; local uvm_factory factory; virtual function uvm_factory get_factory(); // 重定义父类中的纯虚函数; if(factory==null) begin uvm_default_factory f; // uvm_default_factory句柄; f=new; // 实例化对象; factory=f; // 向上类型转换,不需要$cast end return factory; // 返回uvm_factory的对象 endfunction ... endclass
-