SystemVerilog, as a hardware description and verification language, provides a well-defined event-driven simulation scheduling mechanism. This mechanism is based on scheduling regions, which dictate the order and timing of operations during simulation. Scheduling regions are critical for ensuring deterministic behavior and accurate representation of hardware designs. In this article, we’ll explore the various scheduling regions in SystemVerilog and understand their roles and functions.
SystemVerilog’s simulation engine is event-driven, meaning operations are triggered by changes in signals or conditions. The simulation time is divided into time steps, and within each time step, events are processed in a predefined sequence across several regions.
SystemVerilog defines nine scheduling regions categorized into three groups:
- Preponed Region
- Active and Reactive Regions
- Observed and Postponed Regions
Each region has a specific purpose, ensuring a well-ordered execution of different tasks in a simulation cycle.

Detailed Explanation of Scheduling Regions
1. Preponed Region
- The preponed region is executed before the current time step begins.
- It is used for sampling signal values without causing updates, ensuring consistency across processes.
- Sampling signals in formal verification tools before triggering events or assertions.
2. Active Region
- This is the primary region for evaluating procedural statements in always blocks, initial blocks, and continuous assignments.
- Execute all the blocking assignments.
- Evaluate R.H.S of NBAs(Non Blocking Assignments).
- $display and $finish command execution happens in this region.
- Evaluate inputs and outputs of primitives in Verilog.
3. Inactive Region
- The inactive region follows the active region and is reserved for events that are delayed but must still occur within the same time step.
- This region is used for #0 blocking assignments.
4. NBA (Non-Blocking Assignment) Region
- This region is specific to handling non-blocking assignments (
<=). It updates L.H.S of NBA that were scheduled in active region. - It ensures that dependent assignments are evaluated in order and prevents race conditions in sequential logic.
5. Observed Region
- The observed region allows sampling of values as they are updated.
- This region evaluate concurrent assertions.
- Triggering of clocking blocks happen in this region.
6. Reactive Region
- The reactive region is triggered after all active events for the current time step are resolved.
- This region is mainly used to evaluate activities under program code to avoid race conditions.
- Execute all program blocking assignments.
- Execute the pass/fail code from concurrent assertions.
- Evaluate the Right-Hand-Side (RHS) of all program nonblocking assignments and schedule
updates into the Re-NBA region. - Execute all program continuous assignments
- Execute the $exit and implicit $exit commands.
7. Re-Inactive Region
- Same as Inactive region but for program process. It means #0 blocking assignments are executed for program process.
8. Re-NBA (Re-evaluation of NBA) Region
- Same as NBA region but for program block. It updates L.H.S of NBA that were scheduled in reactive region.
9. Postponed Region
- The postponed region schedules events for the next time step.
- It executes $monitor and $strobe command. This region is also used for collecting functional coverage for items that use strobe sampling.
Key Considerations for Scheduling Regions:
- Use non-blocking assignments (
<=) for sequential logic to prevent race conditions. - Reserve blocking assignments (
=) for combinational logic. - If you are using both sequential logic and combinational logic in same always block, use non-blocking assignments.
- Don’t use blocking and non-blocking assignments in same always block.
- For non-blocking assignments use $strobe or $monitor to display values.
