路科验证的个人空间 https://blog.eetop.cn/1561828 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

UVM序列篇之三:sequence和item(下)

已有 2483 次阅读| 2018-2-4 14:12 |个人分类:验证系统思想|系统分类:芯片设计

Flat Sequence

一个flat sequence往往由细小的sequence item群落构成,在此之上sequence中还有更多的信息来完备它自身需要实现的激励场景。一般对于一个flat sequence而言,它里面包含的信息有:

  • sequence item以及相关的constraint用来关联生成的item之间的关系,从而完善出一个flat sequence的时序形态。

  • 除了限制sequence item的内容,各个item之间的时序信息也需要由flat sequence给定,例如何时来生成下一个item并且发送至driver。

  • 对于需要与driver握手的情况(例如读操作),或者等待monitor的事件从而做出反应(例如slave的memory response数据响应操作),都需要sequence在收到另外一侧组件的状态之后,再决定下一步的操作,即响应具体事件从而创建对应的item并且发送出去。


接下来我们给出一个例子,帮助读者理解flat sequence的大致结构和用法:



输出结果:



这个例子中,我们暂时没有使用sequence的宏或者其它用来发送item的宏来表示sequence/item与sequencer之间的传送方法,而是用更直白的方式来描述这种层次关系和包含性。flat_seq自身可以看做是一个更长的数据包,其中数据包的具体内容、长度、地址等信息都包含在flat_seq中,在生成item的过程中,通过将自身的随机变量作为constraint来限定item的变量随机内容,这是flat sequence的大致处理方法。在上面例码中没有给出例如`uvm_do/`uvm_do_with/`uvm_create等宏是为了让读者首先认清sequence与item之间的关系。因此上面的例子也只给出了在flat_seq::body()任务中创建和随机item,而省略了发送item。关于完整的过程,我们将在稍后的《sequencer与sequence》中具体阐述常见的方法和宏。


而读者看到这里,可能会觉得,实际上bus_trans理应可以容纳更多的时序内容,而不应该只是一次数据传输。没错!作为数据传送的最小粒度,用户们有权利将它们扩展到更大的数据和时间范围,从而间接减小数据通信和处理的成本,提高整体的运行效率。因此,我们可以通过下面的这段例码来对之前的例码进行改建,从而起到一样的效果:



输出结果:



从这段修改后的例码可以看到,我们可以将一段完整发生在数据传输中的,更长的数据都“收编”在一个bus_trans中,增加这个item粒度的层次,让它变得更有“气质”。而一旦拥有了更成熟的、更切割得合适的item,在上层的flat sequence使用过程中那就更顺手一些了。譬如上面的例子中,flat_seq类不再操本不属于自己的闲心,考虑数据的内容,而只应该考虑这个数据包的长度、地址等信息,因为扩充随机数据的责任一般由item负责就足够了,而使用flat_seq的用户也无需考虑多余的constraint。


Hierarchical Sequence

Hierarchical sequence区别于flat sequence的地方在于,它可以使用其他的sequence,当然还有item,这么做是为了创建更丰富的激励场景。通过层次嵌套的关系,可以使得hierarchical sequence可以同时使用其它hierarchical sequence、flat sequence和sequence item,这也就意味着,如果底层的sequence item和flat sequence的粒度得当,那么就可以充分利用这些sequence/item来构成形式各样的hierarchical sequence。接下来,我们就着之前定义的bus_trans和flat_seq来给出一个简单的hier_seq,帮助读者们理解这些类之间的联系:



从hier_seq::body()来看,它其中包含有bus_trans t1,t2和flat_seq s1,s2。而它的层次关系就体现在了对于各个sequence/item的协调上面。例码中使用了`uvm_do_with宏,这个宏完成了三个步骤:

  • sequence或者item的创建

  • sequence或者item的随机化

  • sequence或者item的传送


区别于之前例码,这个例码通过`uvm_do_with宏帮助读者理解,所谓的sequence的复用也就是通过高层的sequence来嵌套底层的sequence/item,最后来创建期望的场景。上面的例子中,既有串行的激励关系,也有并行的激励关系,而在更复杂的场景中,用户还可以考虑加入事件同步(通过uvm_event、uvm_barrier或者interface上的信号变化),或者一定的延迟关系(最好基于时钟)来完成sequence/item之间的时序关系。


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


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 253

    粉丝
  • 25

    好友
  • 33

    获赞
  • 45

    评论
  • 访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 10:09 , Processed in 0.013882 second(s), 12 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部