Why does fixing a hold violation use different methods than fixing a setup violation?
From PDVerse STA Mentor Guide ยท pdVerse Mentor Guide
Short Answer
A setup fix has to make a path faster, so fix_eco_timing -type setup (PT) uses cell sizing alone to shrink data-path delay. A hold fix has to make a path slower, so fix_eco_timing -type hold (PT) uses both sizing and buffer insertion to add delay back in. The two violations need opposite changes to the same path, which is why the tool treats them as separate fixing types, not one generic "fix timing" command.
Technical Explanation
Setup and hold are opposite problems, and an ECO fix that helps one can actively hurt the other if it is not told which one to target.
- A setup violation means data arrived too late relative to the capturing clock edge โ the fix removes delay from the data path, which a stronger cell can do.
- A hold violation means data arrived too early relative to the next clock edge โ the fix adds delay, which sizing alone often cannot do without breaking setup elsewhere, so a buffer is used instead.
fix_eco_timing -type setup(PT) is allowed to introduce new hold violations while removing setup ones, since setup violations are treated as the harder problem to clear.fix_eco_timing -type hold(PT) instead avoids introducing new setup or design-rule violations, since a hold fix usually has more margin to work with.- Running the wrong type does nothing useful โ a setup fix on a hold violation tries to speed up a path that is already too fast for the next check.
- Because the two directions can conflict on a shared path, hold fixing normally runs after setup fixing has already converged.
Common Mistake
The Trap: assuming one generic "fix the timing" pass handles both violation types together.
- Running only fix_eco_timing -type setup on a design leaves every hold violation completely untouched, since it was never asked to add delay anywhere.
- The two types have to be run โ and reviewed โ separately, in that order, because sizing for one can shift the other's margin.
Follow-up Question & Model Response
If fixing a hold violation by adding a buffer pushes a nearby path's setup slack down, is that considered an ECO failure?
Candidate Model Response: Not automatically โ fix_eco_timing -type hold (PT) is built to avoid introducing new setup or DRC violations, so a well-behaved hold fix checks this side effect before committing to a change. If a buffer would cause a nearby setup violation, the command looks for a different fix on that endpoint, such as a smaller buffer or a different insertion point. This is why hold fixing is more constrained, and often slower to converge, than setup fixing, which is allowed to trade away some hold margin since setup violations are considered the harder problem.
Practical Example
A block has three hold violations at -15ps each, in one clock domain. fix_eco_timing -type hold -buffer_list {DLY1X2 DLY2X2} (PT) inserts one small buffer per endpoint, bringing all three to positive slack while leaving the domain's tightest setup path unchanged at +20ps, confirmed by a follow-up report_constraint run.
Complete STA Handbook
Master Signoff-Ready Static Timing Analysis
Get the complete 10-chapter STA handbook covering setup/hold margins, clock modeling, OCV/POCV, crosstalk noise, and PrimeTime closure.

Continue practising