注:本文来自硅芯思见
在编写测试平时,经常会用到$monitor和$strobe监测某些信号,并且使用格式上与$display比较类似,但是它们之间还是存在差异的,它们在当前仿真时间槽(time-slot)中被执行的区间是不同的。$display发生在Active区,而$monitor和$strobe发生在当前仿真的最后时刻,即post-pone区,并且一个time-slot是存在很多区域的,因此,它们在观测具体信号值时是存在一定差异的。
【示例】
【仿真结果】
出现示例中的结果,是因为非阻塞赋值的LHS更新发生在Non-Active区,而此时的$display已经执行完毕,所以$display观测不到sig更新后的值,但是$monitor发生在Post-pone区,晚于Non-Active区执行,所以可以观测到sig更新后的值。因此,$display和$monitor观测到sig的值不同。在实际使用过程中,具体使用哪一种监测方式则根据两种监测执行的区间特点自行选择,$strobe与$monitor在本例中监测到的结果是一样都发生在Post-pone区,执行类似,在此不赘述。那么既然$strobe和$monitor执行效果一样,都发生在Post-pone区,那么为什么还要同时存在呢?两者之间有些什么差异呢?下面我们就两者之间的一些差异进行示例说明。
1 $strobe的执行
$strobe只有在被调用时才会对其中的参数进行监测,此时的参数所具有的值可以认为是其所在当前时间槽(time-slot)中的最终值。另外,$strobe在设计中可以多次被调用,且多次调用相互之间不产生任何影响。
【示例】
【仿真结果】
示例中,在always过程块中,当敏感时间列表中的信号发生一次变化,always过程块中的$strobe就会执行一次,并且输出此次执行时对应参数的稳定值。在initial过程块中,等待4个时间单位后$strobe执行,并且输出此时对应参数的稳定值,而在sig变化的其他时刻,该语句并未执行(因为initial块只执行了一次,并且完成了他的历史使命)。可见$strobe的执行取决于对其的调用,它的执行并不取决于其中参数的变化,同时可见该语句在代码中可以被多次调用,并且多次调用之间不会产生相互影响。
2 $monitor的执行
$monitor和$strobe虽然它们监测的参数都是当前时间槽该参数最后的稳定值,但两者在具体执行上还是有一定差别的,下面通过示例说明$monitor的用法。
【示例】
【仿真结果】
示例中,$monitor位于过程块中,sig从0时刻开始,每发生一次变化,$monitor就会执行一次,可见$monitor会持续监测其中参数的变化,只要其中参数发生变化,$monitor就会执行。那么是不是其中的任何参数的变化都会触发$monitor的执行,例如,可不可以使用$monitor监测时间的变化呢?
【示例】
【仿真结果】
示例中,随着仿真时间的推进,$monitor仅执行了一次。这主要是因为在$monitor中,如果监测的参数是$time、$stime和$realtime这些系统函数的返回值,$monitor对这些时间参数的变化并不敏感。
另外,当$monitor中具有多个参数同时发生变化时,这是因为这些参数在当前时间槽中调用$monitor时都已经处于稳定状态了,所以此时$monitor只调用一次,如下所示。
【示例】
【仿真结果】
那么,我们可不可以使用多个$monitor监测信号的变化呢?此时$monitor会如何执行呢?我们看看下面的示例。
【示例】
【仿真结果】
示例中,使用了两个$monitor分别检测sig1和sig2信号的变化,但是仿真结果仅有一个$monitor执行。这主要是因为$monitor执行上的一个特点,在任意仿真时刻,只有一个$monitor系统任务处于激活执行状态,至于多个$monitor执行的顺序,一般则取决于哪一个$monitor最近一次被调用。除此之外,$nonitor还提供了其他的配置系统任务,可以通过这些系统任务实现对于$monitor执行的控制。
【示例】
【仿真结果】
示例中,$monitoroff和$monitoron之间sig的变化并没有触发$monitor系统任务的执行。这主要是因为$monitoroff会不使能当前所有激活的$monitor任务对于其中参数的监测,所以在$monitoroff之后,$monitor监测的参数如果发生变化,将不会触发$monitor的执行。$monitoron的效果与$monitoroff刚好相反,主要用于再次启动激活$monitor任务,在$monitoron执行后,如果$monitor监测的参数发生变化,则会触发$monitor的执行。
综上所述,$strobe和$monitor执行的主要特定如下:
Ø$strobe和$monitor监测的相关变量的值,都是这些变量在当前时间槽中的最终稳定值;
Ø$strobe只有在被调用时才会对其中的参数进行监测,而$monitor只要监测的参数发生变化,$monitor就会执行;
Ø代码中可以存在多个$strobe,并且多个$strobe的调用相互之间不影响;
Ø在$strobe和$monitorr中,如果监测的参数是$time、$stime和$realtime这些系统函数的返回值,$strobe和$monitor对这些时间参数的变化并不敏感
Ø在任意仿真时刻,只有一个$monitor系统任务处于激活执行状态,至于多个$monitor执行的顺序,一般则取决于哪一个$monitor最近一次被调用;
Ø可以通过$monitoroff和$monitoron对$monitor的执行进行监测;