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

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • Reading Path
  • STA Glossary
  • STA Metrics Reference
  • STA Mastery Cheatsheet
  • Timing Paths and Checks16
  • Constraints & SDC Fundamentals20
  • Delay Graph & Path Analysis16
  • Beyond Setup and Hold16
  • Multi-Corner Multi-Mode Signoff16
  • OCV, AOCV, POCV and Variation16
  • Crosstalk and Noise16
  • ECO and Closure16
  • STA Debug Playbook16
    • Constraint Bug Patterns
    • View Mismatch Triage
    • Path Group War Room
    • Signoff Regression Hygiene
      • Run Comparison
      • Constraint Diffing
      • Reproducibility
      • Final Checklists
  • STA Interview Prep26
  • Capstone Timing Signoff Lab4
Loading lesson

‹Signoff Regression Hygiene
  1. Topics
  2. Static Timing Analysis
  3. STA Debug Playbook
  4. Signoff Regression Hygiene
  5. Run Comparison

Part 9 · Debug Playbook · All levels

Run Comparison

A manifest of every input per run turns a difference in results into one of four verdicts: explained by an input change, nondeterminism, an unused input change, or unexplained.

On this page

    Why it matters

    When two runs disagree, the first question is whether anything about them differed on purpose. A manifest lists each run's inputs, tool versions and settings. With it, a comparison of two runs has four possible readings, and each calls for a different response.

    Worked example

    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
    def verdict(man_a, man_b, slack_a, slack_b, tol=1e-4):
        changed = sorted(k for k in set(man_a) | set(man_b) if man_a.get(k) != man_b.get(k))
        differs = any(abs(slack_a[e] - slack_b[e]) > tol for e in slack_a)
        if not differs:
            if changed:
                return "manifests differ, results identical: check the input is actually used", changed
            return "identical within tolerance", changed
        if changed:
            return "explained by input changes", changed
        return "nondeterminism or unrecorded input", changed
    base = {"netlist": "r42", "constraints": "c17", "libs": "L5", "parasitics": "p3", "settings": "s9"}
    slack = {"e1": -0.020, "e2": 0.015, "e3": 0.040}
    same = dict(slack)
    shifted = {"e1": -0.031, "e2": 0.004, "e3": 0.040}
    new_man = dict(base, parasitics="p4")
    extra_man = dict(base, notes="reviewed")
    r1 = verdict(base, base, slack, same)
    r2 = verdict(base, new_man, slack, shifted)
    r3 = verdict(base, base, slack, shifted)
    r4 = verdict(base, extra_man, slack, same)
    assert r1 == ("identical within tolerance", [])
    assert r2 == ("explained by input changes", ["parasitics"])
    assert r3 == ("nondeterminism or unrecorded input", [])
    assert r4 == ("manifests differ, results identical: check the input is actually used", ["notes"])
    print("PASS:", r1[0], "/", r2[0], r2[1], "/", r3[0], "/", r4[0])

    Manifests

    Results

    Verdict

    Response

    Identical

    Identical (within tolerance)

    Reproducible

    Nothing to do

    Differ

    Differ

    Explained by the changed inputs

    Check the size of the shift is plausible for the change

    Differ

    Identical (within tolerance)

    Changed input had no effect

    Check the changed input is actually used

    Identical

    Differ

    Nondeterminism or an input not in the manifest

    Fix the flow: reproducibility is a defect

    Case 1: same inputs, same slacks: reproducible. Case 2: the parasitics version changed and slacks moved by 11 ps at two endpoints: an explained difference, but an explained verdict also needs a plausibility check that the size of the shift fits the change. Case 3: the manifests differ only in a key that should not affect timing yet slacks are unchanged: check the changed input is actually used, since a manifest entry the flow ignores gives false confidence. Case 4: the manifests are identical yet slacks differ: either the flow is nondeterministic or something that affects the result is missing from the manifest. The manifest comparison uses the union of keys, so a key present in only one manifest still counts as a change. This last case is the one that matters most, because nothing about it can be explained away, and it is also a signoff problem: you cannot reproduce your own results.

    What goes into a manifest

    • Netlist, constraint, library and parasitic versions or content hashes, per scenario.

    • Tool version, settings, derates, uncertainty, and any command-line options.

    • Host details only when the flow depends on them (thread counts, for instance).

    What the review looks for

    • Every reported result links to its manifest; every comparison starts by diffing manifests.

    • Verdicts of the third kind are treated as defects and fixed before results are used.

    • Manifests are generated by the flow, not typed by hand.

    Common pitfall

    Comparing two results without their manifests. Any story that explains the difference then sounds plausible, including wrong ones.

    Interview

    Give the four verdicts and what each one asks for.

    Check yourself The manifests differ in the uncertainty value only, and slacks differ at every endpoint by about 20 ps. What is the verdict?

    Explained by input changes (uncertainty), provided the size of the shift is consistent with the change in uncertainty.

    Related topics

    • Next: Constraint Diffing

    • Handoff Between Tools

    Previous

    150 / 183

    Next: Constraint Diffing

    Up next

    Up nextConstraint Diffing

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Reproducibility
    • Final Checklists