UVM学习整理——UVM通信(component类)_uvm try_get_Like_ai的博客-程序员宅基地

技术标签: 集成测试  模块测试  功能测试  芯片验证-UVM  

目录

三、UVM通信(component类)

3.1UVM TLM基本概念

3.2TLM通信端口

3.2.1单向通信端口

3.2.2双向通信端口

3.2.3多同名端口通信

3.2.4分析端口——Analysis port(一对多传输、最常用)

3.3TLM FIFO

3.3.1两种TLM FIFO

3.3.2TLM FIFO自带的方法


三、UVM通信(component类)

        UVM验证平台的特点是验证环境整体基于面向对象的开发方式,组件之间的通信也是基于TLM通信方式,但在driver与硬件的接口之间,需要将TLM抽象事务降解到基于时钟的信号驱动级别。

3.1UVM TLM基本概念

        TLM是一个基于事务(transaction)的通信方式,TLM通信两个对象根据通信动作分为initiator object(通信请求动作发起方)和target object(通信的响应方);根据事务传输方向分为producer(数据产生方)和consumer(数据接收方)。TLM通信端口按照类型可以划分为port(常作为initiator的发起端,凭借port,initiator才可以访问target中实现的TLM通信方法)、export(作为initiator和target中间层次的端口)、imp(只能作为target接收request的末端)。

        initiator与target的关系同producer与consumer的关系,不是固定的。但是TLM的通信方法是在target一端中实现,initiator将来作为发起方可调用target内的通信方法,实现数据传输。

TLM通信的步骤可以分解为:

        1)分辨出initiator和target,producer和consumer。

        2)在target中实现TLM通信方法。

        3)在两个对象中创建TLM端口。

        4)在更高的层次中将两个对象的端口进行连接。

TLM通信中的三种端口:Port,Export,IMP

        1.控制流优先级:Port > Export > IMP

        2.Port始终是传输动作的发起者,Export和IMP只能作为动作的接受者。

        3.使用connect()建立连接关系时,只有优先级高的才能调用connect()做连接。

        4.三种端口使用new()函数在build_phase中创建。(注意:不能用create创建,端口不属于UVM树的一部分)。

        5.在有Port,Export,IMP连接的data path中,只能且必须以IMP作为终点。

        6.Port,Export相当于一道门,没用存储作用,因而必须以IMP(tlm implement port class)作为终点。

        7.IMP在声明时相较于Port/Export多了一个类型参数IMP:

                uvm_blocking_put_export#(T)

                uvm_blocking_put_imp#(T, IMP);//第一个参数T是这个IMP传输的数据类型。第二个参数IMP为实现该IMP的component类型。

        8.发起者的动作实现,最终会落到终点IMP所在的component中,因此必须在IMP所在的component中定义名字为put/get/peek/transport的函数或任务,完成最终的数据传输操作(在blocking的端口,可以将put/get/transport定义为function或task;而noblocking的端口,只允许定义成function)。

3.2TLM通信端口

        TLM端口根据是否是阻塞的方式(即可以等待延时)、通信方法和数据流向命名并划分。

3.2.1单向通信端口

        单向通信中,port和export端口的参数只有一个;imp端口,参数有两个,第一个是传递的item类,第二个是实现该端口的component。常用传输类型:

        单向通信指的是从initiator到target之间的数据流向是单一方向的。单向通信端口是根据阻塞方式、通信方法和数据流向命名并划分。

组合端口 单一端口 方法声明
uvm_put_PORT uvm_blocking_put_PORT

task put(T t)

uvm_nonblocking_put_PORT

function bit try_put(T t)

function bit can_put(T t)

uvm_get_PORT uvm_blocking_get_PORT

task get(output T t)

uvm_nonblocking_get_PORT

function bit try_get(output T t)

function bit can_get( )

uvm_peek_PORT uvm_blocking_peek_PORT task peek(output T t)
uvm_nonblocking_peek_PORT function bit try_peek(output T t)
function bit can_peek( )
uvm_get_peek_PORT

uvm_blocking_get_peek_PORT task get(output T t)
task peek(output T t)
uvm_nonblocking_get_peek_PORT function bit try_get(output T t)
function bit can_get( )
function bit try_peek(output T t)
function bit can_peek( )

表格PORT代表了三种端口名:port、export和imp

        注意:阻塞的方法类型为task,这保证了可以实现等待事件和延时;非阻塞的方式类型为function,确保方法调用可以立刻返回。

其中阻塞传输的方法分别包含:

        put:initiator通过该方法可以自己生成数据T t,同时将该数据传送至target。

        get:initiator通过该方法可以从target获取数据T t,而target中的该数据则应消耗。

        peek:initiator通过该方法可以从target获取数据T t,而target中的该数据还应该保留。

非阻塞的方法分别是:try_put、can_put、try_get、can_get、try_peek、can_peek

        非阻塞方法的最大区别在于需要立即返回。如果try_xxx函数可以发送或者获取数据,那么函数还应该返回1,如果执行失败则应该返回0。可以通过can_xxx函数先试探target是否可以接收数据,通过返回值,再通过try_xxx函数发送,提高数据发送的成功率。

3.2.2双向通信端口

        双向通信指的是从initiator到target之间的数据流向是双向的。双向通信端口也是根据阻塞方式、通信方法和数据流向命名并划分。

        transport端口的通信通过transport()方法,相当于一次put传输加一次get传输,可以在同一方法调用过程中完成REQ和RSP的发出和返回;

        master和slave的通信方式必须分别通过put、get和peek的调用,通过至少两个方法的调用才可以完成一次握手通信(master端口的slave端口的区别在于:当initiator作为master时,它会发起REQ送至target端,而后再从target端获取RSP;当initiator使用slave端口时,它会先从target端获取REQ,而后,将RSP送至target端)。

3.2.3多同名端口通信

        多同名端口通信仍然是两个组件之间的通信,只是为了解决initiator与target之间的相同TLM端口超过一个时的问题(不同的端口组之间要求在imp端口一侧实现专属的方法,即无法在comp2中定义两个同名的put任务)。

        UVM通过延伸的端口宏声明方式(`uvm_*_*_imp_decl(SFX))来解决这一问题,而它解决问题的核心在于让不同的端口之间对应着不同名字的任务,这样便不会造成方法名的冲突。

3.2.4分析端口——Analysis port(一对多传输、最常用)

Analysis通信端口特点:

        1)analysis_port/export和analysis_imp的通信是一对多的通信,类似广播的形式。

        2)analysis端口没有blocking/unblocking的概念,因为他只管广播内容,不管接受的收到与否。

        3)只有一个操作:write()函数

        4)analysis端口连接也必须以analysis_imp结尾。

同样的在一个component中有多个analysis_imp时,UVM定义了`uvm_analysis_imp_decl(xxx)宏来处理这种复杂情况。

3.3TLM FIFO

        TLM FIFO(uvm_tlm_fifo)是一个新的组件,它继承于uvm_component,而且已经预先内置了多个端口及实现了多个对应的方法(无需自己定义write(),put(),get()等函数或方法),只需要用户将端口类型对应即可,TLM FIFO相当于一个缓存两端加上IMP,input和output两端都能连接Port,两侧和它连接的component都能主动发送或索取数据。

3.3.1两种TLM FIFO

        uvm_tlm_fifo:包含除analysis端口以外的全部端口,不支持write操作。

        uvm_tlm_analysis_fifo:含有下图中的所有端口,支持write操作。

FIFO中端口名字许多带有关键词export,但实际的类型是IMP,UVM掩饰类IMP的存在。

3.3.2TLM FIFO自带的方法

        used:查询fifo里存了多少transaction

        is_empty: 判断当前fifo是否为空

        is_full: 判断当前fifo是否满了

        flush:清空fifo中缓存的数据,复位时可以用

        TLM FIFO默认的深度是1,如果需要更改,可以在new()是更改参数size的值,如需要无限大小,就将传入的size参数设为0(new函数原型为:function new(string name, uvm_component parent=null, int size=1)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lizhao_yang_/article/details/121588085

智能推荐

组装台式电脑配置清单_【漫步者C2】组装电脑配置清单_weixin_39942191的博客-程序员宅基地

C2,应该是目前市场中最人性化的产品。在追求简约的风格中,融入更多专利技术及独到设计,让用户享受全新的互动式音响。用过音箱的朋友,都听到过音量过大时,音箱刺耳的爆音吧?在C2面前,大家可以安心了,只要你喜欢,你可以把旋转C2音量旋钮当成是一种习惯:)漫步者专利技术EIDC智能失真度控制系统的应用,让C2充满活力!(智能失真度控制)专利技术(专利号:)武林高手,出招于无形,最高端的设计,应该无需用户...

SWT:执行长任务,显示busy光标_cuser_online的博客-程序员宅基地

显示 busy 光标eg:BusyIndicator.showWhile(window.getShell().getDisplay(), new Runnable() {    public void run() {       //do something

解决VMware没有桥接模式(VMnet0)_cxs123678的博客-程序员宅基地

下面是VMware的虚拟网卡说明:网络类型 网络适配器Bridged VMnet0NAT VMnet8Host-only VMnet1 不要以为桥接就是添加一个VMnet0的网卡,实际上解决的方法是添加网络服务。解决方案 解决方案1: 菜单编辑 - 虚拟网络编辑器 - 右下角先以adminstrator权限获得权限先 -...

优化过的混音算法_LiuYinChina的博客-程序员宅基地

#include #include //////////////////////////////////////////////////////////////////////////void mix(short *output, size_t length_output, long *mixing, size_t length_mixing){ float f = 1.0f; if (!

list.stream().map().collect(Collectors.toList())_大熊claims的博客-程序员宅基地

【笔记】获取列表中所有用户的用户名集合 list.stream().map().collect(Collectors.toList())coderhuihui 2019-12-25 11:48:41 2704 收藏 11分类专栏: Java 笔记版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/qq_40580023/article/details/103695292收起需求,获取

工厂方法模式(Factory Method)_Jiryane的博客-程序员宅基地

一、工厂方法模式定义工厂方法模式又称为工厂模式,也叫虚拟构造器模式或者多态工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。二、 工厂方法的模式结构(1) 抽象工厂(Factory)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。(2)具体工厂(ConcreteCreator)

随便推点

在谷歌浏览器中点击链接自动打开新窗口_浏览器点击链接自动新建窗口__鹿先森的博客-程序员宅基地

1.输入想要搜索的内容,打开如下界面2.点击设置,找到搜索设置3.勾选,然后保存,就能自动打开新窗口了。

Android 高德地图集成 地图展示+定位+路线规划+各种原有图标的隐藏处理_本人很懒zzz的博客-程序员宅基地

先扔一些高德原有UI的更改占坑. //更改系统原有定位图标 MyLocationStyle myLocationStyle = new MyLocationStyle(); myLocationStyle.myLocationIcon(BitmapDescriptorFactory .fromResource(R.drawable.gps_point));// 设置小蓝点...

WordPress使用之添加备案信息_二木成林的博客-程序员宅基地

备案的时候需要添加备案号,WordPress可以通过相关配置进行添加。WordPress默认主题添加备案号首先是在【设置】——【常规】——【ICP备案号】,添加备案号接着是添加点代码来显示备案号。代码如下:<a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank"&gt...

element的el-table列标题添加自定义图标_el-table-column 添加图标_前端发现的博客-程序员宅基地

大家好,我是小佑@小佐https://blog.csdn.net/Smell_rookie,是一名页面仔工程师,我会不定时在CSDN更新我的博客,有兴趣的可以点个关注来逛逛我的主页。需求:开发中我们会遇到在el-table的列标题那添加操作图标,如下图:实现:其实el-table有提供一个render-header方法,但是没有提供具体的案例,今天遇到了就做个小总结。<el-table-column label="操作" fixed="right" width="100" :render-

推荐文章

热门文章

相关标签