UVM——TLM通信(1)

目录

TLM的定义

通信的端口定义和所在的组件

单向通信

定义

通信流程

多向通信

定义

通信流程

通信管道

定义

通信流程


前言:基于《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 来与之对应

而且多向通信,除了端口的名字多了一个后缀,还有就是 方法后面也多了同样的后缀

通信管道

1. 定义

2. 通信流程

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值