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

类要想和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中完成;

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

任何一个派生自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中完成的;

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

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

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组件中。

uvm学习杂记的更多相关文章

  1. [Flask]学习杂记--模板

    这个学习杂记主要不是分享经验,更多是记录下falsk的体验过程,以后做东西在深入研究,因为django之前用的时间比较长,所以很多概念都是一看而过,做个试验了解下flask的功能. flask中使用是 ...

  2. Java编程思想学习杂记(1-4章)

    程序流程控制 移位运算符 移位运算符面向的运算对象是二进制的位,可单独用它们处理整数类型.左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)." ...

  3. Thinking in Java学习杂记(5-6章)

    Java中可以通过访问控制符来控制访问权限.其中包含的类别有:public, "有好的"(无关键字), protected 以及 private.在C++中,访问指示符控制着它后面 ...

  4. Thinking in Java学习杂记(第7章)

    将一个方法调用同一个方法主体连接到一起就称为"绑定"(Binding).若在程序运行以前执行绑定,就叫做"早期绑定".而Java中绑定的所有方法都采用后期绑定技 ...

  5. Android学习杂记

    Jni接口学习资料: http://www.cnblogs.com/lsnproj/archive/2012/01/09/2317519.html classLoader和插件化: http://bl ...

  6. django 学习杂记

    django1.9 学习路径 http://python.usyiyi.cn/django/intro/tutorial02.html django 中url路径带参数,在view中应该如何处理 应该 ...

  7. Linux学习杂记

    近期一口气看完了韩顺平老师讲的Linux视频教程,自己也在学习的过程中做了些笔记,记载例如以下.希望帮助到一些喜欢研究Linux的同学.也算是在云端备份一下笔记吧.以免电脑出现不可控的因素而遗失自己的 ...

  8. Python学习杂记_4_分支和循环

    分支 和 循环 分支和循环这俩结构在各语言中都有着很重要的地位,当然我之前都没有学好,这里总结一下在Python学习中对这俩结构的认识. 分支结构 # 单分支 if 条件判断: 执行语句… # 双分支 ...

  9. Disruptor学习杂记

    慎入,有点乱,只是学习记录,disruptor_2.10.4 1.Disruptor对象有一个EventProcessorRepository对象   2.EventProcessorReposito ...

随机推荐

  1. win7(64位)+vs2008配置Directshow

    参考链接:http://zhuyanfeng.com/archives/1663 PC环境:win7 64bit + vs2008 1.下载64位的win7 SDK2.安装过程中遇到错误(必须要卸载v ...

  2. 使用ghost硬盘对拷备份系统

    公司有台server装了OA系统.要备份数据.同一时候假设系统出错之后可以及时回复.所以有买了块同型号硬盘. 用ghost的硬盘对拷功能,将原硬盘的系统和数据拷到新硬盘上.新硬盘挂到server上.当 ...

  3. cocos3.x 实现android沉浸式模式(全屏,隐藏导航栏即虚拟键)

    只有在Android 4.4及以上系统才支持沉浸式模式,修改 AppActivity代码如下: @Override public Cocos2dxGLSurfaceView onCreateView( ...

  4. 如何结合IbatisNet的LIST遍历实现模糊查询

    我仿照Java的Spring+Ibatis+Struct用Castle+IBatisNet+Asp.net的开发框架的DAO的基类:BaseSqlMapDao内定义了一个内部类来辅助模糊查询.内部类代 ...

  5. django 之 常用命令

    Django 基本命令 本节主要是为了让您了解一些django最基本的命令,请尝试着记住它们,并且多多练习下 1. 新建一个 django project django-admin.py startp ...

  6. Angular ui-route的用法

    ui-router和同属AngularJS框架一部分的ng-route一样强大. ui-router提供了让我们可以做路由嵌套和视图命名的特性,嵌套路由功能主要是依赖$stateProvider服务, ...

  7. Redis 教程

    http://www.runoob.com/redis/redis-tutorial.html Redis系列(一)--安装.helloworld以及读懂配置文件 再开个redis系列,本系列打算不详 ...

  8. cocopods

    一.什么是CocoaPods 1.为什么需要CocoaPods 在进行iOS开发的时候,总免不了使用第三方的开源库,比如SBJson.AFNetworking.Reachability等等.使用这些库 ...

  9. https://help.aliyun.com/knowledge_detail/49787.html?spm=a2c4g.11186631.2.3.6f856f39tiE98P

    https://help.aliyun.com/knowledge_detail/49787.html?spm=a2c4g.11186631.2.3.6f856f39tiE98P

  10. Jconsole监控tomcat 的JVM内存的设置

    主要参考这位仁兄的文章  http://elf8848.iteye.com/blog/471676 照做后发现还是不行,原来是Linux服务器配置了多块网卡,在设置 Djava.rmi.server. ...