目录
前言:基于《UVM实战》和路科讲解的TLM通信,总结一下
TLM的定义
TLM是 (Transaction Level Modeling 事务级建模)的缩写,起源于SystemC的一种通信标准。所谓事务级是相对于 DUT 中 各个模块之间信号线级别的通信来说的。 一个 transaction 就是把具有某一特定功能的一组信息封装在一起而成为的一个类。
通信的端口定义和所在的组件
对于组件之间的通信,发起控制指令(put get peek)的组件是“发起者(initiator)”,而另一方是 “目标(target)”。
发起者的端口是 PORT, 目标的端口是 IMP,而EXPORT通常是作为中间组件的端口或者也可以是目标的端口。
通信过程:可以看到 A 作为发起者,当 put() 时,数据从 A 流向 B, 当 get() 时,数据从 B 流向 A。故 PORT对应的发起者,指的不是数据流向,而是指令发起者,控制流向。
而且对于单向通信来说,端口的连接方式可以是如下图:
单向通信
1. 定义
单向传输:由 initiator 发起 request transaction。数据流向是单一方向的。单向通信的TLM端口有很多类型,依据下面的表格记忆比较合适,1. 是否阻塞,2. 什么通信方法,3. 什么端口
其中,get() 和 peek() 的区别是,get 会消耗数据,拿一点少一点,peek 不会。
2. 通信流程
以mcdf 中,chnl_monitor 中的数据 和 checker 中的 通信为例:
先概括一下步骤:
1. 在 initiator和 target 中 分别定义端口
2. port 端组件initiator中调用方法, 在 imp 端口所在组件 target 中实现对应方法
3.在上一层组件中,连接端口
在 initiator 组件中
1. 定义端口
monitor 定义了一个 阻塞,put() , port 的端口 mon_bp_port 。
2. 实例化端口
3. 把数据通过端口 调用 put() 方法
在 target 组件中
1.定义端口
要和 initiator 中的 阻塞,方法,一一对应,定义端口 chnl0_bp_imp
2.例化端口
在 new() 函数中,进行例化
3. 完成 对应的方法 此例中是 put()
注: 此通信中,仍然用到了 mailbox 来实现缓存
blocking 用的是 task() 而unblocking 用的是 function()
最后,在上一层 env 组件中完成连接
注: 发起者.端口.connect(目标.端口)
双向通信:
双向传输:由initiator 发起 request transaction, 传送至 target; target 在消化了 request transaction 后,发起 response transaction, 返回给 initiator。
双向端口的例化和连接类似于单向端口,不同的是对应的双向的传输任务。
initiator:
uvm_blocking_transport_port #(itrans, otrans) bt_port;
this.bt_port.transport(itr,otr);
target:
uvm_blocking_transport_imp #(itrans, otrans, comp2) bt_imp;
task transport(itrans req, output otrans rsp);
endtask
(省略了例化)
多向通信
1. 定义
不是多个组件的通信,仍然是两个组件,只不过端口的数量由原来的 一对一,变成了 多对多。
这样 imp 端口由于变多,端口名字以及对应实现的方法名就冲突了,为了解决这一问题,UVM 有了关于扩展端口名字的宏,对 target 一方的端口进行扩展声明。
例如: 只需添加一个宏声明: `uvm_blocking_put_imp_decl(chnl0)
decl 意为 declaration 声明
方法也变为了: task put_chnl0()
2. 通信流程
initiator 组件中的流程完全没有变化
target 组件中
1. 通过宏声明端口的名字
2. 定义端口,可以看出,imp的端口定义时,参数多了一个所在组件的名字
3. 例化端口
4. 完成对应的方法 put_chnl0() ..
最后,在env中连接
注: 在env中实例化了三个chnl_agent,每个chnl_agent中的 monitor 有 一个 mon_bp_port 就足够了。而在 checker 中要定义三个 chnl0_bp_imp, chnl1_bp_imp , chnl2_bp_imp 来与之对应
而且多向通信,除了端口的名字多了一个后缀,还有就是 方法后面也多了同样的后缀