← Design Verification Interviews
Interview Question · Concept
Immediate, Deferred and Concurrent Assertions
The Question
The interviewer asks
What are the three kinds of assertion in SystemVerilog, and when would you use each?
You have two and a half minutes. Speak or type, then press Get Feedback under your answer. No credits needed.
Speech-to-text runs in your browser. Chrome and Edge may send audio to their own speech service.
You can edit your answer before you send it. Feedback uses AI and checks your answer only against our written answer. No credits are used and your answer is not saved.
Reveal the Model Answer
An immediate assertion is a procedural statement that tests its expression the moment it executes, with the values at that instant. A deferred assertion (assert #0 or assert final) is also procedural, but it reports later in the time step. So a short combinational glitch that settles is not reported. A concurrent assertion samples its signals at a clock event and can check behaviour over many cycles. Use immediate or deferred checks in procedures and functions, and concurrent ones for protocol rules.
Columns are moments, not equal steps of time; +#0 means one #0 step later at the same time. The immediate check runs each time a or b changes, so it reports both short mismatches. The concurrent check looks only at clock edges and never fails.
| Kind | Evaluated | Values seen | Report or action |
|---|---|---|---|
Immediate assert (e) | When the statement executes | Current values | Immediately |
Deferred assert #0 (e) | When it executes; the report matures later | Current values at execution | Action block in the Reactive region |
Deferred assert final (e) | Same | Same | Action block in the Postponed region |
Concurrent assert property | At each clock event, in the Observed region | Sampled in the Preponed region | Action block in the Reactive region |
A deferred report is dropped if its process runs again in the same time step before the report matures.
The rule "a and b move together", checked by an immediate assertion in always @(a or b) and by a concurrent one. a and b change one step apart at 10 and 20.
t=10 immediate failed: a=1 b=0 t=20 immediate failed: a=0 b=1 immediate failures=2 concurrent failures=0Self-Check
Tick each key point you covered in your answer.
What Interviewers Listen For (Fresher)
A good fresher answer names all three kinds and says which two run inside procedures. It says the concurrent one runs on a clock.
What Interviewers Listen For (Junior)
A good junior answer uses the glitch in the run to explain why only the immediate check fired. It offers a deferred check as the middle ground inside procedures.
What Interviewers Listen For (Senior)
A good senior answer compares checks that only run in simulation with concurrent properties that formal can also prove. It picks the kind by where the check must live.
Cross-Questions
Where the interviewer goes next. Open a node to practise that follow-up.
WhyWhat IfBreak ItCompareScale It
- Immediate, Deferred and Concurrent Assertions
-
WhyWhy Deferred Assertions Were AddedL1 Junior
Why did the standard add deferred assertions when immediate ones already existed?
2:30You have two and a half minutes. Speak or type, then press Get Feedback under your answer. No credits needed.
Speech-to-text runs in your browser. Chrome and Edge may send audio to their own speech service.
You can edit your answer before you send it. Feedback uses AI and checks your answer only against our written answer. No credits are used and your answer is not saved.
Reveal the Model Answer
A combinational block can run several times in one time step while its inputs settle. An immediate check reports every in-between value. A deferred check waits until later in the time step. If the block runs again first, the pending report is dropped, so only the settled value counts. It gives procedural code, including functions, a glitch-free check without needing a clock.
Self-Check
Tick each key point you covered in your answer.
Misconception
"Deferred means the check uses the values at the end of the time step."
The expression is evaluated when the statement executes; only the report is delayed, and a re-run of the process replaces it.
Source Mehta, SystemVerilog Assertions and Functional Coverage (3rd ed.), §5.1 (PDF p71)
-
Break ItA Deferred Assertion That Still Fired on a GlitchL2 Mid-Level
Your
assert final (a == b)inalways @(a or b)reports a mismatch at 10 ns. The waveform showsaandbequal by the end of that time step. Is the RTL wrong?log t=10 assert final failed: a=1 b=0 (wave at t=10, end of step: a=1 b=1)2:30You have two and a half minutes. Speak or type, then press Get Feedback under your answer. No credits needed.
Speech-to-text runs in your browser. Chrome and Edge may send audio to their own speech service.
You can edit your answer before you send it. Feedback uses AI and checks your answer only against our written answer. No credits are used and your answer is not saved.
Reveal the Model Answer
Not necessarily. The standard says the block's second run in that time step flushes the pending report, so no failure should appear. Some simulators, Verilator 5.052 among them, do not implement the flush and report the transient value. Confirm on another simulator, or move the rule to a clocked concurrent assertion that no simulator disagrees on.
Self-Check
Tick each key point you covered in your answer.
Tool as Truth
"The simulator reported it, so the design glitched in a way that matters."
A zero-time glitch between two blocking updates is not hardware behaviour. Whether you see it depends on whether the tool follows the flush rule.
Source ASIC Point engine notes (Verilator 5.052 SVA probes), deferred assertion flush row
-
CompareAssert #0 vs Assert FinalL1 JuniorL2 Mid-Level
Compare
assert #0withassert final. When does the difference matter?2:30You have two and a half minutes. Speak or type, then press Get Feedback under your answer. No credits needed.
Speech-to-text runs in your browser. Chrome and Edge may send audio to their own speech service.
You can edit your answer before you send it. Feedback uses AI and checks your answer only against our written answer. No credits are used and your answer is not saved.
Reveal the Model Answer
Both evaluate when executed and both flush on a re-run. An observed deferred assertion (
#0) matures in the Observed region and runs its action in the Reactive region. So its action can still change state in that time step. A final deferred assertion runs its action block in the Postponed region, after all activity, so the action may only report. Usefinalwhen even testbench reactions to the check must not cause further glitches.assert #0(observed deferred)assert finalReport matures in Observed region Postponed region Action block runs in Reactive region Postponed region Action may change state Yes No, it may only report Flushed if the block runs again in the time step Yes Yes Self-Check
Tick each key point you covered in your answer.
Misconception
"
assert finalwaits until the end of simulation."finalhere means the Postponed region of the current time step, not the final procedure at the end of the run.Source IEEE 1800-2017 §16.4
-
What IfWaiting for a Property: ExpectL2 Mid-Level
Asked if they mention a test waiting on a property
What if a directed test wants to block until a sequence such as
req ##[1:3] ackhas happened, and fail if it does not?2:30You have two and a half minutes. Speak or type, then press Get Feedback under your answer. No credits needed.
Speech-to-text runs in your browser. Chrome and Edge may send audio to their own speech service.
You can edit your answer before you send it. Feedback uses AI and checks your answer only against our written answer. No credits are used and your answer is not saved.
Reveal the Model Answer
expect (@(posedge clk) req ##[1:3] ack) else ...;is a procedural statement that blocks the calling process until that one property attempt passes or fails. It is a single attempt started where the statement runs, unlike anassert property, which starts an attempt every clock. Verilator 5.052 rejectsexpect, so on that engine wait with an explicit bounded loop instead.Self-Check
Tick each key point you covered in your answer.
Misconception
"
expectis the same as anassert propertyinside aninitialblock."An
assert propertyplaced in a procedure is queued and does not block the process.expectblocks until its single attempt completes.Source IEEE 1800-2017 §16.17
-
Scale ItWhich Assertions Formal Tools Can UseL3 Senior
Your team writes many immediate assertions inside testbench classes. A formal lead asks to reuse the block's checks. What do you change?
2:30You have two and a half minutes. Speak or type, then press Get Feedback under your answer. No credits needed.
Speech-to-text runs in your browser. Chrome and Edge may send audio to their own speech service.
You can edit your answer before you send it. Feedback uses AI and checks your answer only against our written answer. No credits are used and your answer is not saved.
Reveal the Model Answer
Formal tools work on the design and its bound checkers, not on class-based testbench code. Checks inside class methods cannot be reused there. Rewrite the interface rules as concurrent properties over DUT signals, in a checker module you can
bind. Leave only transaction-level checks in the classes. The same file then runs in simulation as assertions and in formal as proof targets, with the input rules switched to assumptions.Self-Check
Tick each key point you covered in your answer.
What Interviewers Listen For (Senior)
A good senior answer splits rules on signals from checks on transactions. Signal rules are bound and shared with formal; transaction checks stay in classes. It also switches input rules from assert to assume.
Misconception
"Formal can read any assertion in the testbench."
Formal analyses synthesizable design logic plus properties over it; dynamic class objects and procedural testbench code are outside that model.
Source Lesson A7.1 review claims (bind; checkers outside the RTL)
What People Get Wrong
Common wrong answers and why they fail.
Half-Truth
"An immediate assertion in always @* is as good as a concurrent one."
It runs every time the block wakes, including on intermediate values inside one time step. The run reports two transient failures that a clocked property never sees.
Source IEEE 1800-2017 §16.3
Tool as Truth
"assert final reports a glitch only if the process never runs again; our simulator proves it."
The standard drops (flushes) a pending deferred report when the process runs again in that time step. Verilator 5.052 does not flush, so it reports the short-lived value.
Source ASIC Point engine notes (Verilator 5.052 SVA probes), "Failing cases of the §7 forms" (deferred flush)
Misconception
"Concurrent assertions are just immediate assertions inside always @(posedge clk)."
A concurrent assertion reads Preponed samples and can span cycles with sequences. An immediate assertion in a clocked block reads current values, which may already include updates from that edge.
Source IEEE 1800-2017 §16.5.1