a |-> bOverlapped. b starts at the antecedent endpoint.
Part 2 · Timing and operators
Place obligations on exact sampled edges, inspect pass and failure waveforms, and distinguish the sequence operators that control occurrence and match endpoints.
Question directory
Open a question at its supporting explanation. The complete property reference stays directly above each answer set.
Draw the trace first, mark the antecedent endpoint, and only then choose overlapped or nonoverlapped implication and any explicit delay.
a |-> bOverlapped. b starts at the antecedent endpoint.
a |=> bNonoverlapped. b starts one sample later.
The operator changes one attempt's timing. It does not block a new antecedent from starting another attempt.
Always-visible reference
These notes, tables, examples, and design limits contain the working knowledge for this chapter. The interview questions below are a checkpoint, not the primary explanation.
Conditional property
| Antecedent | Consequent | Property result | Interpretation |
|---|---|---|---|
No match | Not evaluated | Vacuous success | No obligation was created |
Match | Success | Success | The obligation was met |
Match | Failure | Failure | The obligation was violated |
Match | Pending | Pending or end-of-run dependent | A future endpoint is still required |
Edge arithmetic
| Property | For a one-cycle a at sample t | b is checked |
|---|---|---|
a |-> b | Consequent starts at t | At t |
a |=> b | Consequent starts at t+1 | At t+1 |
a |-> ##1 b | Overlapped start plus one delay | At t+1 |
a |=> ##1 b | Nonoverlapped start plus one delay | At t+2 |
a |-> ##[1:3] b | Three legal endpoints | At t+1, t+2, or t+3 |
a_same_cycle: assert property (
@(posedge clk) req |-> ack
);
a_next_cycle: assert property (
@(posedge clk) req |=> ack
);
Candidate matches
The first matching endpoint can satisfy a simple response property, but composition may preserve multiple candidate matches.
Keep the earliest complete sequence match within one attempt. It does not reserve the response event globally.
Make an eventual sequence fail if it cannot complete by the relevant end condition. Prefer a finite deadline when the architecture has one.
A second trigger starts a second attempt unless a separate admission rule or outstanding-state model forbids it.
Worked trace
| Trigger | Contract | Observed response | Verdict |
|---|---|---|---|
req rises at 5 | exactly +2 | ack rises at 7 | Pass |
req rises at 5 | exactly +2 | ack rises at 6 | Fail: early response |
req rises at 5 | within 1..3 | ack rises at 8 | Pass at latest boundary |
req rises at 5 | within 1..3 | ack rises at 9 | Fail: late response |
req never rises | within 1..3 | ack never rises | Vacuous success; trigger cover is empty |
Interactive timing lab
Select a scenario. The sampled waveform, property, outcome, and explanation update together.
req and ack are both sampled high at clock 2. The consequent of req |-> ack begins on that same sampled edge, so this attempt passes.
a_same_cycle: assert property (
@(posedge clk) disable iff (!rst_n)
req |-> ack
);
Pass. req and ack are both sampled high at clock 2. The consequent of req |-> ack begins on that same sampled edge, so this attempt passes.
Waveform casebook
Each column is a sampled positive clock edge. Read left to right: trigger, legal endpoint, then verdict.
Implication
$rose(req) |=> ackThe request edge at t2 creates an obligation at t3. ack is high there, so the attempt passes.
Pulse width
$rose(pulse) |=> pulsepulse rises at t2 but is low at t3. Nonoverlapped implication checks the next sample and exposes the one-cycle-short pulse.
Backpressure
valid && !ready |=> valid && $stable(data)The transfer stalls at t1 and t2. valid stays asserted and the Boolean predicate data == A stays true until ready rises at t3.
Consecutive repetition
$rose(err) |-> err[*2]The antecedent starts at t2. Because |-> overlaps, err[*2] consumes t2 and t3 and completes the required consecutive run.
Interview checkpoint
Open a prompt after studying the reference above. A strong answer should name the sampled edge, match endpoint, failure mode, and proof evidence.
Overlapped implication, |->, starts the consequent at the antecedent endpoint. Nonoverlapped implication, |=>, starts the consequent on the sampling event after the antecedent ends.
Whether you can place the consequent exactly on a trace and state the limited case in which two formulations are equivalent.
Do not memorize |-> as current cycle and |=> as next cycle without considering a multi-cycle antecedent endpoint.
| Property | First b sample for one-cycle a | Meaning |
|---|---|---|
a |-> b | Same sampled edge | Overlapped |
a |=> b | One sampled edge later | Nonoverlapped |
a |-> ##1 b | One sampled edge later | Explicit delayed consequent |
No. Nonoverlapped describes where one attempt's consequent starts. Every matching antecedent can still launch another independent attempt on a later clock, even while an earlier attempt is pending.
Whether you separate temporal alignment inside one attempt from admission control across several attempts.
Replacing |-> with |=> is not a no-overlap solution.
a_done_in_four: assert property (
@(posedge clk) disable iff (!rst_n)
$rose(start) |-> ##[1:4] done
);
a_no_second_start: assert property (
@(posedge clk) disable iff (!rst_n)
$rose(start) |=>
!$rose(start) until_with done
);
An implication succeeds vacuously when its antecedent does not match, because no consequent obligation was created. Add cover properties for the trigger and representative end-to-end matches so a green assertion is not mistaken for exercised behavior.
Whether you distinguish absence of a failure from evidence that the intended scenario occurred.
A passing request-to-acknowledge assertion proves nothing about response logic if request never rose.
a_req_ack: assert property (
@(posedge clk) disable iff (!rst_n)
$rose(req) |-> ##[1:3] ack
);
c_request: cover property (
@(posedge clk) disable iff (!rst_n)
$rose(req)
);
c_latest_ack: cover property (
@(posedge clk) disable iff (!rst_n)
$rose(req) ##3 ack
);
Distinguish consecutive, nonconsecutive, and goto repetition, then combine sequences only when their start and endpoint contracts are clear.
b[*3]Consecutiveb[=3]Gaps and trailing slackb[->3]Ends on final bAlways-visible reference
These notes, tables, examples, and design limits contain the working knowledge for this chapter. The interview questions below are a checkpoint, not the primary explanation.
Repetition handbook
| Form | Operand | Gaps | Where the match ends |
|---|---|---|---|
b[*3] | Boolean or sequence | No | On the third consecutive repetition |
b[*2:4] | Boolean or sequence | No | On a legal second, third, or fourth repetition |
b[=3] | Boolean expression | Yes | At or after the third hit; trailing non-b slack is allowed |
b[=3:5] | Boolean expression | Yes | After a legal third through fifth hit, with possible trailing slack |
b[->3] | Boolean expression | Yes | Exactly on the third hit |
b[->3:5] | Boolean expression | Yes | On a legal third through fifth hit |
Algebra
a[*3]
// equivalent to
a ##1 a ##1 a
a ##1 b[*3] ##1 c
// equivalent to
a ##1 b ##1 b ##1 b ##1 c
(a ##2 b)[*3]
// equivalent to
(a ##2 b) ##1 (a ##2 b) ##1 (a ##2 b)
Endpoint contrast
| Sequence | Legal sampled trace after a | Reason |
|---|---|---|
a ##1 b[=3] ##1 c | b · b · b · · c | Three b hits, then trailing non-b slack before c |
a ##1 b[=3] ##1 c | b · b · b b c | Illegal: an extra b occurs in the trailing region |
a ##1 b[->3] ##1 c | b · b · b c | Third b is the repetition endpoint; c is next sample |
a ##1 b[->3] ##1 c | b · b · b · c | Illegal: c is not immediately after the goto endpoint |
Sequence composition
| Construct | Start relationship | Endpoint rule | Use |
|---|---|---|---|
s1 or s2 | One compound start | Either legal endpoint | Alternative temporal pattern |
s1 and s2 | Same compound start | Later successful endpoint | Both patterns, different lengths allowed |
s1 intersect s2 | Same compound start | Common endpoint required | Two views of one bounded interval |
expr throughout seq | expr begins with selected seq match | Includes every sample through seq endpoint | Hold condition over a known span |
inner within outer | inner may begin inside outer | Inner must complete before outer ends | Temporal containment |
first_match(seq) | Same as seq | Earliest complete match only | Deterministic endpoint selection |
named_seq.ended | Named sequence's own start | True on its match endpoint | Align another sequence to completion |
a_req_held_to_grant: assert property (
@(posedge clk) disable iff (!rst_n)
$rose(req) |->
req throughout (gnt[->1])
);
Waveform drills
| Requirement | Preferred property | Trace | Verdict |
|---|---|---|---|
At least 2 sampled clocks high | $rose(p) |=> p | p: 0 1 0 | Fail: low on the next sample |
At least 2 sampled clocks high | $rose(p) |=> p | p: 0 1 1 0 | Pass |
Exactly 2 sampled clocks high | $rose(p) |-> p[*2] ##1 !p | p: 0 1 1 1 0 | Fail: pulse is too long |
Alert after two err samples | ($rose(err) ##1 err) |=> alert | err: 0 1 1; alert next | One obligation per err run |
Alert for every adjacent pair | err[*2] |=> alert | err: 1 1 1 | Two overlapping pair obligations |
Interview checkpoint
Open a prompt after studying the reference above. A strong answer should name the sampled edge, match endpoint, failure mode, and proof evidence.
Consecutive repetition [*] requires adjacent sampled matches. Nonconsecutive repetition [=] counts possibly gapped occurrences and permits trailing nonmatch cycles in the sequence match. Goto repetition [->] also permits gaps, but the final occurrence ends the match.
Whether you can predict the endpoint that a later ## delay or intersect operator will use.
Calling [=3] and [->3] equivalent loses the trailing-slack distinction.
| Operator | Gaps allowed | Match endpoint |
|---|---|---|
b[*3] | No | Third consecutive b |
b[=3] | Yes | May extend after third b |
b[->3] | Yes | Exactly on third b |
Trigger once on the rising edge and require the signal to remain high on the next sampled clock. Because the signal is already high on the trigger sample, $rose(p) |=> p establishes a minimum width of two sampled clocks.
Whether you count the trigger sample and distinguish minimum width from exact width.
An unbounded repetition such as p[*2:$] adds unnecessary match ambiguity when one next-cycle check states the minimum-width rule directly.
a_min_two: assert property (
@(posedge clk) disable iff (!rst_n)
$rose(p) |=> p
);
a_exact_two: assert property (
@(posedge clk) disable iff (!rst_n)
$rose(p) |-> p[*2] ##1 !p
);
Put the two-cycle err sequence in the antecedent, then imply alert on the following cycle. If the rule should fire once per contiguous err run, begin the antecedent with $rose(err).
Whether you can control attempt count and explain how a long run changes the number of obligations.
Do not omit implication when the English requirement begins with whenever or if.
a_alert_once_per_run: assert property (
@(posedge clk) disable iff (!rst_n)
($rose(err) ##1 err) |=> alert
);
expr throughout seq requires expr to remain true on every sampled tick occupied by the selected match of seq. It constrains the complete sequence span, including its endpoint.
Whether you can identify the exact span that throughout covers and avoid hiding a simple invariant inside an unbounded sequence.
Do not read throughout as an implication trigger. It constrains a sequence match that must already be part of a property.
first_match(seq) keeps only the earliest complete match when a sequence has several legal endpoints. seq.ended is true on the sampled clock where that named sequence reaches a match endpoint, which lets another sequence align to completion rather than to the start.
Whether you can distinguish endpoint selection inside one property attempt from ordering and one-to-one matching across attempts.
first_match does not prove FIFO order, reserve the earliest grant for the oldest request, or replace a scoreboard.
| Construct | What it selects | What it does not prove |
|---|---|---|
first_match(seq) | Earliest complete match | Transaction ownership |
seq.ended | The match endpoint cycle | Which attempt owns an event |
intersect | A common endpoint | FIFO ordering |