声明:本人所有权属路科验证,本人仅为个人学习方便将文章整理至此。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

有了UVM的世界观,知道这座城市的建筑设计理念,也跟着码师们(实在不忍心用码农……)一起修建了各成独立环境的组件群落。读者们在经过一番实践,经过上一章讲的组件之间的通信方式,开辟了各个建筑之间的道路、桥梁和河道以后,就可以进入紧张繁忙的物流期了。如果城市里面没有交通,那么显然不会有多热闹。

在本章中,我们将主要围绕下面几个核心词来阐述它们的作用、主要分类以及之间的互动关系:

  • sequence item

  • sequence

  • sequencer

  • driver

如果按照交通道路的车流来打比方,sequence就是道路,sequence item是道路上行驶的货车,sequencer是目的地的关卡,而driver便是最终目的地卸货的地方。从软件实施的层面来讲,这里的货车是从sequence一端出发的,再经过了sequencer,最终抵达了driver,经过driver的卸货,每一辆的货车也就完成了它的使命。而driver对每一件到站的货物,经过它的扫面处理,将它分解为更小的信息量,提供给DUT。在这个过程中,不同的角色中有下面的这些软件互动:

  1. sequence对象自身会产生目标数量的sequence item对象。借助于SV的随机化和sequence item对随机化的支持,使得产生的每个sequence item对象中的数据内容都不相同。
  2. 产生的sequence item会经过sequencer再流向driver。
  3. driver得到了每一个sequence item,经过数据解析,再将数据按照与DUT的物理接口协议写入到接口上,对DUT形成有效激励。
  4. 如果有必要的时候,driver在每解析并且消化完一个sequence item,它也会将最后的状态信息同sequence item对象本身再度返回给sequencer,最终抵达sequence对象一侧。这么做的目的在于,有的时候sequence需要得知driver与DUT互动的状态,这就需要driver仍然有一个回路再将处理了的sequence item对象和状态信息写回到sequence一侧。

贯穿本章的几个重要概念,在上面的互动中可以看到,sequence item是每一次driver与DUT互动的最小粒度内容。例如,DUT如果是一个slave端,driver扮演master去访问DUT的寄存器,那么sequence item的需要定义的数据信息至少包括访问地址、命令码、数据和状态值,这样的信息在driver取得以后,会用时序的方式在interface一侧激励送给DUT。按照一般总线做寄存器访问的方式,这样的访问在时序上大致会保持几个时钟周期,直至数据传送完毕,而由driver再准备发起下一次的操作。用户除了可以在声明sequence item时,添加必要的成员变量,也可以添加对这些成员变量进行操作的成员方法。这些添加了的成员变量,需要充分考虑在通过sequencer传递到driver前是否需要随机化,例如上面提到的例子中的访问地址和数据等等,都应该通过SV关键词rand声明为可以随机化的变量,以便后期进行随机化处理。

那么对于一个sequence而言,它会产生多个sequence item,也可以产生多个sequence。从产生层次来看,sequence item是最小粒度,它可以由sequence生成,而相关sequence也可以进一步组织和实现层次化,最终由更上层的sequence进行调度。这么看来,sequence可以看做是产生激励内容的载体。

在sequence与driver之间起到桥梁作用的是sequencer。由于sequencer与driver均是component组件,它们之间的通信也是通过TLM端口实现的。

在上一章中提到过,TLM端口在例化中需要对通信参数进行指定,这里的通信参数即sequence item种类。由于这一限制,使得sequencer到driver的传输数据类型不能改变,同时与sequencer挂接的sequence内创建的sequence item类型也应为指定类型。这就跟一个投币机的原理有一些类似,如果顾客投递的是1块钱,那么它会被识别到相应的储币区域,而如果顾客投递的是5毛钱,那么它肯定会被区别对待的。  

在激励驱动链的最后一道关卡是driver。这个家伙胃口还蛮挑剔的。它就跟投币机一样只认了同一个类型的“钢镚儿”。对于常见的用法,driver往往是一个sequence item消化完,报告给sequencer和sequence,同时再请求消化下一个sequence item。所以,driver看起来永远喂不饱,同时还又对食物很挑剔。在消化每一个sequence item之前,该item中的数据是已经随机化好的,所以每个item一般都是各不相同的。driver自己并不会轻易修改item中的值,它会把item中的数据按照与DUT连接接口的物理协议按照时序关系驱动到端口上面。例如对于一个标准的写操作,driver不但需要按照时序依次驱动地址总线、命令码总线和数据总线,还应该等待从端的返回信号和状态值,这样才算完成了一次数据写传输。又如果是一个读操作,driver还应该在驱动完地址总线和命令码总线之后,等待返回信号、状态值和读出的数据,并且在有需要的情况下,将读出的数据再写回到sequence item中,通过sequencer最后返回给sequence。

从类的继承性来看,uvm_sequence_item和uvm_sequence是基于uvm_object,这不同于uvm_component可以在build阶段作为UVM环境的“不动产”创建和配置,而是可以在任何的阶段创建。这种类的继承带来的UVM应用区别在于:

  • 由于无法判定环境在run阶段运行什么时间点会创建sequence和挂载(attach)到sequencer上面,所以无法通过简单的UVM结构来识别sequence的运行阶段。
  • 正是由于uvm_object独立于build阶段之外,这使得用户可以有选择地、动态地在合适的时间点挂载想要的sequence和item。
  • 考虑到uvm_sequence和uvm_sequence_item并不处于UVM结构当中,所以顶层在做配置时,无法按照层次关系直接配置到sequence中。而如果sequence一旦活动起来,那么它必须挂载到一个sequencer上,这样sequence可以依赖于sequencer的结构关系,间接通过sequencer来获取顶层的配置和更多的顶层信息。

在本文的最后,需要额外提出的一点是,从常规的认知方式来看,用户可能更愿意将时序控制的权利赋予sequence。这种从sequence产生item,继而将item通过sequencer推送给driver的方式,实际上有一些“越俎代庖”的嫌疑。毕竟如果按照责任明确划分的话,sequence应该是只负责生成item的内容,而不应该控制item消化的方式和时序,而驱动激励的时序这一任务应当由driver来完成。读到这里,也许一些读者可能会困惑,毕竟实际应用中,我们可以添加一些实用的时间延迟或者事件触发来控制item的生成和传送,但是请注意,item的生成和传送,并不是直接表示了最终的驱动时序,决定这一点的还包括sequencer和driver。

sequencer之所以作为一个“路由”管道,停在sequence和driver之间,看重的是它的两个特点:

  • sequencer作为一个组件,它可以通过TLM端口与driver传送item对象。

  • sequencer在面向多个并行sequence时,它有充分的仲裁机制来实现合理分配item传送来模拟并行item数据传送至driver的测试场景。

那么是否sequencer应该从sequence一侧得到item数据,再推送给driver呢?或者,在sequence、sequencer与driver之间发生的数据传送请求应由谁首先发出?而数据流向又是从谁到谁呢?关于这一个具体的TLM传输机制,我们将会在其后的《sequencer和driver》中详细介绍。而在这里,希望读者首先认清的是,数据传送机制采用的是get模式,而不是put模式。我们在TLM传输中为读者们就介绍过典型的两种数据传送场景,如果是put模式,那么应该是sequencer将数据put到driver,而如果是get模式,那么应当是driver从sequencer获取item。之所以选择get模式,UVM是基于下面的考虑:

  • 如果是get模式,那么当item从sequence产生,穿过sequencer到达driver时,我们就可以结束该传输(假如不需要返回值的话)。而如果是put模式,则必须是sequencer将item传送至driver,同时必须收到返回值才可以发起下一次的传输。这从效率上看,是有差别的。

  • 如果需要让sequencer拥有仲裁特性,可以使得多个sequence同时挂载到sequencer上面,那么get模式更符合“工学设计”。这是因为driver作为initiator,一旦发出get请求,它会先通过sequencer,继而获得仲裁后的item。

如果读者对于究竟应该采用get模式还是put模式有疑问的话,不妨想象一个极端的情况,sequence的职责如果仅仅是个“水池”,那么用水的权利应该交给终端的driver,还是交给作为调度站的sequencer呢?

作为一个开着item,或者坐到sequence中浏览观光的新手,读者们可以伴随路桑在下一节《sequence和item》中欣赏这两个对象之间各种悱恻缠绵的关系。

谢谢你对路科验证的关注,也欢迎你分享和转发真正的技术价值,你的支持是我们保持前行的动力。

转载于:https://www.cnblogs.com/YINBin/p/6965263.html

UVM序列篇之一:新手上路相关推荐

  1. 固定字符结尾的正则_新手上路:图文解读助你理解和使用正则表达式

    选自janmeppe.com 作者:Jan Meppe 机器之心编译 参与:韩放.杜伟 这篇博客是关于正则表达式(regex)的插图指南,旨在为那些从来没有使用过正则表达式,想尝试但又望而生畏的新手提 ...

  2. python自然语言处理入门-新手上路

    新手上路 博主微信公众号(左).Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步! 目录 摘要 1. 自然语言与编程语言 2. 自然语言处理的层次 2.1 语 ...

  3. python必备基础代码-新手上路必学的Python函数基础知识,全在这里了(多段代码举例)...

    原标题:新手上路必学的Python函数基础知识,全在这里了(多段代码举例) 导读:函数是Python中最重要.最基础的代码组织和代码复用方式.根据经验,如果你需要多次重复相同或类似的代码,就非常值得写 ...

  4. HanLP《自然语言处理入门》笔记--1.新手上路

    文章目录 1. 新手上路 1.1 自然语言与编程语言的比较 1.2 自然语言处理的层次 1.3 自然语言处理的流派 1.4 机器学习 1.5 语料库 1.6 开源工具 1.7 总结 1.8 GitHu ...

  5. 新手上路注意事项及驾车技巧

    新手上路总则 其实,每一个新手都曾经历过上路的窘迫,如果能够顺利度过最初实习期的话,将会受益终生.每一位驾驶员都经历过初次上路的忐忑不安,眼盯前方,双手紧握转向盘,身体僵直前倾,远离前车,缓慢前行,起 ...

  6. 【新手上路】语法入门算法入门题单

    作者:王清楚 链接:[新手上路]语法入门&算法入门题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 来源:牛客网 介绍:本题单分为语法入门和算法 ...

  7. 3dsmax插件开发新手上路

    感谢老狼同学的这篇文章. 点击可看原帖地址 [原创]3dsmax插件开发新手上路 作者:老狼 email: cgwolver@163.com QQ:4197680024 我尽量把话题说的通俗易懂一点, ...

  8. 新手上路:ADAMS 基础知识讲解(图文并茂)【转载仿真论坛】

    引用 Baker 的 新手上路:ADAMS 基础知识讲解(图文并茂)[转载仿真论坛] 经过不知道多少个日夜,终于出来一个雏形了,内容主要是版内的帖子总结,这个为1.0版本,由于时间的问题,内容还不全, ...

  9. 新手上路C语言初识C语言(其二)

    文章目录 新手上路C语言初识C语言(其二) 导入 一.变量的作用域和生命周期 二.常量 字面常量 const修饰的常变量 #define定义的标识符常量 枚举常量 三.字符串 四.转义字符 五.注释 ...

最新文章

  1. es日期format_elasticsearch存储日期格式字段
  2. 特斯拉FSD车端感知解析
  3. Spring boot 启动后执行特定的操作
  4. linux apache 文件服务器,Linux下搭建Apache服务器全过程详解
  5. 获取手机当前显示的ViewController
  6. 别小看不起眼的电阻,里面大有学问!
  7. dcase_util教程(二)——各单元介绍
  8. 三年经验前端社招——慧择网
  9. Android中让Service被关闭后再重新启动
  10. javascript编程题_如何开始使用JavaScript进行竞争性编程
  11. error: undefined reference to `_imp__glXXX@XX'
  12. delphi 提示class tparamlistbox not found_通达信主图K线变色波段提示指标公式
  13. ROS入门笔记(二):ROS安装与环境配置及卸载(重点)
  14. E-MapReduce 2.0.0 版本发布
  15. Chip Probe(CP)测试
  16. Niushop wap端前台模板设置
  17. 视频教程-项目经理俱乐部-项目实战.职场求生.敏捷.企业管理-敏捷开发
  18. 打开计算机文档左边,打开.chm的文件后,看不到左边的目录,该怎样解决?
  19. win10卸载软件_win10系统卸载软件超详细教程
  20. 台式机安装windowsXP和ubuntu双系统

热门文章

  1. 论文 | 多传感器数据深度图的融合:最近基于深度学习的方法(下)
  2. 【1024】我的CSDN博客之路,感谢CSDN,我们一路同行!深度学习系列专栏回顾
  3. 面向对象真的需要继承吗?
  4. GoogLeNet的心路历程(二)
  5. Hybrid A*论文解析(3)
  6. signature=0d9b3a8f96c5f64e92cd85aaf7e70ac0,Scale controller
  7. vue中如何调取api_vue-router在history模式下如何调用api?
  8. php转移单引号,php如何转义单引号
  9. android开发 视图联动_android开发_ViewGroup(组视图)-- 五大布局
  10. Windows 安装 Redis