前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UVM(九)之sequence机制

UVM(九)之sequence机制

作者头像
瓜大三哥
发布2018-02-26 14:45:20
2K0
发布2018-02-26 14:45:20
举报
文章被收录于专栏:瓜大三哥瓜大三哥

UVM(九)之sequence机制

如果说transaction是子弹的话,那么sequence无疑就是弹夹了。在整个的UVM验证平台中,sequence负责transaction的产生,并通过sequence发送给driver,driver则根据transaction里存储的信息产生激励。要产生不同的transaction,那么就要在sequence中下功夫。验证中要对DUT施加不同的激励,也就是施加不同的case,在UVM中,不同的case的差异主要是就是体现在sequence的不同上。通过控制sequence,可以完美的产生各种不同的激励。

sequence的另外一个重要的作用就是控制整个验证平台的关闭,

1. 激励信息的产生与驱动的分离

为了防止每次修改case而可能改变本身代码,所以需要将信息的产生独立实现。

2. 数据流的独立

UVM为了解决这个问题,引入了sequence机制,在解决的过程中还使用了factory机制,config机制。使用sequence机制之后,在不同的case中,把不同的sequence设置成sequencer的main_phase的default_sequence。当sequencer执行到main_phase时,发现有default_phase,那么他就会把这个sequence启动起来。

3. sequence的启动和执行

假设有如下的sequence定义:

那么启动一个sequence就应该这么做:

可见,要启动一个sequence非常简单,第一步就是把这个sequence给实例化,第二部就是调用sequence的start任务,调用时要传入sequencer参数。

4. 通过sequence控制验证平台的关闭

伴随着sequence机制的使用,数据流完全的独立出来了,但是一个新的问题产生了:driver中来raise_objection和drop_objection。现在,数据的产生从driver中完全的独立出去了,那么作为driver来说,它只负责从sequencer中索要transaction,如果索要到了那么就把这个transaction驱动到接口上,如果没有,那么就等在那里。也就是说driver失去了控制验证平台退出的能力。

raise_objection属于phase的一个函数,即我们只能采用如下方式调用此函数:phase.raise_objection(this);

而phase是属于component的一个概念,是component专属的东西,而sequence的本质是objection,是没有phase的,那么怎么办?这个问题其实非常简单,可以在uvm_sequence中添加一个指向phase的指针,然后当sequencer在main_phase中启动default_sequence时,把sequencer的main_phase中的phase赋值给sequence中这个指针,这样在sequence中就可以进行objection操作了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档