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
    • Setup and Hold Closure Order
      • Closure Strategy
      • Fixing Hold Safely
      • Fixing Setup
      • Order of Operations
    • Physical vs Logical ECOs
    • Useful Skew Trade-offs
    • ECO Regression Matrix
  • STA Debug Playbook16
  • STA Interview Prep26
  • Capstone Timing Signoff Lab4
Loading lesson

‹Setup and Hold Closure Order
  1. Topics
  2. Static Timing Analysis
  3. ECO and Closure
  4. Setup and Hold Closure Order
  5. Fixing Hold Safely

Part 8 · ECO and Closure · All levels

Fixing Hold Safely

Hold is fixed by adding delay on short paths, but the delay costs setup slack on the same endpoint; check that each fix fits before inserting it.

On this page

    Why it matters

    Hold fixes insert delay, and delay on a path is delay on every check through it. If the setup slack at that endpoint is smaller than the delay needed, the fix trades a hold violation for a setup one. Checking each fix against the available setup slack prevents that.

    Worked example

    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    margin = 0.005
    endpoints = [("e1", -0.030, 0.200), ("e2", -0.010, 0.020), ("e3", -0.050, 0.040), ("e4", 0.004, 0.500)]   # (name, hold slack, setup slack) in ns
    rows = {}
    for name, hold, setup in endpoints:
        need = max(0.0, margin - hold)            # delay to add so hold slack reaches the margin
        left = setup - need
        rows[name] = (round(need, 3), round(left, 3), left >= -1e-12)
    assert rows == {"e1": (0.035, 0.165, True), "e2": (0.015, 0.005, True), "e3": (0.055, -0.015, False), "e4": (0.001, 0.499, True)}
    fits = [n for n, r in rows.items() if r[2]]
    assert fits == ["e1", "e2", "e4"]
    print("PASS: fixes that fit", fits, "; needs another method:", [n for n, r in rows.items() if not r[2]])

    Endpoint

    Hold slack (ns)

    Delay needed (ns)

    Setup slack (ns)

    Setup left after fix

    Fits?

    e1

    -0.030

    0.035

    0.200

    0.165

    Yes

    e2

    -0.010

    0.015

    0.020

    0.005

    Yes, barely

    e3

    -0.050

    0.055

    0.040

    -0.015

    No

    e4

    +0.004

    0.001

    0.500

    0.499

    Yes

    e1 and e4 have plenty of setup slack to spend. e2 fits with 5 ps left, so it is safe but it must be marked as having used its slack. e3 needs 55 ps and has only 40 ps: inserting the delay would turn a hold violation of 50 ps into a setup violation of 15 ps. e3 needs a different approach (see order of operations), such as reducing the spread between its longest and shortest paths. A hold fix at the endpoint adds the same delay to every path that reaches it, so the check uses the worst setup slack of those paths.

    Placement of the delay

    Insert near

    Effect

    The endpoint (flop D pin)

    Affects only paths into that endpoint; safest for setup elsewhere

    The middle of the fan-in

    May fix several endpoints at once but costs setup on all of them

    The launch point

    Affects every path from it, and clock-to-Q timing

    What the review looks for

    • Each hold ECO lists the delay added and the setup slack left; slack left near zero is flagged.

    • Delay is inserted as close to the endpoint as possible unless there is a reason to share it.

    • Hold fixes are done in all hold scenarios together; a fix verified in one corner can still fail in another.

    Common pitfall

    Fixing hold in the fast corner and discovering setup failures in the slow corner. A delay cell that adds 40 ps in the fast corner adds more in the slow one.

    Interview

    State the rule: a hold fix must fit within the setup slack of the same endpoint.

    Check yourself e2's hold fix leaves 5 ps of setup slack in the typical corner. What else would you check?

    The slow corner: the inserted delay is larger there, so the real setup slack left may be negative.

    Related topics

    • Closure Strategy

    • Next: Fixing Setup

    Previous

    123 / 183

    Next: Fixing Setup

    Up next

    Up nextFixing Setup

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Order of Operations