文章目录
背景
连接的目的是传输,
传输的方式是调用(软件角度),
调用就需要涉及细节信息,如调用谁(客户路径和名称),调用什么方法(客户暴露的方法),什么时候调用?
对内我们要解决这些细节问题,对外我们要提供统一的接口。如何在连接中屏蔽这些细节,提供统一的接口,保证内部细节的变化不影响对外的接口,是我们要思考的问题。总之,在调用中如何去耦合是一个关键问题。
本文将采用循序渐近的方式,讲解在“连接”中的去耦合过程。
朴素方式 - 直接调用
如下图中的producer与consumer,producer在生产好数据后,直接通过绝对路径调用消费者的接口
top.consumer.drive_data(data)
通过调用drive_data方法,直接将数据送给消费者。
这中方式简单明了,但存在致命的问题:
当消费者的路径,名字,或者接口发生变化时,生产者的代码也必须跟着修改,即生产者和消费者直接高耦合。
进阶方式 - 间接调用
消灭客户路径和客户名称
问:既想调用客户的接口,又不想关心客户的路径和名称。怎么办?
答:中介,通过中间层间接调用客户的接口。
调用需要使用对端的句柄和方法
对端的句柄可以通过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