uvm学习杂记

一个类,只定义了而没有实例化,是没有任何意义的,但也有特殊状况,对于一个静态类,即其成员变量都是静态的,不实例化也能够正常使用;编程

类要想和DUT通讯,不能在类里定义接口,会报错,只能在类里定义虚拟接口;若直接基于sv的测试平台中是在new函数中调用接口,在UVM中则经过uvm_config_db::get来获得从top module传递而来的interface;函数

UVM中,各个component(driver,monitor等功能部件)通讯使用TLM事务级模型方式,其中要发送信息的一方,使用uvm_analysis_port#(my_transaction),是UVM库中的一个参数化的类;测试

driver是最底层的,这里没必要进行实例化,只需在build_phase中,也要完成类的实例化工做,只需调用super.build_phase(phase);In_agent实现driver,monitor,sequencer的实例化,而In_agent的实例化则在env的build_phase中完成;ui

build_phase中除了完成实例化以外,还要完成config_db机制的get行为,即把其它component设置给此component的一些参数接收过来;this

任何一个派生自uvm_component类的主要的动做都是在main_phase中完成的,main_phase的第一句话是super.main_phase,即调用父类的main_phase;seq_item_port是用于链接driver和sequencer的一个端口,driver若是想要发送数据就要从这个端口得到;sequence若是有数据要给driver,也要经过这个端口给driver;seq_item_port中my_driver的父类中,即uvm_driver类中,它的实例化也是在uvm_driver的build_phase中完成的;component

agent有两种形式,UVM_PASSIVE和UVM_ACTIVE,之前者方式运转的agent只监测总线而不驱动总线;之后者方式运行的agent驱动总线,也能够监测总线;接口

uvm_blocking_get_port也是一个TLM事务级端口,用来接收一个uvm_analysis_port发送的信息,而uvm_analysis_port是发送信息的;uvm验证平台的各个组件之间经过这两个端口来实现事务级别通讯;seo

scoreboard中通常使用一个队列来暂存从reference model获得的指望数据;队列

uvm验证平台可使用uvm_tlm_analysis_fifo把uvm_blocking_get_port和uvm_analysis_port链接;事务

在uvm中,即便driver,monitor,reference model和scoreboard的main_phase都是无限循环的,可是也不须要显式的调用finish,只须要使用objection机制便可。在发包以前,经过调用startingphase.raiseobjection(this)告诉UVM能够开始发包了,当包发送完后,调用startingphase.dropobjection(this)来告诉UVM可使用finish,只须要使用objection机制便可。在发包以前,经过调用startingphase.raiseobjection(this)告诉UVM能够开始发包了,当包发送完后,调用startingphase.dropobjection(this)来告诉UVM可使用finish了;当调用drop_objection时,UVM会检查其它的component的objection是否已经被drop了,直到被drop后,才会调用$finish.

在program顶层,调用run_test()函数会create tc-->create env。调用run_test后,会自动建立一个env的实例,会自动调用env中的main_phase。全部派生自uvm_component及其派生类的类,都应该使用uvm_component_utils宏来注册。在uvm验证平台中,只要一个类使用uvm_component_utils注册,切此类被实例化了,那么这个类的main_phase会自动被调用。

uvm验证平台的开启和关闭,通常是在main_phase中,经过raise_objection和drop_objection来开启和关闭。

在uvm的build_phase中,必定要使用super.build_phase(phase);语句来声明,不然的话,uvm的树形结构就没法创建起来,这一点要牢记。

使用uvm进行编程,要对uvm的基类比较熟悉。想实现一个功能的时候,首先要知道从uvm的哪一个基类里面来派生。好比说,全部的transaction,都必须从uvm_sequence_item这个uvm的基类来派生。

uvm_driver中预先定义好了一个任务,叫作main_phase,UVM由phase来管理验证平台的运行。能够简单地认为,实现一个driver,就是实现uvm_driver::main_phase这个task任务。

有时候若是不知道当前代码的层次结构,可使用get_full_name函数来获取。不过get_full_name函数只能用于component组件,没法应用于object组件,由于只有component组件才构成了uvm的树形结构。可使用`uvm_info("DEBUG",get_full_name(),UVM_LOW)在uvm component组件中。

相关文章
相关标签/搜索