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

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

3天内不再提示

浅谈UVM之sequence/item见解(上)

西西 2018-02-19 15:52 次阅读

item指的是uvm_sequence_item, Sequence Item具备UVM核心基类所必要的数据操作方法,对于激励的生成和场景控制,是由sequence来编织的,item应该有什么用途的数据成员被定义在item中呢?文章进行了划分。

无论是自驾item,穿过sequencer交通站,通往终点driver,还是坐上sequence的大巴,一路沿途观光,最终跟随导游停靠到风景点driver,在介绍如何驾驶item和sequence,遵守什么交规,最终可以有序地穿过sequencer抵达driver之前,读者又必要首先认识sequence与item之间的关系。这里的sequence值的是类uvm_sequence,而item指的是uvm_sequence_item,为了文章的简洁,我们称之为sequence和item。对于激励的生成和场景控制,是由sequence来编织的,而对于激励所需要的具体数据和控制要求,则是从item中的成员数据得来的。

Sequence Item

我们已经提出item是基于uvm_object,这表明了它具备UVM核心基类所必要的数据操作方法,例如copy、clone、compare、record等,这里我们不再做赘述。读者需要了解到的是,通常对于一个item,应该有什么用途的数据成员被定义在item中呢?我们可以将它们划分下如下几类:

控制类。譬如总线协议上的读写类型、数据长度、传送模式等。

负载类。一般即数据总线上的数据包。

配置类。这往往是用来控制driver的驱动行为,例如命令driver的发送间隔或者有无错误插入。

调试类。用来标记一些额外的信息,用来方便调试,例如该对象的实例序号、创建时间、被driver解析的时间始末等。

下面的例码是一段item的定义,从这段代码中读者可以看到上面提到的各种用途的数据使用情况:

浅谈UVM之sequence/item见解(上)

浅谈UVM之sequence/item见解(上)

输出结果:

浅谈UVM之sequence/item见解(上)

上面的这段代码中,不但给出了一个较为典型的item定义,同时也伴有一些item使用时的特点:

如果数据域属于将来需要用来做驱动,那么用户应考虑定义为rand类型,同时按照驱动协议给出合适的constraint。

由于item本身的数据属性,为了充分利用UVM域声明的特性,我们建议将必要的数据成员都通过`uvm_field_xxx宏来声明,以便日后的基本函数操作,例如上面的print()函数。

读者也注意到了一点,上面的例子中,t1没有随机化而t2随机化了,这种差别在item通往sequencer之前是很明显的。因为UVM要求item的创建和随机化都应该发生在sequence的body()任务中,而不是在sequencer或者driver中。

如果按照item对象的生命周期来区分,它的生命应该开始于sequence中的创建,而后经历了随机化和穿越sequencer最终到达driver,直到被driver消化之后,它的生命周期一般来讲才算寿终正寝。之所以要突出这一点,是因为一些用户在实际中,会不恰当地直接操作item对象,直接修改其中的数据,或者将它的句柄发送给其它组件使用,这就无形中修改了item的基因,或者延长了一个item对象的寿命。这种不合适的对象操作方式是用户需要注意的,可以取代的方式则是合理利用copy和clone等方法。

接下来我们需要理清item和sequence,以及sequence群落之间的关系。从简而言,一个sequence包含了一些有序组织起来的item实例,考虑到item在创建后需要被随机化,sequence在声明时也需要预留一些可供外部随机化的变量,这些随机变量一部分是用来通过层级传递来控制item对象中的变量的,一部分也是用来对item对象之间加以组织和时序控制的。为了加以区分几种常见的sequence定义方式,我们在介绍后续的sequence之前,首先将sequence可以分类为:

扁平类(flat sequence)。这一类中往往只用来组织更细小的粒度,即item示例的组织。

层次类(hierarchical sequence)。这一类则是由更高层的sequence用来组织底层的sequence,进而让这些sequence或者按照顺序的方式,或者按照并行的方式,挂载到同一个sequencer上。

虚拟类(virtual sequence)。这一类则是最终控制整个测试场景的方式,鉴于整个环境中往往存在不同种类的sequencer和其对应的sequence,我们需要一个虚拟的sequence来协调顶层的测试场景。之所以称这个方式为virtual sequence,是因为该序列本省并不固定挂载于某一种sequencer类型上,而是它会将其内部的各种不同类型的sequence最终挂载到不同的目标sequencer上面。这也是最大的不同于hierarchical sequence的一点。

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

    关注

    0

    文章

    181

    浏览量

    19125
  • sequence
    +关注

    关注

    0

    文章

    23

    浏览量

    2829
收藏 人收藏

    评论

    相关推荐

    数字IC验证“构成uvm测试平台的主要组件”(4)连载中...

    设备之间的产品了,事物是组件的操作对象,uvm也对事物建模提供了基类进行扩展,对事物级的建模需要从uvm sequence item扩展。而产生事物对象的事物发生器
    发表于 01-22 15:33

    数字IC验证“搭建一个可以运行的uvm测试平台”(5)连载中...

    对象,就是transaction。  验证工程师需要根据不同的项目对项目中的事务进行建模,事物对象的类需要从uvm sequence item这个基类进行扩展,为了事物在产生的时候可以自动的随机化,一般
    发表于 01-26 10:05

    UVM sequence分层有哪几种方式呢

    。class upper_env_item_seq extends uvm_sequence #(lower_env_item);... // Constructor and UVM
    发表于 04-11 16:37

    请问一下在UVM中的UVMsequences是什么意思啊

    UVM方法学中,UVMsequences 是寿命有限的对象。UVM sequences从uvm_sequence_item基类扩展得到,uvm_sequence_item进一步从
    发表于 04-11 16:43

    UVM sequence分层的几种体现

    验证环境需要对数据进行分层。例如,将32比特的寄存器读写封装成数据读写和状态读写等实际业务操作等或者对底层sequence进行一些随机控制等。实现这种分层可以有两种方式:1、Sequence
    发表于 04-14 11:08

    如何配置sequence的仲裁算法和优先级及中断sequence的执行

    sequence还是“雨露均沾”:实际UVM给我们预设了六种仲裁算法供选择,同时保留了用户自定义的接口。默认情况下,使用的仲裁算法是UVM_SEQ_ARB_FIFO,严格按照先进先
    发表于 09-23 14:35

    介绍两种交互方法来完成Sequencer和Driver的握手机制

    指定请求和响应sequence_item的具体类型,在默认情况下,请求和响应sequence_item的类型为uvm_sequence_itemuvm_driver是
    发表于 09-23 14:39

    sequence item实际应用中应该包含哪些东西

    等。基于以上这些需求,在UVM类库提供的代码示例基础,整理成以下一般框架,可用于指导日常开发。02 用户自定义方法在上面定义的sequence item框架中,有一部分是Utilit
    发表于 09-23 14:42

    UVM中seq.start()和default_sequence执行顺序

      1. 问题  假如用以下两种方式启动sequence,方法1用sequence的start()方法启动seq1,方法2用UVM的default_sequence机制启动seq2。那
    发表于 04-04 17:15

    UVMsequence/item见解 sequencer特性及应用(下)

    本文将接着分享sequencer的相关知识,对于sequencer的仲裁特性有几种可选,UVM_SEQ_ARB_FIFO ;UVM
    的头像 发表于 02-19 10:14 4762次阅读
    谈<b class='flag-5'>UVM</b><b class='flag-5'>之</b><b class='flag-5'>sequence</b>/<b class='flag-5'>item</b><b class='flag-5'>见解</b> sequencer特性及应用(下)

    UVM sequence机制中response的简单使用

    sequence作为UVM几个核心机制之一,它有效地将transaction的产生从driver中剥离出来,并且通过和sequencer相互配合,成功地将driver的负担降低至仅聚焦于根据协议将
    的头像 发表于 09-22 09:26 2338次阅读

    start()如何执行uvm_sequence

    要使用start()启动一个sequence,就必须要指定相应的sequencer句柄, **另外的几个选项一般用不** 。其中
    的头像 发表于 03-21 11:37 688次阅读
    start()如何执行<b class='flag-5'>uvm_sequence</b>

    UVMsequence的那些事儿

    将 生成测试case的语句 从 main_phase 中独立出来,使得使用不同测试用例时,只需要修改sequence部分即可,而不用关注 UVM剩余部分。
    的头像 发表于 05-26 15:17 1014次阅读
    <b class='flag-5'>UVM</b>中<b class='flag-5'>sequence</b>的那些事儿

    在Sequencer启动一个Sequence

    Sequencer默认不执行任何Sequence。验证工程师可以通过调用start()启动一个Sequence,也可以通过uvm_config_db指定一个自动启动的Sequence
    的头像 发表于 06-10 09:10 774次阅读
    在Sequencer<b class='flag-5'>上</b>启动一个<b class='flag-5'>Sequence</b>

    UVM设计中的sequence启动方式有哪几种呢?

    本篇介绍UVM中的sequence,这是UVM中最基础的部分。对于前面介绍的uvm_callback, uvm_visitor等,很少被使用
    的头像 发表于 08-17 10:07 3925次阅读
    <b class='flag-5'>UVM</b>设计中的<b class='flag-5'>sequence</b>启动方式有哪几种呢?