(4)UVM TLM通信(Transaction Level Modeling)

概述

  • 系统原型阶段和芯片验证阶段均使用了TLM通信方式。前者是为了更快地实现硬件原型之间的数据通信,后者是为了更快地实现验证组件之间的数据通信。
  • 仿真速度是TLM对项目进度的最大贡献,同时TLM传输中的事务又可以保证足够大的信息量和准确性。
  • TLM并不是某一种语言的产物,而是作为一种提高数据传输抽象级的标准存在的。
  • 高抽象级的数据通信,可以用来表示宽松时间跨度内的硬件通信数据,而通过将低颗粒硬件周期内的数据打包为一个大数据,非常有利于整体环境的仿真速度。
  • TLM的运用越来越广泛,包括emulator同硬件仿真器的协同仿真框架中,也建议使用这种方式来降低混合环境之间的通信频率,以便提高整体的运算效率。

在这里插入图片描述

TLM是一种基于事务(transaction)的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。
TLM成功地将模块内的计算和模块之间的通信从时间跨度方面剥离开了
在抽象语言建模体系中,各个模块通过一系列年行的进程实现,并通过通信和计算来模拟出正确的行为。

基本概念

TLM的定义

TLM通信需要两个通信的对象,这两个对象分别称为initiator和target。谁先发起通信请求,谁就属于initiator,而谁作为发起通信的响应方,谁就属于target。通信发起方并不代表了transaction的流向起点,即不一定数据是从initiator流向target,也可能是从target流向了initiator。按照transaction的流向,我们又可以将两个对象分为producer和consumer。区分它们的方法是,数据从哪里产生,它就属于producer,而数据流向了哪里,它就属于consumer

initiator与target的关系同producer与consumer的关系不是固定的

有了两个参与通信的对象之后,用户需要将TLM通信方法在target端中实现,以便于initiator将来作为发起方可以调用tarngey的通信方法,实现数据传输。

在target实现了必要的通信方法之后,最后一步我们需要将两个对象进行连接,这需要在两个对象中创建TLM端口,继而在更高层次中将这两个对象进行连接。
在这里插入图片描述

TLM通信分类

我们可以将TLM通信步骤分为:

  • 分辨initiator和target,producer和consumer。
  • 在target中实现TLM通信方法。
  • 在两个对象中创建TLM端口。
  • 在更高层次中将两个对象的端口进行连接。

从数据流向来看,s输方向可以分为单向(unidirection)和双向(bidirection)。

  • 单向传输:由initiator发起request transaction。
  • 双向传输:由initiator发起request transaction,传送至target;而target在消化了request transaction后,会发起response transaction,继而返回给initiator。

端口的按照类型可以划分为三种:

  • port:经常作为initiator的发起端,initiator凭借port才可以访问target的TLM通信方法。
  • export:作为initiator和target中间层次的端口。
  • imp:只能作为target接收request的末端,它无法作为中间层次的端口,所以imp的连接无法再次延伸。

继承于void而不是object活componnet,所以端口不能使用create;

UVM的PORT、EXPORT和IMPORT

PORT

在其中实现了PORT与EXPORT。对应于不同的操作,有不同的PORT,UVM中常用的PORT有:

uvm_blocking_put_port#(T); 
uvm_nonblocking_put_port#(T); 
uvm_put_port#(T); 
uvm_blocking_get_port#(T); 
uvm_nonblocking_get_port#(T); 
uvm_get_port#(T); 
uvm_blocking_peek_port#(T); 
uvm_nonblocking_peek_port#(T); 
uvm_peek_port#(T); 
uvm_blocking_get_peek_port#(T); 
uvm_nonblocking_get_peek_port#(T); 
uvm_get_peek_port#(T); 
uvm_blocking_transport_port#(REQ,RSP); 
uvm_nonblocking_transport_port#(REQ,RSP); 
uvm_transport_port#(REQ,RSP);

三个put系列端口对应的是TLM中的put操作,三个get系列端口对应的是get操作,三个transport系列端口对应的是则是transport操作(request-response操作)。另外,上述端口中还有三个peek系列端口,它们与get系列端口类似,用于主动获取数据。除此之外,还有三个get_peek系列端口,它集合了get操作和peek操作两者的功能。

这几种PORT对应TLM中的操作,同时以blocking和nonblocking关键字区分对于名称中不含这两者的,则表示这个端口既可以用作是阻塞的,也可以用作是非阻塞的,否则只能用于阻塞的或者只能用于非阻塞的。

EXPORT

UVM中常用的EXPORT有:

uvm_blocking_put_export#(T); 
uvm_nonblocking_put_export#(T); 
uvm_put_export#(T); 
uvm_blocking_get_export#(T); 
uvm_nonblocking_get_export#(T); 
uvm_get_export#(T); 
uvm_blocking_peek_export#(T); 
uvm_nonblocking_peek_export#(T); 
uvm_peek_export#(T); 
uvm_blocking_get_peek_export#(T);
uvm_nonblocking_get_peek_export#(T); 
uvm_get_peek_export#(T); 
uvm_blocking_transport_export#(REQ,RSP); 
uvm_nonblocking_transport_export#(REQ,RSP); 
uvm_transport_export#(REQ,RSP);

这15种EXPORT定义与前面的15种PORT一一对应。

PORT和EXPORT体现的是一种控制流,在这种控制流中,PORT具有高优先级,而EXPORT具有低优先级。只有高优先级的端口才能向低优先级的端口发起三种操作。

IMPORT

除了TLM中定义的PORT与EXPORT外,UVM中加入了第三种端口:IMP。IMP才是UVM中的精髓,承担了UVM中TLM的绝大部分实现代码UVM中的IMP如下所示:

uvm_blocking_put_imp#(T,IMP); 
uvm_nonblocking_put_imp#(T,IMP); 
uvm_put imp#(T,IMP); 
uvm_blocking_get_imp#(T,IMP); 
uvm_nonblocking_get_imp#(T,IMP); 
uvm_get_imp#(T,IMP); 
uvm_blocking_peek_imp#(T,IMP); 
uvm_nonblocking_peek_imp#(T,IMP); 
uvm_peek_imp#(T,IMP); 
uvm_blocking_get_peek_imp#(T,IMP); 
uvm_nonblocking_get_peek_imp#(T,IMP); 
uvm_get_peek_imp#(T,IMP); 
uvm_blocking_transport_imp#(REQ,RSP,IMP); 
uvm_nonblocking_transport_imp#(REQ,RSP,IMP); 
uvm_transport_imp#(REQ,RSP,IMP);

这15种IMP与之前的15种PORT和15种EXPORT分别一一对应。

IMP定义中的blocking、nonblocking、put、get、peek、get peek、transport等键字的意思并不是它们发起做相应类型的操作,而只意味着它们可以和相应类型的PORT或者EXPORT进行通信,且通信时作为被动承担者。按照控制流的优先级排序,UVM中三种端口顺序为:PORT、EXPORT、IMP。IMP的优先级最低,一个PORT可以连接到一个IMP,并发起三种操作,反之则不行。

前六个IMP定义中的第一个参数T是这个IMP传输的数据类型。第二个参数IMP,UVM文档中把其解释为实现这个接口的一个component。可以简单理解成A.A_port.put(transaction)这个任务会调用B.B_export的put,B.B_export的put(transaction)又会调用B.B_imp的put(transaction),而B_imp.put最终又会调用B的相关任务,如B.put(transaction)。也就是说,这些put操作最终还是要由B这个component来实现,即要由一个component来实现接口的操作。所以每一个IMP要和一个component相对应。

端口的使用

如果将传输方向和端口类型加以组合,可帮助理解TLM端口的继承树。TLM端口一共可以分为六类:
在这里插入图片描述
在这里插入图片描述

下一篇:UVM TLM通信之端口的互联
https://blog.csdn.net/qq_40051553/article/details/121352632

这篇笔记参考《UVM实战》、《芯片验证漫游指南》和某验证视频整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数字ic攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值