FVO — Formal Verification Online
Lesson 3.5 · SystemVerilog Assertions Essentials

Properties and implication

Most assertions follow the pattern "whenever X happens, Y must follow". SVA expresses this with the implication operators. The left side is the antecedent, the right side the consequent.

OperatorNameConsequent starts…
A |-> Boverlappingin the same tick the antecedent match ends
A |=> Bnon-overlappingone tick after the antecedent match ends (same as A |-> ##1 B)
012345reqcheck ✓reqcheck ✓clkreqgnt
req |=> gnt: each req is followed by gnt on the next tick. Both attempts pass.

Vacuous success

An implication whose antecedent never matches is vacuously true. In the waveform above, the property is also evaluated at cycles 0, 2, 3 — the antecedent is false there, so those attempts pass vacuously. That is intended. But if the antecedent can never be true — because of a typo, a wrong polarity, or an over-constraining assumption — the assertion is proven while checking nothing.

vacuity
// Typo: the antecedent is a contradiction - it can never be true
a_oops:  assert property (req && !req |=> gnt);     // "proven", checks nothing

// Defence: cover the antecedent of every important implication
c_ante:  cover property (req && !gnt);

Most formal tools also report vacuity automatically. Read those reports — they are among the most valuable output a tool gives you.

Useful property operators

OperatorMeaning
not PP does not hold
P and Q, P or QProperty conjunction / disjunction
if (c) P else QConditional property
P until QP holds on every tick until Q (Q may never come — weak)
P s_until QSame, but Q must eventually come (strong)
s_eventually PP must hold at some future tick (liveness)
always PP holds on every tick from now on

Safety versus liveness

A safety property says something bad never happens; any violation has a finite counterexample (e.g. two grants at once). A liveness property says something good eventually happens (e.g. every request is eventually granted); a violation is an infinite trace where the good thing never happens. Formal tools show liveness counterexamples as a loop: a prefix followed by a cycle of states that repeats forever.

liveness vs bounded response
// Liveness: every request is eventually granted
a_live:    assert property (req |-> s_eventually gnt);

// Bounded safety alternative: granted within 8 ticks (often easier to prove, and more precise)
a_bounded: assert property (req |-> ##[0:7] gnt);
Was this page helpful?

Tip: select any text on the page before clicking Report and it will be quoted in your report.