uvm设计分析——tlm
tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现。
两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function。
但是uvm规定,控制流(调用function与被调用方)只能按一定的方向来执行,所以只有某一类port类可以调对应port的function。
由于imp所在的class中,每次通信可能实现的function不同,而且做virtual function的重载也会引入新的class,
所以imp中的port类,在定义时,就调用parent中对应的function,这样在parent的class中就必须实现相应的function。
tlm模块的类图:
interface class,实现put,get,write,transparent等方法定义,
有两种,tlm_if_base,用在general的object或component class中,
sqr_if_base,用在driver和sequencer class中,
port_component,是基于uvm_component的extend,主要为了方便调用report机制,
port_base,定义connect,binding等function,实现内部provider,provided对象queue的初始化,
port_base与port_component class中互有对方的指针变量,可以实现对方的function,
但是在应用过程中,port_component只是提供了report的访问。
port/export/imp class,是实际应用中的class,都是通过macros来进行实现的。
其中只定义了该port对应的function和一个new函数。
从实现中的连接方式来看,port,export只是命令的传递者,imp是命令的执行者,其中实现了具体的function---调用parent相应的function。
所以,port,export可以被定义很多层级,来方便传递,都不影响最终的执行。
代码中表现为,port调用自己provider的put等函数,即export的provider的put等函数,即imp中调用的parent的put函数。
uvm还规定了自己的连接规则,定义在port_base connect和check_relation function中。每次进行connect函数调用的时候,都会检查。
error类型,1) mask_if不同,用来区分不同的port组;
2) 发起connect的是imp;
3) export连接port;
warning类型,1)port可以连接port,必须是child port连接parent的port;
2)port连接export,imp,必须是同一hierarchy;
3)export连接export,imp,必须是parent export,连接child export,imp;
analysis port并没有这些warning的要求。
从通信方式看,analysis类表示广播,可以connect多个,实现过程中,遍历各个port、export queue中的imp;
实现的是无延时的function write;
其他包括sqr_if都是一对一的,只能connect一个,
实现中,在每个port class的new函数中,都规定了该port能够连接的最小和最大的export,imp,
analysis [0:$],其他的port,只能是1。在resolve_binding的时候,会进行该size的检查。
从操作行为看,定义的port的function:try_put,can_put,try_get,can_get,try_peek,can_peek,nb_transport,write,
定义的port的task:put, get, peek,transport, (imp中固定function 实现bridge,具体实现与parent class)
sqr_if port中定义的function:item_done,has_do_available,put_response,
定义的task:get_next_item,try_next_item,wait_for_sequences,get,put,peek,
(实现于sequencer,调用于driver)
port_base中的三个重要函数:
1)connect函数,需要显式调用,必须在end_of_elaboration phase结束之前完成,之后调用会报错。
2)resolve_binding函数,由uvm_root 在 end_of_elaboration phase开始隐式递归调用,所有component中的child都会做检查。
3)get_if函数,在put,write等函数中被调用,拿到imp_list中的provider的指针,
port_base中的三个重要变量:
1)this_type m_provided_by[string]
this_type m_provided_to[string],存放provider和provided的port_base对象类型,在connect函数被赋值;
2)this_type m_imp_list[string],在resolve_binding函数中,被更新,存放对应provided的对象的类型;
如果provider的size很多,或遍历之后,都放在imp_list中。
3)this_type m_if,指向第一个m_imp_list中的port类型的对象,
各个port class中的size, min,max,mask_if等配置在new的时候,直接初始化。
analysis min为0,max无限制,
其他port,min为1,max为1,
多个export调用同一个imp时的function重名问题,uvm的解决方法是重新define多个不同的class对象的imp,分别调用各自的不同名称的function;
使用时,需要先define,也就是定义一个新的class,之后进行正常的connect,在imp调用的时候,会调用write_suffix这样的function;
从而区分不同的export对应的imp实现。
这样的imp定义,需要根据mask_if来定义各自的class,因为new的时候,MASK define仍然是和正常的imp相对应的。
export并不需要担心重名的问题,因为它的function并没有具体的时候,只是进行imp_list中的遍历调用,所以function内容都一样。
fifo部分,只是将多个port类型和一个mailbox封装在一起,中间保存,传递trans。
tlm_fifo_base中,定义了两个analysis_port,负责将trans,广播出去;
两个imp,分别实现,get,put,等等全部的interface function接口;
tlm_fifo中,定义了mailbox,可以在fifo new的时候,显式指定fifo的深度;默认1
具体实现put,get等函数;(实现并不像parent中的那样具体);单纯写入mailbox,再用analysis port写出去;
tlm_analysis_fifo中,只是增加了一个analysis_imp,然后实现try_put;
tlm_fifo中的function,put操作,mailbox,put操作,然后通过put_ap的analysis再发出去;
get操作,mailbox,get操作,然后通过get_ap的analysis再发出去;
tlm_analysis_fifo中的function,只增加write函数;
tlm_fifo中的mailbox function:size,is_empty,is_full,used,flush,单纯的mailbox function;
tlm1中的绝大多数port,只支持一个参数,只有req或者rsp,不会同时有这两个。
但是transport或者master/slave类型的port,支持req和rsp的同时存在。
tlm_fifo,也只是支持一种req的mailbox的存在,
req_rsp_channel,支持req和rsp的同时存在,因为其中定义了两个mailbox,
在实际使用中,声明,port,export的声明,需要指定一种req,作为参数;
imp的声明,需要指定一种req参数,还必须将parent的type 也传进来;
new函数,port、export需要指定parent,需要solve_binding;
imp需要指定parent,因为需要调用parent的function;
connect函数,需要在各个port都例化之后,在进行连接,因为port中的imp_list需要的是一个object;
所以,目前connect函数,都被放在connect phase;
uvm设计分析——tlm的更多相关文章
- uvm设计分析——reg
项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源. uvm_reg_field中的volat ...
- uvm设计分析——factory
uvm的factory机制,通过实例一个static类型default factory,并且通过宏将所有例化extend出来的object,component register到该factory的内部 ...
- uvm设计分析——field automation
uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数, 实现方式分为两种:1)用户注册,field系列宏:uvm内部调用static status ...
- uvm设计分析——callback
uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象: 使用者在使用时,将实现添加到某个pool中: callback中,最重 ...
- uvm设计分析——report
uvm_report实现中的类图,如下: 1)uvm_component均从uvm_report_object extend而来,其中定义了report_warning,error,info,fata ...
- Guidelines for Successful SoC Verification in OVM/UVM
By Moataz El-Metwally, Mentor Graphics Cairo Egypt Abstract : With the increasing adoption of OVM/UV ...
- UVM的类库
[转]http://www.asicdv.com/ 一个UVM验证平台可以看成由多个模块组合在一起的,这和以前的verilog代码,以及verilog结合其它各种语言的验证手段在理念上是一样的,最大的 ...
- UVM中的class
UVM中的类包括:基类(base)------------uvm_void/uvm_object/uvm_transaction/uvm_root/uvm_phase/uvm_port_base 报告 ...
- (转)UVM内容梗概
1. 类: 面向对象基础传统的面向对象编程与systemverilog类的特点,类的定义,成员与方法,构造函数,对象的复制和深/浅拷贝,父类/子类关系,类的继承,作用域的规则,对象的句柄以及赋值,方法 ...
随机推荐
- AndroidStudio_Button
这里回顾一下Button的使用方法: 1.在page1.xml文件中定义一个按钮控件 <Button android:id="@+id/btn_textview" andro ...
- LeetCode 884 Uncommon Words from Two Sentences 解题报告
题目要求 We are given two sentences A and B. (A sentence is a string of space separated words. Each wo ...
- 《HTTP - 概述》
晚上听着 木小雅<可能否>,让我这暴躁的一天得以回复一下. 学习是长久之事,不能急躁.应该系统的去学习一些东西. 1:HTTP 最严谨的叫法应该是 超文本转移协议,但大家一般都叫做 超文本 ...
- linux strtock()函数使用问题
strtok()原型:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成一个个片段.参数s 指向欲分割的字符串,参数de ...
- 防止SQL注入的6个要点
SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.防止SQL注入,我们可以从以下6个要点来进行: 1.永远不要信任用户的输入 ...
- 林兴爆料小程序很快可以支持各个 App 直接打开小程序
在微信开放平台基础高级产品经理林兴演讲的当场,他爆料了微信小程序一个轰动性新能力:小程序很快可以支持各个 App 直接打开小程序!没错,你没有听错,简单来说,在不久以后,所有的 App 里面都可以看到 ...
- 012-Future、FutureTask、CompletionService 、CompletableFuture
一.概述 创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口.这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果.如果需要获取执行结果,就必须通过共享变量或 ...
- OpenCV矩形检测
OpenCV矩形检测 需求:提取图像中的矩形,图像存在污染现象,即矩形区域不是完全规则的矩形. 思路一:轮廓法 OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像, ...
- 构造器初始化(static)
package demo; /* * 在类 的内部,变量定义的先后顺序决定了初始化的顺序.即使变量定义散布于方法定义之间, * 它们仍旧会在任何方法(包括构造器)被调用之前得到初始化. */ publ ...
- Day1 Python基础学习——概述、基本数据类型、流程控制
一.Python基础学习 一.编程语言分类 1.简介 机器语言:站在计算机的角度,说计算机能听懂的语言,那就是直接用二进制编程,直接操作硬件 汇编语言:站在计算机的角度,简写的英文标识符取代二进制去编 ...