The SystemVerilog Scheduling Model and Event Regions

SystemVerilog defines a precise scheduling model — the ordering of events within a single simulation time step. Understanding it explains why non-blocking assignments update when they do, why $strobe differs from $display, and why a well-written testbench never sees race conditions.

Regions within a time step

Each time step is divided into ordered regions. The key ones: the Active region (blocking assignments, RHS of non-blocking, $display), the NBA region (non-blocking assignments take effect), and the Postponed region ($strobe, $monitor — read-only, after everything settled). Because non-blocking updates land in NBA, a $display in Active sees the old value while a $strobe sees the new one.

module tb;
  logic clk = 0, q = 0;
  always #5 clk = ~clk;
  always @(posedge clk) q <= ~q;      // non-blocking: updates in NBA region
  initial begin
    @(posedge clk);
    $display("$display at edge : q = %b  (Active region: OLD value)", q);
    $strobe ("$strobe  at edge : q = %b  (Postponed: NEW value)", q);
    #10 $finish;
  end
endmodule
$display at edge : q = 0  (Active region: OLD value)
$strobe  at edge : q = 1  (Postponed: NEW value)
- /var/folders/l0/gs5hnkm56g54bmxg32r6nnwr0000gn/T/tmpvrrhpdbc/tb.sv:9: Verilog $finish

Run it: at the clock edge $display prints the value of q before the non-blocking update, while $strobe, which fires in the Postponed region after all NBA updates, prints the value after. This is exactly why testbench checks and monitors use $strobe/clocking blocks to sample stable end-of-step values.

Check yourself

Why does <code>$display</code> show the old value of a non-blocking-assigned signal at a clock edge, while <code>$strobe</code> shows the new one?

$display runs in the Active region, before non-blocking assignments take effect in the NBA region. $strobe runs in the Postponed region at the very end of the time step, after all NBA updates have settled, so it observes the updated value.

What problem do scheduling regions (and clocking blocks) solve for a testbench?

Race conditions between the testbench and the DUT sampling/driving the same signals at the same edge. Defining when values are read and written within a time step makes behaviour deterministic, so the testbench reliably sees stable, settled values.

Have questions about this topic?
Share your question in comments or talk to our mentor team for batch guidance.
▶ Try it in the ChipXpert Lab

Compile and simulate this in the browser — no install. Edit the code and re-run instantly.

Open in Verification Lab

Learn Verilog with mentors, labs and placement support

This free series is maintained by the ChipXpert training team in Hyderabad & Bengaluru. Go deeper with instructor-led courses on real EDA tools.

Explore VLSI Courses
Next batch starts 18th November 2026
Start your VLSI career with ChipXpert

Live online and classroom batches in Hyderabad & Bengaluru. Fill in your details and a counsellor will call you back.

  • Real EDA tools in your browser: industry-standard EDAReal EDA tools in your browser
  • Recorded sessions on the elearn portalRecorded sessions
  • Placement assistance: resume, mock interviewsPlacement assistance
  • Merit scholarship up to 60% · EMI optionsScholarship up to 60%
Hi! Ask me about courses, fees, batches or discounts. ×
BENGALURU
HYDERABAD