UVM_6:事务级建模TLM通信


前言

TLM是一种基于事务(Transaction)的通信方式,通常在高抽象级语言,例如SystemC、SV/UVM中作为模块间的通信方式。
TLM通信保证了相邻组件间的通信不再通过显式句柄引用,而是独立于组件的通信方式,为验证组件的复用提供了很好地封闭性。

仿真速度是TLM对项目进度的最大贡献,同时TLM传输中的事务又可以保证足够大的信息量和准确性。

提示:以下是本篇文章正文内容,下面案例可供参考

一、简单例子:driver-sequencer组件之间的通信

driver的TLM端口:
uvm_seq_item_pull_port #(REP,RSQ) seq_item_port
sequencer的端口:
uvm_seq_item_pull_imp #(REQ,RSP,this_type) seq_item_export
driver和sequencer的端口连接:
driver::seq_item_port.connect(sequencer::seq_item_export)

二、TLM通信

系统原型阶段和芯片验证阶段均使用了TLM通信方式。前者是为了更快地实现硬件原型之间的数据通信,后者是为了更快地实现验证组件之间的通信。
仿真速度是TLM对项目进度的最大贡献,同时TLM传输中的事务又可以保证足够大的信息量和准确性。
TLM并不是某种语言的产物,而是作为一种提高数据传输抽象级的标准存在的。
TLM是一种基于事务(Transaction)的通信方式,通常在高抽象级语言,例如SystemC、SV/UVM中作为模块间的通信方式。
TLM通信保证了相邻组件间的通信不再通过显式句柄引用,而是独立于组件的通信方式,为验证组件的复用提供了很好地封闭性。
在这里插入图片描述

在芯片开发流程中,TLM通信主要在两个方面发挥了重要作用:
① 系统原型中各模块间通过TLM通信可以实现较宽松时间内的数据包传输;
② 验证平台组件之间通过TLM通信,验证平台组件driver与硬件设计模块之间通过TLM通信。
TLM通信基本概念:
TLM通信需要两个通信的对象(分别称为initiator 和 target)。谁先发起通信请求,谁就属于initiator,而作为通信的响应方,称为target。按照Transaction的流向,可以将对象分为 producer 和 consumer。数据从哪里产生,它就属于producer,而数据流向了哪里,它就属于consumer。注意:transaction的流向不一定是从initiator流向target,也可能是target流向initiator。
initiator 与 target 的关系同 producer 与consumer的关系不是固定的 。
有了两个参与通信的对象后,用户需要将TLM通信方法在target一端中实现,以便于initiator将来作为发起方可以调用target的通信方法,实现数据传输。
最后需要将两个对象进行连接,需要在两个TLM对象中创建TLM端口,继而在更高层次中将这两个对象进行连接。

三、TLM通信步骤

分辨出initiator 和 target ,producer 和 consumer;
在 target 中实现TLM通信方法;
在两个对象中创建TLM端口,initiator中创建port端口,target端创建imp端口;
在更高层次对两个对象的端口进行连接。
在这里插入图片描述
在这里插入图片描述

四、TLM通信的分类

① 从数据流向来看,传输方向分为单向和双向
单向传输:由initiator发起request transaction
双向传输:由initiator发起request transaction,传送至target,继而target在消化了request transaction后,会发起responde transaction返回给initiator。
② 端口类型可以分为3种:
port:经常作为initiator的发起端,initiator凭借port才可以访问target的TLM通信方法;
export:作为initiator和target中间层次的端口;
imp:只能作为target接受request的末端,它无法作为中间层次的端口,所以imp到的连接无法再次延伸。

五、端口的使用

就单向端口而言,声明port和export作为request发起方,参数只需要指定transaction类型参数,而声名imp作为request接收方,参数有2个,第一个指定指定transaction类型,第二个指定它所在的component类型。
就声明双向端口而言,指定参数需要考虑双向传输的因素,将传输类型transaction拆分为request transaction 和response transaction。

TLM端口连接的一般做法:
在initiator端例化port,在中间层例化export,在target端例化imp,在build_phase中创建;
多个port可以连接到同一个export或者imp;但是单个port或者export无法连接到多个imp上;
可以理解成多个initiator可以对同一个target发起request,但是同一个initiator无法连接多个target;(无法一对多)
port 可以连接port 、export 和 imp;export 可以连接 export 和imp 上;imp是数据传输的终点,无法扩展连接。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、单向通信

在这里插入图片描述
单向通信是指由initiator 到target之间的数据流向是单一方向的,或者说initiator和target只能扮演producer和consumer中的一个角色。
声明port和export作为request发起方,参数只需要指定transaction类型参数,而声名imp作为request接收方,参数有2个,第一个指定指定transaction类型,第二个指定transaction类型和它所在的component类型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、双向通信

双向通信的initiator和target两端之间数据流向是双向的,即两端initiator和target同时扮演者producer和consumer,而initiator作为request发起方,在发起request后,还会等待response返回。

双向端口按照通信握手方式可以分为:
transport 双向通信方式
master和 slave 双向通信方式
transport 端口通过 transport() 方法,可以在同一方法调用过程中完成 REQ 和 REP的发出和返回。
master 和slave的通信方式必须分别通过put 、get 和peek()的调用,使用两个方法才完成一次握手信号。
master端口和slave 端口的区别:当initiator 作为 master时,它会发送REQ至 target端,然后再从target端获取 RSP;当initiator使用slave端口时,它会先从target端获取REQ,然后将RSP送至target端。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、多向通信

多向通信仍然是两个组件之间的的通信,而不是多个组件之间的通信,两个组件上有多个通信端口。
多向通信是指,如果initiator与target之间的相同TLM端口数目超过一个的情况,在target端的解决方法。
即多向通信处理的是同一个组件上有多个相同类型的端口,各个端口之间的通信。
UVM通过端口宏声明方式来解决这一问题,它解决的核心问题在于让不同端口对应不同的任务名,这样就不会造成方法名的冲突。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
九、通信管道
在不对传输的数据进行额外处理,只是作为存储的时候,可以不定义target一方的函数/任务,且自带了存储。
在面对一个组件需要给多个组件传输数据的时候的问题得到解决。
实现“一对多”的通信方式。
在这里插入图片描述

1. TLM_FIFO

在一般TLM传输过程中,无论initiator给target发起一个transaction,还是initiator从target获取一个transaction,transaction最终都会流向consumer中。在consumer没有分析transaction之前,我们希望将transaction先存储到本地的FIFO中供稍后使用,这就可以使用uvm_tlm_fifo这个组件。
uvm_tlm_fifo类是一个新组件,继承与uvm_component类,而且已经预先内置了多个端口以及实现了多个对应方法供用户使用。
uvm_tlm_fifo是组件,例化时需要传入两个参数,一个记录在工厂的参数名,一个parent;
uvm_tlm_fifo的功能类似于mailbox,不同的地方在于uvm_tlm_fifo提供了各种端口供用户使用。推荐initiator端例化put_port或者get_peek_port,来匹配uvm_tlm_fifo的端口类型。
在这里插入图片描述

2. Analysis Port

可以实现一端对多端的需求,即数据是从同一个源的TLM端口发出到达不同的组件。
如果数据源端发生变化需要通知跟它关联的多个组件时,可以利用软件设计模式之一 观察者模式(广播模式,observer pattern)来实现。
observer pattern的核心在于:
第一,这是从一个initiator端到多个target端的方式
第二,analysis port采用的是”push"模式,即从initiator端调用多个target端的write()函数实现数据传输。
连接方式:
agent一侧例化了uvm_analysis_imp后还需要实现write()函数;
在顶层连接。顶层将initiator端的 uvm_analysis_port 与多个target端的 uvm_analysis_imp 进行连接;
当initiator端调用write()函数时,实际上是采用轮询的方式将所有连接的target端内置的write()函数进行了调用。
由于函数立即返回的特点,无论连接多少个target端,initiator端调用write()函数总是立即返回的,不同之前的单端口函数调用的是,即便没有target与之相连,调用write()函数也不会发生错误。
在这里插入图片描述

3. Analysis TLM FIFO

uvm_tlm_analysis_fifo为用户提供了可以搭配uvm_analysis_port端口、uvm_analysis_imp端口和write()函数;
uvm_tlm_analysis_fifo类继承于uvm_tlm_fifo,这表明它本身具有面向单一TLM端口的数据缓存特性,而同时该类又有一个uvm_analysis_imp端口;
连接方式:
将initiator的analysis port连接到uvm_tlm_analysis_fifo 的 get_export 端口,这样数据可以从initiator发起,写到各个uvm_tlm_analysis_fifo的缓存中。
将多个target的get_port连接到tlm_analysis_fifo的get_export,注意保持端口类型的匹配,这样从target一侧需要调用get()方法就可以得到先前存储在tlm_analysis_fifo中的数据。
在这里插入图片描述

4. request & response 通信管道

UVM提供了两种简单的通信管道,他们作为数据缓存区域,既有TLM端口从外侧接收request 和 response,同时也有TLM端口供外侧获取request和response。
uvm_tlm_req_rsp_channel
uvm_tlm_transport_channel
在这里插入图片描述
在这里插入图片描述


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