Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • Reading Paths
  • Glossary
  • Metrics Reference
  • Formal Cheat Sheet
  • Formal Foundations19
  • Properties and SVA16
    • SVA as a Formal Tool Reads It
    • Implication, Edges and Windows
    • Safety, Liveness and What a Tool Can Say
      • Safety and Liveness on Infinite Traces
      • Weak and Strong in a Proof Engine
      • Bounded Response Is Safety
      • Fairness and What You May Assume
    • Debugging and Reviewing Assertions
  • Property Development and Constraints19
  • Proof Engines and Convergence23
  • Formal Applications20
  • Equivalence Checking14
  • Formal Coverage and Signoff15
  • Methodology and Debug13
  • Interview Prep15
  • Capstone: A Chip-Block Verification Lab24
Loading lesson

←Safety, Liveness and What a Tool Can Say
  1. Topics
  2. Formal Verification
  3. Properties and SVA
  4. Safety, Liveness and What a Tool Can Say
  5. Safety and Liveness on Infinite Traces
On this page

    Part 2 of 10, lesson 9 of 16Part 2 of 10/Properties and SVA/Lesson 9 of 16All levels

    Safety and Liveness on Infinite Traces

    A finite bad prefix refutes safety and nothing refutes liveness except an infinite trace; ten rules classified with answers.

    Why it matters

    A proof report says a liveness rule passed a bounded run, and the team signs off. The report means no finite prefix of that length broke the rule, which for a liveness rule means almost nothing: only an infinite trace can refute it, and a bounded run never sees one. This lesson's one job is the classification that stops that sign-off: which rules a bounded run can refute, and what refutes the rest.

    The core idea

    Safety says nothing bad happens within any finite prefix: overflow, two grants, a corrupted word. A finite trace that exhibits the bad thing refutes it, which is why a bounded run, exhibiting finite traces, can refute safety and why every safety counterexample in this course is a finite path. Liveness says something good happens on every infinite trace: every request granted, no starvation. No finite prefix refutes it, because any prefix could extend with the good thing; only a lasso, a prefix plus a loop that repeats for ever without the good thing, refutes it.

    A bounded response, grant within N cycles, is safety wearing a number: exceeding the bound is a finite bad prefix of length N plus 1. That single move, adding the bound, is what makes response rules provable in a flow with no liveness engine, and the next lessons price it exactly.

    Rule

    Safety or liveness

    What refutes it

    FIFO never overflows

    Safety

    The finite push sequence that fills it plus one.

    Grant is one-hot

    Safety

    One cycle with two grant bits.

    Every request is eventually granted

    Liveness

    Only a lasso where the loop never grants it.

    Every request granted within 6 cycles

    Safety

    A finite wait of 7 cycles.

    No deadlock, defined as: no reachable state in which no step is enabled

    Safety

    The finite prefix that reaches such a state (the bad thing is a state predicate).

    Mutual exclusion

    Safety

    One cycle with both sides inside.

    Fair service, served again and again

    Liveness

    Only a lasso where the loop skips it.

    Responses leave in request order

    Safety

    The finite pair that swaps.

    Credits are conserved

    Safety

    The finite point where the count disagrees.

    Reset releases the block: it starts eventually

    Liveness as written; safety once bounded (starts within N cycles)

    Unbounded: only a lasso that never starts. Bounded: a finite wait of N plus 1 cycles.

    Two rows need care. A deadlock check is safety only because it is defined as reaching a state: the checker looks for a configuration in which no step is enabled. The informal idea, activity that never completes (a livelock) or one requester skipped while others are served (starvation), is not a state predicate and needs a lasso, so it sits on the liveness side. The three words are separated precisely in the applications section. The reset row shows the general move: any liveness rule with a stated deadline is safety, and the deadline has to come from the specification.

    Top-down diagram from the rule to the question whether a finite prefix breaks it, splitting into safety shown by the prefix and liveness shown by a lasso, with a stated deadline returning a liveness rule to safety.
    Classify by what refutes the rule: a finite prefix means safety, a lasso means liveness, and a stated deadline returns it to safety.

    What the review looks for

    • Every property comment says which side it is on: within N cycles for safety, eventually for liveness, with no mixing of the words.

    • Every liveness claim names its engine or its bound: a bare eventually with a bounded proof behind it is a review failure.

    • Deadlock, livelock and starvation are three different words: no progress possible, activity without completion, and one requester skipped while others are served.

    Verify and debug

    Classify before proving: ask what the shortest refuting trace looks like. If you can draw it as a finite path, the rule is safety and a bounded run can refute it. If refuting it needs the trace to loop for ever, it is liveness and a bounded pass is inconclusive by construction. When a rule you believed was liveness turns out windowed, say so in its comment and move it to the safety column.

    Bounded pass quoted as a liveness proof: a grant rule with no bound passed every bounded run it was given and was signed off as starvation-free. The first long stall in the lab starved the requester for far longer than any depth the team had run, inside a bound nobody had written down. Found by asking for the refuting trace: none exists within any bound, because the rule as written has none. Fixed by writing the bound the specification actually promises and proving that.

    Is grant-within-N safety or liveness? Answer: safety, because a wait of N plus 1 cycles is a finite prefix that refutes it. Eventually without a bound is liveness, refuted only by a lasso. Evidence: the bounded proof of the arbiter rule fails at exactly N plus 1 on the starving mutant, which a finite trace can show.

    Check yourself Why can a bounded run refute safety but never refute true liveness?

    Refuting safety needs only a finite bad prefix, which fits inside the bound. Refuting liveness needs an infinite trace with no good event, and every bounded trace is finite, so the good event might always arrive one cycle later.

    Related topics

    • Next: Weak and Strong in a Proof Engine

    • Protocol First Principles: Safety and Liveness

    • SystemVerilog: Nexttime, Always, Eventually

    • Formal: Deadlock and Livelock Checks

    • Formal: Transition Systems and Properties

    Previous

    33 / 183

    Next: Weak and Strong in a Proof Engine

    Up next

    Up nextWeak and Strong in a Proof Engine

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • Bounded Response Is Safety
    • Fairness and What You May Assume