在SystemVerilog中,仿真事件调度遵循特定的时间轮次(time wheel),该轮次包含不同的时间槽(slot),每个时间槽对应不同的仿真阶段(region)。这些阶段包括:
- Active Region
- Inactive Region
- NBA (Non-Blocking Assignment) Region
- Observed Region
- Re-Active Region
- Postponed Region
@(posedge clk)
- Region: Active Region
- Event Type: “posedge clk” 是在Active Region触发的,这意味着在这个区域所有的事件都会立即执行。换句话说,当检测到clk信号的上升沿时,所有等待这个事件的进程会Active Region立即触发。
@(vif.cb)
- Region: Clocking Block Event
- Event Type: “@(vif.cb)” 依赖于clocking block的事件触发机制。Clocking block事件的触发和执行有特定的时间槽,通常会在Observed Region执行。
Clocking Block的具体行为:
- Clocking Blocks: 在clocking block中,信号的采样和驱动是分离的。信号的采样在Observed Region进行,而信号的驱动在Re-Active Region进行。这意味着@(vif.cb)的触发是基于Observed Region中的事件。
区别总结
- @(posedge clk) 在Active Region执行,意味着它会在检测到clk信号的上升沿时立即触发并执行。
- @(vif.cb) 在Observed Region触发,意味着它会在Active Region完成后并在信号被观察后才会触发。Clocking block中的信号采样发生在Observed Region,而信号驱动发生在Re-Active Region,这确保了clocking block内的信号同步。
仿真时间轮次(Time Wheel)
| Active Region | -> Events triggered by posedge clk
| Inactive Region |
| NBA Region |
| Observed Region | -> Events triggered by vif.cb
| Re-Active Region |
| Postponed Region |
实际仿真行为差异
- @(posedge clk): 在Active Region检测到clk的上升沿时立即触发,适用于所有对clk边沿敏感的进程。
- @(vif.cb): 在Observed Region触发,这使得它更适用于同步多个信号并确保信号的稳定性。由于clocking block的设计,信号采样和驱动的分离可以避免竞争条件和不确定行为。
因此,在使用VCS仿真器时,@(vif.cb)会在稍后的时间槽触发,这可以确保信号的同步和稳定性,而@(posedge clk)则会在更早的时间槽立即触发。