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
  • Property Development and Constraints19
  • Proof Engines and Convergence23
  • Formal Applications20
  • Equivalence Checking14
  • Formal Coverage and Signoff15
  • Methodology and Debug13
    • The Formal Testplan
    • Managing Complexity in a Project
    • Debugging Formal Results
    • Formal in Regression
      • CI for Formal
      • Result Triage and Trends
      • From the Open Flow to Any Formal Tool
  • Interview Prep15
  • Capstone: A Chip-Block Verification Lab24
Loading lesson

←Formal in Regression
  1. Topics
  2. Formal Verification
  3. Methodology and Debug
  4. Formal in Regression
  5. From the Open Flow to Any Formal Tool
On this page

    Part 8 of 10, lesson 13 of 13Part 8 of 10/Methodology and Debug/Lesson 13 of 13All levels

    From the Open Flow to Any Formal Tool

    What any project needs from any formal tool, how the course flow maps onto it, and what changes at scale.

    Why it matters

    The course runs on one open flow: tasks, depths, and a three-outcome ledger. The reader's project may run on another tool entirely, with its own engines, applications, and dashboards. Without a map between the two, every lesson feels tool-specific and none of it transfers. This lesson is the map: concepts first, tool mechanics second, and a checklist that evaluates any flow honestly.

    Job of this lesson: map the course flow onto any formal tool and say what scale changes.

    The core idea

    Every formal flow has the same skeleton whatever its name: setup scripts that build the model, task definitions that say what runs at which depth, parallelism across tasks, a results database with the three outcomes, trace viewing, and application packages for connectivity, registers and deadlock. The mapping table below carries each course concept across. What changes at scale is capacity and breadth: larger cones, engine portfolios that pick strategies per property, application packages that generate properties from tables, and dashboards that must still refuse to count a timeout as a pass. Two behaviours differ silently between tools and are worth a row of their own: how a combinational loop is broken, and what happens to constructs that only mean something in simulation.

    Course concept

    What any formal tool provides

    What to check when evaluating

    Proof header with depth

    Task definition with bounds

    Depths recorded per task, rerun on change

    Bounded check, induction, covers

    Engine portfolio and cover tasks

    Which engine proved what, at which depth

    Three-outcome ledger

    Results database

    Timeouts land inconclusive, never proven

    Counterexample trace

    Trace viewing and minimisation

    Traces replayable and minimised

    Table-driven connectivity

    Connectivity application

    All modes and configurations covered

    Assumption list

    Constraint management

    Every assumption reviewed and discharged

    Combinational loops

    A rule for breaking each loop

    Loops are reported, not cut silently at an arbitrary point

    Simulation-only constructs

    A rule for delays, initial blocks, forces

    Every ignored construct is reported, and the report is read

    Worked example: the flow checklist

    The script below scores a flow against eight non-negotiable capabilities: recorded depths, named engines, three-outcome results, replayable traces, reviewed assumptions, hash-pinned reruns, reported loops and reported ignored constructs. It also reads the flow's status mapping, the table that turns the tool's own words into the three outcomes, and rejects a mapping that sends a timeout to proven or that invents a fourth outcome. The test shows each failure caught on exactly its own row:

    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    REQUIRED = ["depths-recorded", "engines-named", "three-outcomes", "traces-replayable",
                "assumptions-reviewed", "hash-pinned-reruns", "loops-reported", "ignored-constructs-reported"]
    OUTCOMES = ("proven", "counterexample", "inconclusive")
    NEVER_PROVEN = ("timeout", "undetermined", "unknown", "bounded")
    
    def check_flow(flow):
        problems = ["missing: " + c for c in REQUIRED if c not in flow["has"]]
        for raw, mapped in flow["status_map"].items():
            if mapped not in OUTCOMES:
                problems.append("status " + raw + " maps outside the three outcomes")
            elif raw in NEVER_PROVEN and mapped == "proven":
                problems.append("status " + raw + " maps to proven")
        return problems
    
    good = {"has": list(REQUIRED), "status_map": {"pass": "proven", "fail": "counterexample", "timeout": "inconclusive"}}
    assert check_flow(good) == []
    
    thin = dict(good, has=["depths-recorded", "engines-named", "traces-replayable"])
    assert check_flow(thin) == ["missing: three-outcomes", "missing: assumptions-reviewed", "missing: hash-pinned-reruns",
                                "missing: loops-reported", "missing: ignored-constructs-reported"]
    
    relabelled = dict(good, status_map={"pass": "proven", "timeout": "proven"})
    assert check_flow(relabelled) == ["status timeout maps to proven"]
    fourth = dict(good, status_map={"pass": "proven", "pass-with-warnings": "pass"})
    assert check_flow(fourth) == ["status pass-with-warnings maps outside the three outcomes"]
    print("PASS: complete flow accepted; thin, relabelled and four-outcome flows are each rejected on their own row")

    What the review looks for

    • No lesson depends on a tool-specific behaviour; every result is stated as proven, counterexample, or inconclusive with its model and depth.

    • The evaluation checklist is applied to the project's own flow before signoff work starts.

    • Scale changes are named: capacity, engine choice, applications, and dashboards, not new semantics.

    Verify and debug

    When moving flows, rerun the course's own proof pairs on the new tool first: the passing and failing partners must reproduce before any project property is trusted there. If a result differs, suspect assumption or reset handling first, in this order: initial state, reset modelling, assumption semantics, then the engine. Read the loop report and the ignored-construct report on the first run: a loop cut at the wrong place or a delay ignored without a message changes the model without changing the result's label.

    Assuming the new tool proves the same thing the old one did: a proof migrated without rerunning, a combinational loop broken at an arbitrary point, or a simulation-only construct ignored with no message. Symptom is a clean migration with a first real bug found in silicon. Cause is trusting names over reruns. Fix: rerun every proof pair on the new flow, diff the ledger row by row, and read the loop and ignored-construct reports. Found by the migration checklist, which requires the rerun and both reports.

    “What would you check before adopting a formal tool?” The checklist: recorded depths, named engines per result, three outcomes with timeouts inconclusive, replayable minimised traces, reviewed and discharged assumptions, hash-pinned reruns, reported loops and ignored constructs. Then the migration rule: rerun the proof pairs first and diff the ledger before trusting any migrated result.

    Check yourself The new flow reports a result the course flow never names, somewhere between proven and inconclusive. How do you file it?

    Under inconclusive until it is understood: only proven, counterexample, and inconclusive enter the ledger, and anything else fails the gate loudly.

    Check yourself What changes when the design grows tenfold: the semantics of a proof or its cost?

    Its cost and its organisation: capacity, engines, applications, parallelism. A proof still means proven for the stated model and assumptions, whatever the tool.

    Related topics

    • Earlier: Result Triage and Trends

    • Foundations: The Formal Tool Flow

    • Later: Appendix Open-Source Flow

    Previous

    144 / 183

    Next: Interview Prep

    Up next

    Up nextInterview Prep

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • CI for Formal