TLM通信
- TLM是一种基于事务(transaction)的通信方式,通常在高抽象级语言例如SystemC或者SV/UVM中作为模块之间的通讯方式。
- TLM成功地将模块内的计算和模块之间的通信从时间跨度方面剥离开了。
- 在抽象语言建模体系中,各个模块通过一系列并行的进程实现,并通过通信和计算来模拟出正确的行为。
- 如果要提高系统模型的仿真性能,需要考虑两个方面
·一个是建模自身的运算优化,另外一个是模型之间的通信优化。
·前者需要依靠开发者的经验还有性能分析工具来逐步优化模型。
·后者则可以通过将通信频率降低、内容体积增大的方式,来减少由不同进程之间同步带来的资源损耗。
·TLM正是从通信优化角度提出的—种抽象通信方式。
我们可以将TLM通信步骤分为: - 分辨出initiator和target,producer和consumero·在target中实现TLM通信方法。
- 在两个对象中创建TLM端口。
- 在更高层次中将两个对象的端口进行连接。
从数据流向来看,传输方向可以分为单向(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的连接无法再次延伸
如果将传输方向和端口类型加以组合,可帮助理解TLM端口的继承树。TLM端口一共可以分为六类:
- uvm_UNDIR_port # (trans_t)
- uvm_UNDIR_export # (trans_t)
- uvm_UNDIR_imp # (trans _t, imp parent_t)
- uvm_BIDIR port # (req_trans_t, rsp_trans_t)
- uvm BIDIR export # (req trans_ t, rsp_trans_t)
- uvm BIDIR imp # (req trans_t, rsp_trans_t, imp _parent_t)
- 注意:端口不是object类型的子类,它不能用一些特殊的创建方法
端口的使用
- 这地方port连接到port也是合理的
+
建立TLM通信的常规步骤
建立TLM通信的常规步骤:
- 定义TLM传输中的数据类型,上面分别定义了request类和response类。
- 分别在各个层次的component中声明和创建TLM端口对象。
- 通过connect()函数完成端口之间的连接。
- 在imp端口类中要实现需要提供给initiator的可调用方法。例如,在comp2中由于有一个uvm_nonblocking put_imp #(request,comp2) nbp_imp,因此需要实现两个方法try_put()和can_put();而comp4中有一个uvm_blocking get_imp #(request, comp4)bg_imp,则需要实现对应的方法get()。
- 需要注意的是,必须在imp端口类中实现对应方法,否则端口即使连接也无法实现数据传输。对于更多imp端口类型与其对应方法,读者可以在下一节有更详细的参考。