UVM中的TLM通信

UVM中的TLM通信

1、TLM简介

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

2、UVM TLM概念

2.1、TLM通信的步骤

  1. 分辨出initiator和target,producer和consumer;
  2. 在target中实现TLM通信方法;
  3. 在两个对象中创建TLM端口;
  4. 在更高层次将两个对像都端口连接;

2.2、单向通信

1、put操作

Port A是put动作发起者,Export B是动作接收者,数据流A->B. 实现A主动向B发送数据。
在这里插入图片描述

2、get操作

Port A是get动作发起者,Export B是动作接收者,数据流B->A. 实现A主动向B索取数据,且数据被消耗。
在这里插入图片描述

3、peek操作

Port A是get动作发起者,Export B是动作接收者,数据流B->A. 实现A主动向B索取数据,但数据被保留。
在这里插入图片描述

2.3 、双向通信

1 transport操作

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

2.4、多向通信

指的是,如果initiator和target之间的相同TLM端口数目超过一个时的处理解决办法。UVM通过端口宏声明方式来解决这一问题。
在这里插入图片描述
定义方法如下:

`uvm_blocking_put_imp_decl(参数名)
`uvm_blocking_get_imp_decl(参数名)

3、TLM通信中三种端口

1、port/export/imp端口

1、优先级高连接优先级底的:Port > Export > IMP

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

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

4、在同时有Port,Export,IMP端口中,只有且必须以IMP作为终点。
在这里插入图片描述
5、 IMP 在声明时相较于Port/Export多了一个类型参数’IMP’ ,uvm_blocking_put_imp#(T, IMP); // 第一个参数T是这个IMP传输的数据类型。 第二个参数IMP为包含该IMP的component类型。

2、三种端口的方法实现

initiator的动作实现,最终是在终点imp所在的commponent中实现,所以要在imp所在的commponent中定义put/get/transport的任务或函数,完成数据参数。在blocking端口可以把put/get/transport定义成function或task,在nonblocking端口只能把put/get/transport定义成function。

4、通信管道

4.1 Analysis port(一对多连接)

除了端对端的传输,还有一端到多端的需求。这是一个initiator端到多个target端的方式,analysis port采取的是“push”模式,即从initiator端调用多个target端的write()函数实现数据传输
在这里插入图片描述

4.2 TLM FIFO

1、uvm_tlm_fifo的功能类似于mailbox,不同在于uvm_tlm_fifo提供各种端口供用户使用。比如put、get、peek端口,
2、uvm_tlm_fifo中的许多export虽然表面的名字是export,但实际的类型是IMP,UVM掩饰类IMP的存在。
3、uvm_tlm_fifo的好处是不用手动再写write(),put(),get()这些component中要声明的同名函数
在这里插入图片描述

4.3 Analysis TLM FIFO

uvm_tlm_analysis_fifo类继承于uvm_tlm_fifo,表明它本身具有面向单一TLM端口的数据缓存属性,同时该类又有uvm_analysis_imp、analysis_export端口并且实现write()函数。

  1. 将initiator的analysis port连接到tlm_ananlysis_fifo的get_export端口,这样数据就能从initiator发起,写入各个tlm_analysis_fifo的缓存中;
  2. 将多个target的get_port连接到tlm_analysis_fifo的get_export端口,注意保持端口类型匹配,这样从target一侧只需要调用get()方法就可以得到先前存储在各个tlm_analysis_fifo的缓存中的数据;

在这里插入图片描述


版权声明:本文为qq_40088467原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。