objection是uvm框架中用来同步不同组件的相同phase,以及决定当前测试用例什么时候结束(end-of-test)的机制,这也是用户在拿到uvm之后最直白的使用场景。本篇文章除了介绍objection的工作原理和常规使用方式,还会介绍objection的一些非常规用法。
01 objection工作原理
为什么把同步phase或者说管理仿真结束的机制叫做objection?这是个没有多少实际意义的问题,不过理清楚之后,也许你再也不会忘了objection机制的用途。
按照uvm reference的介绍:“objections provide a facility for coordinating status information between two or more participating components, objects, and even module-based ip. ” 这个描述还是比较抽象,说objection用于协调多个对象之间的状态信息,不过可以简单理解成就是“同步”。
本系列前面的文章【深入phase机制,看懂phase机制实现原理】介绍到,基于uvm的仿真程序执行严格按照phase来执行,而每一级phase都按照uvm定义的状态机做跳转,其中有一个状态比较特殊,叫uvm_phase_read_to_end。
这个状态的特点是:只有当同级phase的所有objection都被撤销(drop)之后(通过计数器实现),才会进入该状态;进入该状态之后,会遍历执行验证组件中定义的phase_ready_to_end回调函数,待执行完成之后且没有objection被置起(raise),才会跳转到下一个状态uvm_phase_ended。
按照这个逻辑,以耗时(time-consuming)phase为例,这里忽略pre_*和post_*的phase,可以得到下面这个执行流图。图中从左往右表示执行的先后顺序,可以看到,相同phase都是在同一时刻开始往后执行,也就实现了“同步”。
最后怎么去理解“objection”这个词?可以这么说,仿真执行过程中,仿真程序会不停地问:“我要进入下一个phase了,还有谁有意见?”,那些还没有执行完的phase线程就会大喊:“我反对我反对!”,于是仿真程序就等在那了,最终只有等到所有人都执行完了,才得以退出当前phase。objection也符合“a feeling or expression of disapproval”的释义了。
02 objection常规用法
objection的常规用法很简单,在很多文章中都会提到,即raise_objection(),drop_objection() 和 set_drain_time()。这三件套是我们应用objection机制时最常用到的方法。
objection计数器在每次调用raise_objection()和drop_objection()会进行增减。在实际应用中,不建议在很多组件的耗时phase中都去raise-drop objection,两个原因:一个是objection的控制会比较分散,不便于objection的管理;另一个是反复的调用会使得仿真效率比较低。可以考虑在测试用例顶层和sequence中进行objection的控制。示例代码如下:
以上是uvm 1.1对objection的用法。到了uvm 1.2,弃用了uvm_sequence_base:: starting_phase这个变量,改用set_starting_phase和get_starting_phase两个方法;弃用了raise_objection和drop_objection两个方法,改用uvm_sequence_base:: set_automatic_phase_objection。这些改进的目的是优化objection的使用体验,uvm library帮你多省掉了一些代码和出错的机会。示例代码如下:
set_drain_time()方法的使用场景是在objection都撤销了之后,往后延长仿真结束的时间。这么做的目的是让dut有多余的时间去完成动作,使其完整响应我们输入的测试激励。
除了set_drain_time()方法可以解决这个问题,我们还可以在撤销objection之前去做一些有意义的条件判断,也可以在test的phase_ready_to_end回调函数中去实现一些检查逻辑。不过还是set_drain_time()用的多。
03 objection非常规用法
非常规用法指的是平时不怎么用得到的使用场景,但这些使用方法在有些场景下会有用,比如调试。
追踪objection状态用的命令行参数+uvm_objection_trace。当仿真命令加上该参数,就可以在仿真日志中看到谁谁谁置起了objection,谁谁谁撤销了objection,以及objection计数器的数值等等。
另外我们可以通过phase.get_objection()拿到负责同步当前phase的objection句柄,之后就可以调用该句柄有的一些方法。比如get_drain_time()方法可以返回当前objection对象的排空时间(drain time);clear()方法可以直接清零当前objection对象的计数器,且释放对当前phase的同步;display_objections()方法可以打印该objection对象的具体信息等。
如何自己DIY会自动打开的口罩?
分析百度新型国产77GHz毫米波雷达的核心竞争力
新零售如何引领未来全新的商业模式?
产能过剩下蜂巢能源的应变“思路”
DRC规则是指什么?怎样使用DRC规则减少PCB改版次数呢?
聊一聊所谓的Objection机制
Premier Farnell将成为英飞凌全球特许分销商
高通芯片+Win10组合能否打破传统PC产业的Wintel垄断?
无压烧结银成为DA5联盟选择功率芯片连接材料的优选方案之一
双远心镜头:让视觉检测更精准、高效!
LED显示屏发展高度成熟 但行业日益两极分化
北京大兴国际机场正式开始启动空中建设
基于SAA1160A设计的嵌入式USB主控制方案
医疗信息通信设计和人体域网络的发展介绍
关于CWDM光模块最详细的介绍
行业 | 德赛电池拟26亿元投建物联网电源高端智造项目
2019年VR产业图谱公布 VR已经有发展到巨大转折点的征兆
蓄电池极板活性物质脱落是什么原因,怎样判断?
预计2023年,亚洲的物联网支出将达到3986亿美元
电力系统在连锁故障中的薄弱环节的分析