当前位置: 首页 > 工具软件 > objection > 使用案例 >

7.25学习记录-objection机制

鲁彬炳
2023-12-01

1.drop之前一定要raise

  objectionb本身的意思是反对,而drop_objection是撤销反对意见,试想,如果在和别人沟通的时候,你还没提出反对意见,就忽然说撤销刚才的反对意见,会不会让人觉得奇怪呢,所以为了良好的沟通,drop之前一定要先raise。

2.验证平台的关闭

  当进入某一phase时,UVM会收集此phase提出的所有objection,并且实时监控所有的objection是否被撤销。当发现所有被撤销后,就会关闭此phase,进入下一phase,当发现所有phase执行完毕后,就会调用$finish关掉整个验证平台。故在UVM中想执行一些耗费时间的代码,就要在此phase下任意一个component中至少raise一次objection。加延时是没用的(如#100)。

3.特殊的run_phase

  结论2不适用于run_phase,run_phase和所有动态运行的phase是并行的,所以12个动态运行的phase有objection被提起的话,run_phase不用raise就可以自动执行。也就是说run_phase有两个选择可以使其中代码运行。选择1是其他动态运行的phase有objection被raise,但此时run_phase的运行手其他phase控制。选择2是run_phase自己raise,这种情况下运行时间由自己控制。

4.objection的位置

  上述我们了解了挂起与撤销,以及objection是如何控制仿真结束的,那objection应该放在哪里呢??哪里都可以放吗?首先不建议放在driver和monitor中,因为这两者都是无限循环的,会导致无法退出。其次可以放在scoreboard中,最后最好是放在sequence中,在sequ中提起sequencer的objection,当sequence完成后,再撤销objection。毕竟UVM的设计哲学就是全部用sequence来控制激励的生成。

5.set_drain_time的使用

  为什么要使用:任何功能模块都存在延时,而DUT的输入和输出之间也存在延时。在sequence中,n时刻发送完最后一个tranction,如果此时drop_objection,那么n+p时刻DUT输出的包无法收到。因此,drop后需要延时操作。

  怎么使用:每个sequence都需要延时,而延时的大小是随机的,我们只能根据吉利选择一个最大的延时。而假设我们设置好延时后,某一天,DUT对于同样的激励,延时变大,我们又要一个个改很麻烦,所以我们通过set_drain_time设置统一的延时。在运行过程中,drop后UVM会看有没有set_drain_time,有的话等待,没有的话进入post_configure_phase。

  还有一点要提的是,每一个phase用一个set_drain_time,并不是所有phase共享一个drain_time。

 类似资料: