TLM通信

i、TLM 1.0

  • TLM 单项通信
    总结到下面的表格中,其中PORT代表三种端口名称,分别是:
    port、export、imp

TLM单项通信表格
对于非阻塞的几种内建方法:
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双向通信

  • 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的内部架构,如图:
    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 port
  • 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端口。
    analysis TLM FIFO
  • 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应用
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值