UVM通信管道
文章目录
一、前言
- TLM通信的实现方式,这些通信有一个共同的地方,即都是端对端的,同时在target一端需要实现传输方法,例如put()或者get()。
- 这种方式在实际使用时也可能会给用户带来一些烦恼,如何可以不自己实现这些传输方法,同时可以享受到TLM的好处?
- 对于monitor、coverage collector等组件在传输数据时存在
一端到多端的传输
,如何解决这一问题? - 下面介绍的几个TLM组件和端口可以帮助用户免除这些烦恼:
- TLM FIFO
- Analysis Port
- Analysis TLM FIFO
- Request & Response通信管道
二、TLM FIFO
-
在一般TLM传输过程中,无论是initiator给target发起一个transaction,还是initiator从target获取一个transaction,transaction最终都流向consumer中(initiator和target都可以是consumer)。consumer在没有分析transaction时,我们希望将该对象先存储到本地FIFO中供稍后使用。
-
如果按照之前介绍的通信方法,用户需要分别在两个组件中例化端口,同时在target中实现相应的传输方式。多数情况下,需要实现的传输方式都是相似的,方法的主要内容即是为了实现一个数据缓存功能。
-
我们可以借助uvm_tlm_fifo,
uvm_tlm_fifo类是一个新组件,它继承于uvm_component类,而且已经预先内置了多个端口以及实现了多个对应方法供用户使用。
只有组件才可以例化端口。 -
uvm_tlm_fifo的功能类似于mailbox,不同的地方在于uvm_tlm_fifo提供了各种端口供用户使用。
推荐在initiator端例化put_port或者get_peek_port,来匹配uvm_tlm_fifo的端口类型。
对于uvm_tlm_fifo来说,它里面的BUFFER只有一个,因此它里面存放的数据类型是固定的
-
虽然它的端口名称是xxx_export,实际上它们的类型都是imp类型
三、Analysis Port
除了端对端的传输,在一些情况下还有多个组件会对同一个数据进行运算处理。如果这个数据是从同一个源的TLM端口发出到达不同组件,这就要求该种端口可以满足从一端到多端
的需求。如果数据源发生变化需要通知跟它关联的多个组件时,我们可以利用软件的设计模式之一观察者模式
(observer pattern)/广播模式
来实现。
oberver pattern的核心在于:
- 第一,这是从一个initiator端到多个target端的方式。
- 第二,analysis port采取的是"push"模式,即从initiator端调用多个target端的write()函数来实现数据传输。
一个典型的analysis port类型端口的连接方式,类似于其他TLM端口的是,按照传输方法和端口方向组合可以将analysis port分为uvm_analysis_port、uvm_analysis_export以及uvm_analysis_imp
。
- 以上图为例,在target一侧例化了uvm_analysis_imp后还需要实现write()函数。
- 在顶层可以将initiator端的uvm_analysis