i、TLM 1.0
- TLM 单项通信
总结到下面的表格中,其中PORT代表三种端口名称,分别是:
port、export、imp
对于非阻塞的几种内建方法:
1、try_put/get/peek():他们是function类型,是立即返回结果的属性。如果函数返回1代表可以发送或者获取数据,反之失败则为0。
2、can_put/get/peek():他们是function类型,是立即返回结果的属性。可以先通过此函数来检查目标是否可以接收数据,若可以再调用try_xxx函数来保证成功率。
3、这些方法都要在imp来实现。
- TLM 双向通信(bidirectional communication)
1、双向端口的通信握手方式:
transport 方式:通过target端的transport()方法内完成REQ、RSP的发出和返回
master 、slave 双向通信方式:必须通过put、get和peek调用,使用两个方法才可以完成一次握手通信。
下面表格中的PORT代表: port、export、imp
- TLM 多向通信(multi-direction communication)
多向通信仍然是两个组件之间的通信,multi指的是如果initiator和target之间的TLM端口数量超过一个时候的处理办法。如果组件A中存在两个uvm_blocking_put_port,组件B也存在两个uvm_blocking_put_imp这样在组件B中需要实现两个put(),这就造成了方法命名的冲突。
解决方案:引入uvm宏
//只需要对imp添加SFX即可
`uvm_blocking_put_imp_decl(_p1)
`uvm_blocking_put_imp_decl(_p2)
class A extends uvm_component;
// ....
endclass
class B extends uvm_component;
uvm_blocking_put_imp_p1 #(itrans,B) bt_imp_p1;
uvm_blocking_put_imp_p2 #(itrans,B) bt_imp_p2;
//...
task put_p1(itrans t);
task put_p2(itrans t);
通信管道的应用
- TLM FIFO
A、首先要明确 通信管道跟TLM单、多向通讯的区别:
1、TLM的通信方式都要在target端实现传输方法比如put或者get,但是FIFO可以不用实现这些方法也可以实现数据传输。
2、在一对多的通信模型中,TLM无法解决,Analysis Port就可以避免此问题。
B、其次了解一下uvm_tlm_fifo的内部架构,如图:
- Analysis Port(ap)
1、push传输模式:ap口实现的实现的原理是initiator端调用多个target端的write()函数来实现数据传输。
2、ap口分为uvm_analysis_port、uvm_analysis_export、uvm_analysis_imp
3、ap口需要在target端实现write()
4、在顶层实现连接
- Analysis TLM FIFO
1、其继承于uvm_tlm_fifo类。
2、基本的连接使用思路:
a: 将initiator的analysis port口连接到tlm_analysis_fifo的get_export端口,此时数据可以从initiator流入到各个tlm_analysis_fifo的缓存中;
b: 将多个target的get_port连接到tlm_analysis_fifo的get_export端口。
- Request & Response 通信管道
分为:uvm_tlm_req_rsp_channel 和 uvm_tlm_transport_channel(继承1前者)
首先要跟前面说的双向接口的transport握手方式开来,双向通信的transport握手是通过在target端实现transport()方法来实现既发送request又接收response在一次传输中。
A: uvm_tlm_req_rsp_channel 提供的端口是单方向的。
uvm_tlm_req_rsp_channel在内部例化了两个mailbox来分别储存req、rsp。
当然了上面提到的这两种方式都还是需要分别调用两次方法才可以完成request和response的传输。
B: uvm_tlm_transport_channel
鉴于上述uvm_tlm_req_rsp_channel的两种连接方法还是需要调用两次方法,此种方式添加了transport端口管道组件。
=========================================================================================================
ii 、TLM2.0
相比TLM1.0主要特性:
1、双向的阻塞或非阻塞接口
2、时间标记:实数范围的延迟,比如1.1ns,sv都是整数延迟
3、统一的数据包:由统一的数据类型:uvm_tlm_generic_payload表示。如果下面列举的还不够需要创建uvm_tlm_extension类,通过uvm_tlm_generic_payload::set_extension(uvm_tlm_extension_base ext)来添加这一部分数据。
=========================================================================================================
iii、同步通信元件:
1、SV有旗语、event、mailbox
2、uvm有uvm_event、uvm_event_pool、uvm_event_callback、uvm_barrier、uvm_barrier_pool
方法的对比:
event对比:
- event应用
uvm_event e1;
e1 = uvm_event_pool::get_global("e1");
e.get_name();
e.trigger(data);
e.wait_trigger_data(data);
还可以定义uvm_event_callback类,之后通过e.add_callback(cb)来使用,事先要在callback类中实现
pre_trigger()和post_trigger()。若pre_trigger有返回值1,则表示不会触发trigger,也不会再执行post_trigger(),反之pre_trigger()返回0则会继续trigger该事件。
- uvm_barrier应用
可以设置一定的等待阈值。通过uvm_barrier::set_threshold() 和uvm_barrier::wait_for()可以实现多个组件之间的同步。
uvm_barrier b1;
b1 = uvm_barrier_pool::get_global("b1");
b1.wait_for();
- uvm_callback应用