下面将从三个层次进行概述,即什么是TLM通信(What)?为什么要用TLM通信(Why)?如何实现TLM通信(How)?
什么是TLM通信:
它是一种基于事物(transaction)的通信方式。
为什么要用TLM通信:
为了提高数据传输的抽象级别,同时也降低了整个组件和环境之间的耦合度,有利于后期的验证环境维护,这也是不再直接用mailbox的句柄做通信的原因。
如何实现TLM通信:
既然是通信,
第一步,首先要明确通信的对象是什么,对象的类型怎么区分。我们一般将发起通信请求的一方称为initiator,而对通信请求进行响应的一方称之为target。除此之外,我们还需要明确数据的流向,如果用数据的流向来划分,那么通信的对象可以分为producer(数据流向的起点)和consumer(数据流向的终点),这里需要明确的是,initiator/target和producer/consumer并没有固定的对应关系,即initiator即可以扮演producer也可以扮演consumer。
第二步,在target组件内实现TLM的通信方法,比如get() / put() / peek(),需要注意的是,方法一定是在target内部实现的。
第三步,在通信的两个对象中创建TLM端口,端口的类型有port/export/imp,其中port经常作为initiator的发起端,initiator凭借port才可以访问target的TLM通信方法。export作为initiator和target的中间层次的端口。imp只能作为target接收request的末端,无法作为中间层次的端口,即imp的连接无法继续延伸。
第四步,在更高的层次中将两个对象的端口进行连接。
另外需要说明的是,根据数据流向来看,传输方向分为单向传输(unidirection)和双向传输(bidirection)。两者的区别在于,双向传输中,initiator即可以扮演producer又可以扮演consumer。再进一步来说,又引入了多向通信的概念,在多向通信中同一个组件中相同类型的端口多于一个时,造成方法名重复的问题,而UVM给出的解决方案是引入了端口宏声明的概念,最后为了使得通信更加的标准化,又拓展了通信管道的概念,通信管道引入了TLM FIFO/analysis port/analysis TLM FIFO/request&response,总得来说就是在通信过程中增加了fifo的组件,实现对数据的缓存,同时也避免了在target中自定义方法,简化了环境的搭建。
总而言之,TLM通信就是为了降低组件和环境之间的耦合度,提升仿真的效率,优化环境后期的维护。