UVM学习之:UVM库中常用方法总结

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
      
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值