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实战》、《芯片验证漫游指南》和某验证视频整理而成,仅作学习心得交流,如果涉及侵权烦请请告知,我将第一时间处理。