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 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
On this page

    Part 8 of 11, lesson 1 of 16Part 8 of 11/ECO and Closure/Lesson 1 of 16All levels

    Closure Strategy

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

    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.

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

    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 lessonPrevious lessonReport an error

    See also

    • Fixing Setup
    • Order of Operations