充分理解SV的不同结构体在仿真中执行的先后顺序,有利于理解testbench中对DUT的驱动和采样的顺序,进而避免不合理的驱动和采样方式。
时间片(time-slot)是仿真时间中的一个抽象单位Ts,该单位内所有的线程(always,initial,assertion等)和数据对象的赋值被赋予相应的优先级,依次被执行。这种优先级即如下图所示的调度区域。observerd和reactive专门用于SV验证,其余区域均继承于verilog调度区域。
- Active
从preponed region进入active region后,将执行所有处于该阶段的线程。其中与非阻塞赋值有关的操纵执行完成后,对应的线程进入NBA region,而带有“#0”延时操作的线程直接进入inactive区。 - inactive
所有被零延时操作的线程在inactive中被激活,在被执行之前迁往active区,所以#0会延缓线程执行的时间 - NBA
该区域是在所有active和inactive均没有其他线程后所到达的调度区,到达该区域后,之前在active的非阻塞赋值生效,如果这些非阻塞触发了别的线程,那么被触发的线程要被迁移至active - Observe
但之前active/inactive/NBA区域全部执行完毕后,即表示设计部分的线程执行完毕,则进入为assertion准备的observed区。由于断言属性中需要监测设计中的变量,且必须等到所有数据对象被赋予最终的数值,所以该区域处在设计区域之后。
这样做的好处是,避免因采集的变量不稳定导致属性检查错误。该区域同样适用interface和program中的采样操作,使得采样的数据就是该Ts内的最终值。 - reactive
数据采样后,assertion须进行属性判断,同时如果该区域对设计区域中的线网和变量赋值,则使被激活的线程再次迁移到active区;经过信号采样后,处于testbench中的线程也在该区域执行。 - postpone
在分别经历了与设计、testbench有关的区域后,当前Ts进入与postpone。该区域内的值保持稳定,且与下一个Tsprepone的值一致。同时该区域也作为SV PLI/DPI的回调函数点,使得在SV外部的调用语言(如C)在使用SV变量使仍然可以用到最新的数值。
SystemVerilog调度机制与一些现象的思考----good
SystemVerilog中scheduler(调度)
SystemVerilog LRM 学习笔记 – SV Scheduler仿真调度
Q5:systemverilog引入program块的意义?
A5:引入了Reactive Region set(Reactive、Re-Inactive、Re-NBA),将验证代码和设计代码区域区分,减少了竞争冒险。