如何优雅地结束UVM Test

电子说

1.3w人已加入

描述

1.   前言

众所周知,在传统的测试平台中,通常在完成复位、配置、数据传输和自动检查等所有步骤后,通过调用verilog的系统函数$finish来结束仿真。

但相对于传统的测试平台,UVM在Testbench架构的几乎每个方面都做了创新,当然结束仿真的控制也发生了很大变化。在UVM验证环境中结束仿真最常用的就是drop_objection机制,当然所有phase都结束后,还是调用系统函数$finish来结束仿真。

下面,分享一下在UVM验证环境中,结束仿真的几种方式,这些结束方式,适用于不同的应用场景。我的表达能力不强,大家重点看代码。

2.   本文的内容目录

UVM

3.   Raising & Droping Objection机制

3.1 drop_objection的函数原型

下图是uvm1.1d源码中关于drop_objection函数的定义,如下图所示。

UVM

3.2 在seq中使用drop_objection

下图是在sequence中调用drop_objection的示例,如下图所示,同样来自于uvm源码。

UVM

3.3 在scoreboard中使用drop_objection

UVM

3.4 在test中使用drop_objection

UVM

3.5 使用drop_objection总结

结合上面的例子,强调两点:

一是:drop_objection可以用在任何一个component中;当然也可以用在sequence中,但不可以用在其他uvm_object类里面,因为uvm_object里面没有phase的概念,那sequence其实也没有phase的概念,为什么可以?这也是一个小知识点,有的面试官问的仔细了,也可能问到,我就不展开了。

二是:在实际项目中的整个验证环境中,最好只用一对raise_objection/drop_objection,不要在很多组件中都使用它,否则很容易造成死锁,而且很难debug,尽管uvm的语法也允许这么做。

4.   phase_ready_to_end(微信公众号《芯片验证日记》)

4.1 phase_ready_to_end的官方解释

UVM

4.2  phase_ready_to_end的理解

phase_ready_to_end(uvm_phase phase)是组件类的回调方法(函数),当相应phase的所有objection均被放下并且该phase将要结束时,会调用该方法。组件类可以使用此回调方法来定义phase即将结束时需要执行的任何功能。例如,如果某个组件希望将phase结束延迟到某个条件,甚至在所有objections均被放下之后,也可以使用此回调方法来完成。再比如,如果一个激励或应答sequence正在运行,在主sequence结束之前,则可以使用main_phase()中的phase_ready_to_end()回调方法来停止那些激励或应答sequence。再比如一个component想要延迟某个run-time phase的生命周期,那么可以在所有的objection都被dropped之后使用这个回调方法。

对于sequences, tests和许多完整的测试平台,在phase的正常寿命期间phase objections的提起和撤销是足够的。但是,有时某个组件不希望在phase的正常生命周期内主动提起和撤销objections,但确实希望延迟从一个phase到下一类phase的过渡。这在事务中经常出现这种情况,出于性能原因,不能针对每笔事务提出objection,并且通常情况下是端到端的记分板。为了在所有其他组件同意该phase应该结束之后延迟phase结束,该组件应该在phase_ready_to_end方法中提出objections。然后它负责在组件的主体中或在phase_ready_end_method的任务fork / join none中撤销这些objections。

4.3 在env中使用的一个示例

注意,phase_ready_to_end是一个function,但用fork/join_none将wait_for_ok_to_finish和drop_objection进行了处理,这允许function立即返回。

UVM

4.4 在scoreboard中使用的一个示例

UVM

4.5 在scoreboard中使用的另一个示例

UVM

5.   set_drain_time

5.1 set_drain_time的解释

下图是官方对set_drain_time的解释,以及函数原型的定义。

UVM

5.2 set_drain_time的使用示例

set_drain_time的使用方法,同样来自最权威的source code.

UVM

5.3 set_drain_time的另一个示例

UVM

写文章不易,如果觉得对您有帮助,麻烦一键三连,或者赏个鸡腿也行!

审核编辑 黄昊宇

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分