首页 > 编程知识 正文

uvm_tlm_fifo,uvm机制

时间:2023-05-04 20:12:50 阅读:225170 作者:2130

Table of Contents

1.TLM简介

2.UVM TLM基本概念

2.1 TLM 通信常用的的三种传输:Put/Get/Transport

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

2.3  Put/Get/Transport等动作的实现

2.4 跨层次连接

3. 所有常用的一对一Port类型的总结 

4. Analysis端口(一对多连接)

5. TLM FIFO

5.1两种TLM FIFO:

5.2TLM FIFO自带的方法


1.TLM简介

TLM:Transaction Level Modeling(事务级建模),它是一个独立于语言的一个标准,常用于系统建模,加速软硬件协同开发。在芯片开发中,常配合system C使用来进行系统设计。最新的标准是OCSI TLM 2.0。

2.UVM TLM基本概念 2.1 TLM 通信常用的的三种传输:Put/Get/Transport Put 操作

               Port A是put动作发起者,Export B是动作接收者,数据流A->B. 实现A主动向B发送数据。

             2.Get 操做

              Port A是get动作发起者,Export B是动作接收者,数据流B->A. 实现A主动向B索取数据。

 

            3.Transport 操做

              Port A是transport动作发起者,Export B是动作接收者。transprot操作相当于一次put加一次get。A先发起put操作,相当于提交一个request,数据从A->B, 后通过get返回response,数据从B->A. 

          在示意图上常常用方框表示Port,圆圈表示Export。 

           其他TLM操作还有peek,get_peek两种,但实际应用较少。

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

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

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

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

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

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

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

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

uvm_nonblocking_put_export#(T)

uvm_blocking_put_laddn#(T, ykdfh); // 第一个参数T是这个ykdfh传输的数据类型。 第二个参数ykdfh为包含该ykdfh的component类型。

例如:

class B extends uvm_component; ...  uvm_blocking_put_export#(my_transaction) B_export;    uvm_blocking_put_laddn#(my_transaction, B) B_laddn; ...endclass

 

2.3  Put/Get/Transport等动作的实现

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

下面这个例子,路径是 A.port-->B.export-->B.laddn, 当A.port调用put()时,这个任务会调用B.export的put(),B.export的put()又会调用B.laddn的put(),而B.laddn的put()最终会调用B.put(). 因此用户必须在B中定义put() 函数/任务。

2.4 跨层次连接

在复杂的UVM TB中常用到port跨多级component连接的情形,在一个path中,始终只会有一个laddn作为连接的结尾。


在多层次连接中,connect要按控制流逐层进行连接。

3. 所有常用的一对一Port类型的总结 

以上这些port默认都是一对一连接,除非在实例化时改变默认的连接数量设置参数,如使用new()创建时改变参数min/max_size的值

function new (string name, uvm_component parent, int min_size=1, int max_size=1)

4. Analysis端口(一对多连接) analysis_port/export和analysis_laddn的通信是一对多的通信,类似广播的形式。analysis端口没有blocking/unblocking的概念,因为他管广播内容,不管接受的收到与否。只有一个操作:write()analysis端口连接也必须以analysis_laddn结尾。一个component中有多个analysis_laddn时,因为需要实现多个同名但内容不同的write函数时,该怎么办?UVM定义了`uvm_analysis_laddn_decl(xxx) 宏来处理这种复杂情况。5. TLM FIFO

 

TLM FIFO相当于一个缓存两端加上ykdfh,input和output两端都能连接Port,所以两侧和它连接的component都能主动发送或索取数据。

5.1两种TLM FIFO: uvm_tlm_fifo: 包含analysis 端口以外的多有端口,不支持write操作。uvm_tlm_analysis_fifo: 含有下图中的所有端口,支持write操作。

peek()区别于get()的地方是,peek()不会使FIFO缓存里的transaction个数减少。连个特殊的analysis port:put_ap和get_ap, 有向第三方转发的作用.

        put_ap:即当往fifo的buffer写入一笔transaction,这个transaction同时会通过put_ap写到第三方component中.

        get_ap:即从fifo的buffer读出一笔transaction,这个transaction自然会发从fifo get export连接的component,但同时会通过put_ap写到第三方component中.

       就像fifo分了个叉,从这个叉上可以把fifo正在put/get的内容发给第三方,从而可以窥探fifo内部正在处理的transaction。

FIFO中的许多export虽然表面的名字是export,但实际的类型是ykdfh,UVM掩饰类ykdfh的存在。FIFO的好处是不用手动再写write(),put(),get()这些component中要声明的同名函数。5.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);

 

参考
UVM实战(卷1) (张强 著)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。