0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

UVM设计模式之观察者模式解读

rfdqdzdg 来源:IC Verification Club 2023-08-24 17:39 次阅读

观察者模式

Observer Pattern:对象之间定义一个一对多的依赖关系,当一个对象改变的时候,所有依赖对象都会自动收到通知。

观察目标(Subject)和观察者(Observer)是一对多的关系。有时候观察者模式也叫做发布-订阅模式(Publisher-Subscriber)。观察者模式将观察者和被观察者代码解耦。

示例:股民Investor作为观察者,股票Stock作为观察目标。当股价大于20或者小于10时,观察者将会收到通知,执行各自的函数。

可以看到,在Stock中调用notifyObserver,实际是调用Investor中重写的update函数。update函数对于不同观察者,可以有不同的独立的实现。将代码中变化的部分(增加、减少观察者,对观察结果的处理函数)不变的部分(发送通知给观察者)进行了很好的分离,实现代码最小化改动,达到解耦的目的。

wKgaomTnJYiAGkgzAAXK-YvDMTc963.jpg

uvm_subscriber

UVM中内建了uvm_subscriber类,可以被当作观察者或者订阅者使用。

wKgaomTnJYiAGMspAADr5hez1Ws748.jpg

一般用在构建功能覆盖率的收集。伪代码如下:

订阅者订阅monitor中收集到的transaction,覆盖率模块,参考模型,scoreboard都是订阅者。每当monitor收集到新的transaction,自动调用write函数,将transaction广播出去(uvm_analysis_port是一个广播的port,可以对应多个接收者)至于write函数如何实现,monitor并不关心,每个订阅者的write实现不同。在覆盖率类中write具体实现就是调用sample函数,收集覆盖率。UVM通过connect函数将TLM端口连接,在订阅者和发布者之间建立了联系。具体分析见下一节。

wKgaomTnJYiAGvduAAJxOLbypSg615.jpg

** TLM**

UVM对观察者模式进行了扩充,加入了各种端口类,作为一个中介,专门负责订阅者和发布者建立联系。

如下示例,env中有三个component(A_inst, B_inst, C_inst), 其中A作为发布者,B,C作为订阅者。

wKgZomTnJYiAMxKVAAAr6JA6VZ8536.jpg

1. 示例

在UVM树形结构中,我们会看到端口被当作component放入了A_inst的m_children成员变量中,如下:

wKgZomTnJYiAdDcdAAEcu_TfgVg455.jpg

2. 将端口加入树形结构

先分析下为什么port会被加入到uvm树结构中。

如下,A_ap 是一个 uvm_analysis_port#(my_transaction)类型的端口。调用new函数传入name = "A_ap", parent = this (A_inst)

wKgZomTnJYiAfb2eAAB5tmv3gfs035.jpg

uvm_analysis_port#(my_transaction)继承于uvm_port_base。uvm_prot_base的new函数会创建一个 **m_comp ** (uvm_port_component类型)的实例,这个实例是一个参数化的类,传入了一个端口类型,这个端口类型就是A_ap的类型。

wKgZomTnJYmAQ_hQAABzOZOl_L4734.jpg

如下,m_comp被创建时,同时也会为 **m_port **赋值,这个句柄指向A_ap的实例。

wKgaomTnJYmAMB55AACFKhNZ_u4312.jpg

uvm_port_component继承于uvm_port_component_base, uvm_port_component_base继承于uvm_component。在uvm_port_component_base中,super.new传入的name = "A_ap", parent = A_inst

wKgZomTnJYmAWiVRAAAcHVV5WkQ617.jpg

所以,并不是A_ap这个端口实例被加入到了UVM树形结构,因为A_ap不属于component,无法加入树形结构。只是A_ap的成员变量m_comp加入到了树形结构,而这个m_comp加入树形结构用的是A_ap的name和A_ap的parent,代表A_ap加入了树形结构。同时m_comp里也有成员变量m_port,指向A_ap的实例。在sequence中无法使用TLM端口,一般借助sequencer的端口或者使用mailbox代替。

3. connect函数

connect()函数的实现:

A_ap.connect(B_inst.B_imp)A_ap.connect(C_inst.C_imp)后,会在A_ap中的m_provided_by (联合数组,索引是 provider名字,值是 provider的实例,此处是imp型的端口) 加入记录,m_provided_by["B_imp"] = B_imp m_provided_by["C_imp"] = C_imp

wKgaomTnJYmAOUPcAAApwmVcX6Y993.jpg

4. write函数

A_ap是uvm_analysis_port型的端口,A_ap.write调用的write函数在uvm_analysis_port类中定义

analysis_port是广播型的端口,通过for循环遍历m_imp_list(存放 imp型的端口), 执行 tif.write 函数(调用每个 imp端口的 write函数)

B_imp是uvm_analysi_imp#(my_transaction,B)型的端口,构造函数new会传入B的句柄,所以其内部成员变量 **m_imp **指向 **class B **的实例。

tif.write其实就是调用m_imp.write, 也就是 class B/ class C 中定义的write函数。

wKgaomTnJYmAch0nAANnbC8tpE8922.jpg

5. m_imp_list

在class uvm_root中,当执行完connect_phase后,会调用do_resolve_bingding函数。这个主体作用是从下往上遍历UVM树形结构,执行resolve_bindings函数

resolve_bindings函数是uvm_component函数中的空虚函数,agent,driver类型的component没有实际操作,但在uvm_port_component中重写了。uvm_port_component调用m_port的resolve_bindings函数。

A_ap在resolve_bindings函数中遍历联合数组m_provided_by,调用m_add_list将和A_ap connect相连的imp端口放入m_imp_list中。

至于上面提到的,将端口加入树形结构的作用就在这里体现了:端口加入树形结构,才会无遗漏的被遍历循环到。至于为什么不在调用connect函数时直接加入m_imp_list中,这是为了解决connect的传递行为(port_b.connect(imp); port_a.connect(port b);)

wKgZomTnJYmATWleAABwG46u6JA841.jpg

在观察者模式的示例中,addObserver函数相当于UVM中的connect函数,对 **m_observer_hash **的遍历相当于UVM中 **m_imp_list **的遍历。UVM加入了更丰富的端口类,来实现这些功能。UVM还有很多其他端口和端口的方法,这里不在展开。综上,UVM中TLM机制是观察者模式和内建端口类的结合。

总结

UVM作为一种方法学,提供了一种实际工程的验证平台架构。在将近7万行的源代码中,囊括了sequence机制、factory机制、phase机制、寄存器模式等内容。UVM采用systemverilog这种面向对象编程的语言,借鉴了大量的软件设计模式,提高了平台的复用和扩展。

通过这些学习可以发现,设计模式的目的就是解耦。创建型模式是将创建和使用代码解耦,结构型模式是将不同功能代码解耦,行为型模式是将不同的行为代码解耦。借助设计模式,我们利用更好的代码结构,将一大坨代码拆分成职责更单一的小类,让其满足开闭原则、高内聚松耦合等特性,以此来控制和应对代码的复杂性,提高代码的可扩展性。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    19121
  • TLM
    TLM
    +关注

    关注

    1

    文章

    32

    浏览量

    24722
  • 解耦控制
    +关注

    关注

    0

    文章

    29

    浏览量

    10192

原文标题:UVM设计模式 (十) 观察者模式、uvm_subscriber、TLM、总结

文章出处:【微信号:数字芯片设计工程师,微信公众号:数字芯片设计工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    CC2540广播角色和观察者角色切换代码怎么编写?

    希望一个CC2540先通过观察者角色获取其他广播的广播数据,然后在切换为广播角色将这些数据广播给另外一个观察者?这样就需要编程实现观察者
    发表于 03-16 10:27

    RN4020观察者模式无法正常工作怎么回事

    中心,支持MLDP,并使UART流控制R,1//重新引导,使更改生效J,1//观察者模式你对这个问题有什么想法?谢谢,弗朗西斯科
    发表于 04-22 09:03

    属性观察者的特点

    属性观察者,类似于触发器。用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应。有如下特点: 1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet
    发表于 11-04 07:10

    观察者模式在嵌入式编程设计中有何作用

    观察者模式是最常见的模式之一。这种模式提供一种方法来时对象“监听”其他对象,而不需要修改任何数据服务器。在嵌入式领域,这意味着数据能够很容易分享给其他元素。
    发表于 12-22 08:31

    基于观察者模式的屏幕布局控件设计

    观察者模式作为设计模式中行为模式的一种,解决了上述具有一对多依赖关系对象重用问题。文中在分析观察者模式
    发表于 02-13 16:20 4次下载
    基于<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>的屏幕布局控件设计

    Java设计模式分析观察者

    观察者模式的流程跟报纸订阅方式一致,即:观察者模式=出版+订阅,只是名称不一样,出版
    发表于 09-26 17:36 0次下载

    在 Java8 环境下实现观察者模式的实例分析

    观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式,是四人组(GoF,即 Erich Gamma、Richard Helm、Ralph Johnson
    发表于 10-12 16:09 0次下载
    在 Java8 环境下实现<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>的实例分析

    GoF设计模式观察者模式

    现在有 2 个服务,Service A 和 Service B,通过 REST 接口通信;Service A 在某个业务场景下调用 Service B 的接口完成一个计算密集型任务,假设接口为 http://service_b/api/v1/domain;该任务运行时间很长,但 Service A 不想一直阻塞在接口调用上。为了满足 Service A 的要求,通常有 2 种方案:
    的头像 发表于 07-25 11:32 988次阅读

    设计模式行为型:观察者模式

    定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅模式、模型-视图模式、源-监听器模式或从属
    的头像 发表于 06-07 16:56 633次阅读
    设计<b class='flag-5'>模式</b>行为型:<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>

    一文详解UVM设计模式

    本篇是对UVM设计模式 ( 二 ) 参数化类、静态变量/方法/类、单例模式UVM_ROOT、工厂模式
    的头像 发表于 08-06 10:38 1562次阅读
    一文详解<b class='flag-5'>UVM</b>设计<b class='flag-5'>模式</b>

    UVM设计模式访问模式

    Visitor Pattern: 允许一个或者多个操作应用到一组对象上,解耦操作和对象本身。换言之,如果component的数据结构是比较稳定的,但其是易于变化的,那么使用访问模式是个不错的选择。
    的头像 发表于 08-11 09:28 706次阅读
    <b class='flag-5'>UVM</b>设计<b class='flag-5'>模式</b><b class='flag-5'>之</b>访问<b class='flag-5'>者</b><b class='flag-5'>模式</b>

    观察者模式,超详细!

    观察者模式建议你为发布类添加订阅机制, 让每个对象都能订阅或取消订阅发布事件流。 不要害怕! 这并不像听上去那么复杂。 实际上, 该机制包括 1) 一个用于存储订阅
    的头像 发表于 08-21 16:06 1109次阅读
    <b class='flag-5'>观察者</b><b class='flag-5'>模式</b>,超详细!

    基于观察者模式设计的框架-REB,使代码模块化

    设计模式里面的观察者模式,一直是作者想去设计一套框架来阐述这一个模式,因此REB(Rice Event Broker)就是为了完成观察者
    的头像 发表于 10-17 09:35 620次阅读
    基于<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>设计的框架-REB,使代码模块化

    一文解析BLE观察者模式回调机制

    nRF5 SDK从版本14开始,对事件回调机制做了更新,引入了观察者模式,以解耦不同BLE Layer对BLE事件的回调函数。
    的头像 发表于 11-27 10:07 899次阅读
    一文解析BLE<b class='flag-5'>观察者</b><b class='flag-5'>模式</b>回调机制

    什么是观察者设计模式?Golang中的观察者模式介绍

    当涉及到订单处理系统时,观察者设计模式可以用于实现订单状态的变化和通知。
    的头像 发表于 01-08 10:08 390次阅读