无名sh · 2022年12月17日 · 美国

如何优雅地结束UVM Test

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

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

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

  1. 本文的内容目录
    image.png
  2. Raising & Droping Objection机制
    3.1 drop_objection的函数原型
    下图是uvm1.1d源码中关于drop_objection函数的定义,如下图所示。
    image.png
    3.2 在seq中使用drop_objection
    下图是在sequence中调用drop_objection的示例,如下图所示,同样来自于uvm源码。
    image.png
    3.3 在scoreboard中使用drop_objection
    image.png
    3.4 在test中使用drop_objection
    image.png
    3.5 使用drop_objection总结
    结合上面的例子,强调两点:

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

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

  1. phase_ready_to_end(微信公众号《芯片验证日记》)
    4.1 phase_ready_to_end的官方解释
    image.png
    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立即返回。
image.png
4.4 在scoreboard中使用的一个示例
image.png
4.5 在scoreboard中使用的另一个示例
image.png

  1. set_drain_time
    5.1 set_drain_time的解释
    下图是官方对set_drain_time的解释,以及函数原型的定义。
    image.png
    5.2 set_drain_time的使用示例
    set_drain_time的使用方法,同样来自最权威的source code.
    image.png
    5.3 set_drain_time的另一个示例
    image.png
  2. 赠送uvm源码(微信公众号《芯片验证日记》)
    关注微信公众号《芯片验证日记》,后台回复” uvm”,即可获得uvm1.1d和uvm1.2的源代码,如下图所示:
    image.png
    写文章不易,如果觉得对您有帮助,麻烦一键三连,或者赏个鸡腿也行!
推荐阅读
关注数
7
文章数
10
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息