UVM组件是怎么连起来的?

背景

连接的目的是传输
传输的方式是调用(软件角度),
调用就需要涉及细节信息,如调用谁(客户路径和名称),调用什么方法(客户暴露的方法),什么时候调用
对内我们要解决这些细节问题,对外我们要提供统一的接口。如何在连接中屏蔽这些细节,提供统一的接口,保证内部细节的变化不影响对外的接口,是我们要思考的问题。总之,在调用中如何去耦合是一个关键问题。

本文将采用循序渐近的方式,讲解在“连接”中的去耦合过程。

朴素方式 - 直接调用

如下图中的producer与consumer,producer在生产好数据后,直接通过绝对路径调用消费者的接口

top.consumer.drive_data(data)

通过调用drive_data方法,直接将数据送给消费者。
这中方式简单明了,但存在致命的问题
当消费者的路径,名字,或者接口发生变化时,生产者的代码也必须跟着修改,即生产者和消费者直接高耦合。

在这里插入图片描述
参考:uvm_tlm1 of testbench.in

进阶方式 - 间接调用

消灭客户路径和客户名称

问:既想调用客户的接口,又不想关心客户的路径和名称。怎么办?
答:中介,通过中间层间接调用客户的接口。

调用需要使用对端的句柄和方法
对端的句柄可以通过connect函数传递过来

多级级联
put的级联,put的递归调用
get的级联,get的递归调用

生产者直接调用消费者的方法
在这里插入图片描述
m_provided_by与m_provided_to是连接上下游关系

在这里插入图片描述
为了避免中间商赚差价,m_imp_list,这个数据结构,直接连接到最终的客户。
在这里插入图片描述

消灭客户的接口方法

问:既想调用客户的接口,又不想关心客户的路径和名称,也不想关注客户的接口。怎么办?
答:中介,生产者和消费者通过中介buffer连接,相互直接完全独立。
生产者,消费者都不需要实现接口,接口在中介fifo中实现,生产者和消费者直接负责调用中介即可。

UVM TLM 方法

数据结构 - 链表

单链表 — 套娃连接

  • 紧耦合的链表结构
    图片描述
  • 引入port的简单方法,port指向下一个port
    图片描述
  • 引入port的套娃方法,port中的port指向下一个port
    在这里插入图片描述

双链表

在这里插入图片描述

TLM数据结构示例

设计模式 - 桥接模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值