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. Closure Strategy

Part 8 · ECO and Closure · All levels

Closure Strategy

Each round removes a fraction of violations and breaks a few near-critical endpoints; the loop stalls where those two balance.

On this page

    Why it matters

    Every ECO round fixes most of what it targets and disturbs a few paths that were passing with little margin. Early rounds look fast; later rounds crawl. A simple model shows why, and shows that late in closure, reducing the breakage rate helps more than fixing more.

    The model

    Diagram
    v(next) = v * (1 - f) + b * N
    f = fraction of current violations fixed per round
    b = fraction of near-critical endpoints (N of them) broken per round
    fixed point (stall level) = b * N / f
    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def run(f, b, n_near, v0, rounds):
        v, out = v0, [v0]
        for _ in range(rounds):
            v = v * (1 - f) + b * n_near
            out.append(v)
        return out
    def close(xs, ys):
        return all(abs(x - y) < 0.01 for x, y in zip(xs, ys)) and len(xs) == len(ys)
    a = run(0.7, 0.02, 300, 200, 7)
    c = run(0.7, 0.005, 300, 200, 7)
    assert close(a, [200, 66.0, 25.8, 13.74, 10.12, 9.04, 8.71, 8.61])
    assert close(c, [200, 61.5, 19.95, 7.485, 3.746, 2.624, 2.287, 2.186])
    floor_a, floor_c = 0.02 * 300 / 0.7, 0.005 * 300 / 0.7
    assert round(floor_a, 2) == 8.57 and round(floor_c, 2) == 2.14
    print("PASS: stall level", round(floor_a, 2), "with 2% breakage;", round(floor_c, 2), "with 0.5% breakage")

    Round

    Violations, 2% breakage

    Violations, 0.5% breakage

    0

    200

    200

    1

    66

    61.5

    2

    25.8

    20

    3

    13.7

    7.5

    4

    10.1

    3.7

    5

    9.0

    2.6

    6

    8.7

    2.3

    7

    8.6

    2.2

    With 300 near-critical endpoints, a fix rate of 70% and a breakage rate of 2%, the loop levels off at about 8.6 violations, not zero: each round fixes 70% of what is left but breaks 6 more. Cutting breakage to 0.5% lowers the stall level to about 2.1. The numbers are a model, not a prediction, but the shape is what teams see: rapid progress, then a long tail. Late in closure, the productive question is why fixes break things.

    What the review looks for

    • Closure is tracked as violations per round with the number of near-critical endpoints, so a floor is visible early.

    • Breakage is measured: new violations per ECO round, listed by cause.

    • When progress stalls, the response is a different kind of fix or a change of structure, not more of the same.

    Common pitfall

    Repeating the same fix type at a stall. Endpoints that survive several rounds are the ones the usual fixes cannot reach.

    Interview

    Describe closure as a loop with a fix rate and a breakage rate, and name the stall level.

    Check yourself With f = 0.8 and b = 0.01 and N = 400, what is the stall level?

    0.01 × 400 / 0.8 = 5 violations.

    Related topics

    • Next: Fixing Hold Safely

    Previous

    122 / 183

    Next: Fixing Hold Safely

    Up next

    Up nextFixing Hold Safely

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Fixing Setup
    • Order of Operations