Hold Analysis, Step by Step
Setup asks whether the data is fast enough. Hold asks whether it is too fast - whether new data can race through a short path and spoil a capture that is still happening. The arithmetic is the same stopwatch, but with the fastest delays, the same clock edge at both ends, and no clock period anywhere. That last fact changes everything about how hold problems are found and fixed.
- How hold arrival and hold required time are built, and why they use the fastest delays
- How to compute hold slack, on one line
- Why the clock period is not in the hold check, and what that means for fixing it
- How setup and hold together leave a window of allowed skew
- How to read a hold report line by line
- Volume 04, for arrival time, required time and reading a report
5.1 Hold arrival and required time
A hold check asks whether new data can arrive too soon. It takes the earliest the data can reach the capture flip-flop, and compares it with how long the old value must be held. Both are counted from the same clock edge.
At every clock edge two things happen at once. The launch flip-flop sends out new data, and the capture flip-flop stores the old data sitting at its input. If the new data reaches the capture flip-flop before it has finished storing, the old value is spoiled.
So this time the danger is a fast path. Everything is measured with the fastest delays the library allows, because the question is how early the data could possibly be.
The short path
This volume uses a short path on the same 200 MHz clock as Volume 04: one buffer between two flip-flops, with the capture clock arriving a little late.
Hold arrival: the earliest the data can get there
| Step | Adds | Running total |
|---|---|---|
| Launch edge | - | 0.00 ns |
| Clock source latency | 0.50 | 0.50 ns |
| Clock tree to u_ff3 | 0.33 | 0.83 ns |
| Clock-to-Q, fastest | 0.15 | 0.98 ns |
| u5 buffer, fastest | 0.05 | 1.03 ns |
| Hold arrival time | 1.03 ns |
Hold required: how long the old value must be left alone
| Step | Adds | Running total |
|---|---|---|
| Capture edge - the same edge | - | 0.00 ns |
| Clock source latency | 0.50 | 0.50 ns |
| Clock tree to u_ff4 | 0.47 | 0.97 ns |
| Clock uncertainty for hold | 0.03 | 1.00 ns |
| Library hold time of u_ff4 | 0.04 | 1.04 ns |
| Hold required time | 1.04 ns |
For setup, the required time is a deadline: arrive before it. For hold, it is a starting gate: the new data must arrive after it. That is why the margins are added on the hold side, where setup subtracted them.
Using the slow delays for a hold check. Hold is about the data being too early, so the tool uses the fastest clock-to-Q and the fastest logic it can find. A path that is safely slow in the setup report can still fail hold with its fast numbers.
With no skew, a path's fastest clock-to-Q is 0.11 ns and its fastest logic is 0.09 ns. The hold time is 0.06 ns. What is the hold slack?
Show the answer
Answer: A. The new data arrives 0.11 + 0.09 = 0.20 ns after the edge, and must not arrive before 0.06 ns. Hold slack = 0.20 - 0.06 = 0.14 ns. The clock latencies were equal, so they cancel.
5.2 Hold slack
Hold slack is the arrival time minus the required time - the other way round from setup. Negative hold slack means the new data got there too soon.
For the short path:
It fails, by 10 picoseconds.
The same sum on one line
Let the source latency cancel, and write skew as the capture clock arrival minus the launch clock arrival (0.97 - 0.83 = +0.14 ns):
0.15 + 0.05 - 0.04 - 0.14 - 0.03 = -0.01 ns. Compare it with the setup line from Volume 04:
| Setup slack | Hold slack | |
|---|---|---|
| Clock period T | + T | not there |
| Skew | + skew | - skew |
| Clock-to-Q and logic | subtracted, slowest values | added, fastest values |
| Library time | - setup | - hold |
| Uncertainty | - setup uncertainty | - hold uncertainty |
Look at the skew row. A late capture clock gives setup more time and hold less. It is the same 0.14 ns, pulling the two checks in opposite directions.
A long path is safe from hold
The adder path from Volume 04 has fast numbers too: its logic takes at least 1.14 ns. Its hold arrival is 2.14 ns and its hold required time is 0.95 ns, giving a hold slack of +1.19 ns. Long paths almost never fail hold. The dangerous ones are short: a buffer, a wire, or nothing at all.
Setup fails on long paths. Hold fails on short ones. A timing report sorted by hold slack is full of paths with one or two cells in them.
Fastest clock-to-Q 0.10 ns, fastest logic 0.07 ns, hold 0.05 ns, hold uncertainty 0.04 ns. The capture clock is 0.12 ns late. What is the hold slack?
Show the answer
Answer: C. slack = 0.10 + 0.07 - 0.05 - 0.12 - 0.04 = -0.04 ns. The positive skew is what breaks it: with no skew the slack would be +0.08 ns.
5.3 Why hold ignores the clock period
A hold check compares a clock edge with itself, so the clock period cancels out. A hold violation is exactly the same at any frequency - which is why it is the more dangerous of the two.
Volume 01 showed this with one path. Here it is again with the short path, checked at five clock speeds:
| Period | Frequency | Setup slack | Hold slack |
|---|---|---|---|
| 2.00 ns | 500.0 MHz | 1.69 ns | -0.01 ns |
| 5.00 ns | 200.0 MHz | 4.69 ns | -0.01 ns |
| 10.00 ns | 100.0 MHz | 9.69 ns | -0.01 ns |
| 50.00 ns | 20.0 MHz | 49.69 ns | -0.01 ns |
| 1000.00 ns | 1.0 MHz | 999.69 ns | -0.01 ns |
The setup slack follows the period exactly. The hold slack does not move at all.
Why the period drops out
- Setup compares the launch edge with the next edge, one period later. The period is the gap between them, so it sits in the sum.
- Hold compares the launch edge with the capture that happens at that same edge. There is no gap between them to measure.
- So hold depends only on how fast the path is and how the clock tree is balanced - both fixed once the chip is built.
A chip with a setup violation can be run at a slower clock and sold as a slower part. A chip with a hold violation fails the same way at every clock speed, at every voltage where its fast path stays fast. There is no knob to turn. It is scrap, which is why hold is checked with such care.
Waiting until the design is nearly finished to look at hold. Before the clock tree is built, skew is unknown, and hold can look clean. The first report with a real clock tree often shows thousands of new hold violations at once. Plan for them.
The path in the last quick check fails hold by 0.04 ns at 200 MHz. What is its hold slack at 1 GHz, and at 100 MHz?
Show the answer
Answer: B. The clock period is not in the hold sum, so the slack is -0.04 ns at every frequency. Only the data path and the clock tree can change it.
5.4 Ten worked hold problems
Nine hold problems, then one that puts setup and hold side by side. Use the one-line formula: slack = clock-to-Q + logic - hold - skew - uncertainty, all with the fastest delays.
A plain path
Fastest clock-to-Q 0.10 ns, fastest logic 0.30 ns, hold time 0.05 ns. No skew, no uncertainty.
Show the solution
Arrival 0.10 + 0.30 = 0.40 ns. Required 0.05 ns. Hold slack = 0.35 ns, met.
Uncertainty joins in
Clock-to-Q 0.10 ns, logic 0.08 ns, hold 0.05 ns, hold uncertainty 0.05 ns.
Show the solution
Arrival 0.18 ns. Required 0.05 + 0.05 = 0.10 ns. Hold slack = 0.08 ns, met.
A late capture clock hurts
Clock-to-Q 0.12 ns, logic 0.10 ns, hold 0.04 ns. The clock reaches the launch flop after 0.50 ns and the capture flop after 0.70 ns.
Show the solution
Arrival 0.50 + 0.12 + 0.10 = 0.72 ns. Required 0.70 + 0.04 = 0.74 ns. Hold slack = -0.02 ns, violated. The skew of +0.20 ns did it.
An early capture clock helps
The same path, but the capture clock arrives after only 0.40 ns.
Show the solution
Arrival is still 0.72 ns. Required 0.40 + 0.04 = 0.44 ns. Hold slack = 0.28 ns, met.
Negative skew helps hold - and, as Volume 04 showed, costs setup the same amount.
How much delay to add?
Go back to the violating path of problem 3. A buffer adding 0.05 ns at its fastest is inserted in the data path. What is the hold slack now?
Show the solution
The fastest logic becomes 0.10 + 0.05 = 0.15 ns, so the arrival becomes 0.77 ns. Required is still 0.74 ns. Hold slack = 0.03 ns, met.
At least 0.02 ns had to be added; the buffer gave 0.05 ns. A tool picks the smallest delay cell that clears the violation without hurting setup.
No logic at all
One flip-flop drives another directly: no gates in between. Clock-to-Q 0.14 ns, hold 0.06 ns. The clock reaches them at 0.20 and 0.25 ns.
Show the solution
Arrival 0.20 + 0.14 = 0.34 ns. Required 0.25 + 0.06 = 0.31 ns. Hold slack = 0.03 ns, met - but only just. Shift registers are built exactly like this, which is why their clock trees are balanced carefully.
A negative hold time
Clock-to-Q 0.10 ns, logic 0.02 ns, and the library lists a hold time of -0.03 ns. No skew.
Show the solution
Arrival 0.12 ns. Required -0.03 ns. Hold slack = 0.12 - (-0.03) = 0.15 ns, met. A negative hold time counts in your favour.
Picoseconds
Clock-to-Q 95 ps, logic 40 ps, hold 30 ps, hold uncertainty 20 ps. The capture clock arrives 110 ps after the launch clock.
Show the solution
95 + 40 - 30 - 110 - 20 = -25 ps, violated.
Fix it in the clock tree
The same path, but the clock tree is rebalanced so the capture clock arrives only 60 ps late.
Show the solution
95 + 40 - 30 - 60 - 20 = +25 ps, met. Removing 50 ps of skew fixed hold without touching the data path - but check setup, which just lost those 50 ps.
Problem 10: setup and hold together
One path, both checks. T = 2.00 ns. Clock-to-Q 0.10 ns slowest and 0.08 ns fastest. Logic 1.70 ns slowest and 0.05 ns fastest. Setup 0.06 ns, hold 0.05 ns, and skew +0.10 ns.
- Setup: 2.00 + 0.10 - 0.10 - 1.70 - 0.06 = +0.24 ns, met.
- Hold: 0.08 + 0.05 - 0.05 - 0.10 = -0.02 ns, violated.
- The same skew that helps setup is what breaks hold.
So what skew would work? Setup needs 0.14 + skew to stay above zero, so skew must be at least -0.14 ns. Hold needs 0.08 - skew to stay above zero, so skew must be at most +0.08 ns.
Skew is not good or bad. Every pair of flip-flops has a window of skew in which both checks pass. A clock tree is good when every pair lands inside its own window.
In problem 10, the skew is changed to +0.05 ns. Which checks pass?
Show the answer
Answer: D. +0.05 ns is inside the window from -0.14 to +0.08 ns. Setup slack becomes 0.14 + 0.05 = 0.19 ns and hold slack 0.08 - 0.05 = 0.03 ns. Both pass.
5.5 Reading a hold report
A hold report has the same shape as a setup report. Only three things differ: it says "min", the capture edge is the launch edge, and the last lines subtract the other way.
Startpoint: u_ff3
Endpoint: u_ff4
Path Group: clk
Path Type: min
Point Incr Path
----------------------------------------------------------------
clock clk (rise edge) 0.00 0.00
clock source latency 0.50 0.50
clock network delay (propagated) 0.33 0.83
u_ff3/CK 0.00 0.83
u_ff3/Q (clock-to-Q) 0.15 0.98
u5/Y (BUF_X1) 0.05 1.03
u_ff4/D 0.00 1.03
data arrival time 1.03
clock clk (rise edge) 0.00 0.00
clock source latency 0.50 0.50
clock network delay (propagated) 0.47 0.97
u_ff4/CK 0.00 0.97
clock uncertainty 0.03 1.00
library hold time 0.04 1.04
data required time 1.04
----------------------------------------------------------------
data arrival time 1.03
data required time -1.04
----------------------------------------------------------------
slack (VIOLATED) -0.01
The three differences from a setup report
- "Path Type: min". The fastest delays were used throughout. A setup report says "max".
- The second clock edge is at 0.00, not at 5.00. Same edge at both ends. No period appears anywhere.
- The uncertainty and the hold time are added, not subtracted. And the last lines take the required time away from the arrival, the reverse of setup.
Reading it for a fix
Look at the clock lines first. The clock network delay is 0.33 ns to u_ff3 but 0.47 ns to u_ff4: a skew of 0.14 ns. The whole path's data delay is only 0.20 ns. So there are two ways to fix it:
| Fix | Hold slack | Setup slack at 5 ns |
|---|---|---|
| As it is | -0.01 ns | 4.69 ns |
| Add a delay cell (0.08 ns fastest, 0.12 ns slowest) | +0.07 ns | 4.57 ns |
| Rebalance the tree so u_ff4's clock arrives at 0.40 ns | +0.06 ns | 4.62 ns |
Both fixes clear the violation, and both cost a little setup slack. With 4.6 ns of setup slack to spare, that costs nothing that matters here.
Fixing a hold violation that the report shows with a large clock uncertainty, before the clock tree is built. The uncertainty is standing in for skew nobody knows yet. Fix hold once the real clock tree exists, or the tool will pad hundreds of paths that never needed it.
In the hold report above, which number would change if the chip ran at 100 MHz instead of 200 MHz?
Show the answer
Answer: A. Nothing in a hold report depends on the period. The second clock edge is the same edge as the first, at 0.00, at any frequency. The whole report would be identical.
What you learned
- Hold asks whether new data can arrive before the old capture is finished, at the same clock edge.
- Hold arrival uses the fastest delays; hold required adds the capture clock, uncertainty and hold time.
- Hold slack = clock-to-Q + logic - hold - skew - uncertainty, and no clock period appears.
- Long paths fail setup; short paths fail hold.
- Skew helps one check and hurts the other, leaving a window of skew where both pass.
- A hold violation is fixed with delay in the data path or a better-balanced clock tree, never by slowing the clock.
- A hold report says "min", uses the same edge twice, and subtracts the required time from the arrival.
Key words from this volume
Every word below has a plain-English entry in the glossary.
Practice
Read the fix off the report
In the hold report, the clock reaches u_ff3 at 0.83 ns and u_ff4 at 0.97 ns. By how much would the capture clock have to arrive earlier to bring the hold slack exactly to zero?
Show the solution
The slack is -0.01 ns, and every picosecond taken off the capture clock latency adds a picosecond of hold slack. So the capture clock must arrive 0.01 ns earlier, at 0.96 ns.
Real flows aim for more margin than zero, which is why the rebalanced tree in 5.5 brought it down to 0.40 ns, giving +0.06 ns.
Why did hold appear after clock tree synthesis?
Before the clock tree was built, a design showed no hold violations with a hold uncertainty of 0.03 ns and an ideal clock. After the tree was built, the short path in this volume failed. What changed?
Show the solution
The skew. With an ideal clock both flip-flops see the edge at the same moment. So the short path had 0.15 + 0.05 - 0.04 - 0.03 = +0.13 ns of hold slack. The real tree delivers the capture clock 0.14 ns late, which takes that down to -0.01 ns.
This is normal. Hold is checked with an ideal clock for guidance only; the real answer comes after clock tree synthesis.
The skew window
A path has 0.35 ns of setup slack and 0.12 ns of hold slack with no skew. What range of skew keeps both checks passing?
Show the solution
Setup slack is 0.35 + skew, so skew must be at least -0.35 ns. Hold slack is 0.12 - skew, so skew must be at most +0.12 ns.
The window runs from -0.35 to +0.12 ns: 0.47 ns wide. The narrower the window, the harder that pair of flip-flops is for the clock tree.
Interview corner
Setup versus hold
"Why is a hold violation considered worse than a setup violation?"
Show the solution
"Because the clock period is not in the hold equation. A setup violation depends on the period, so a failing chip can still run at a lower frequency and be sold as a slower part. A hold violation is a race between the data and the clock at the same edge; it fails at every frequency, including very low ones. Once the silicon is made there is nothing to adjust, so a hold failure means the chip is scrap. That is why hold is signed off at the fast corner with real clock-tree skew."
Fixing hold
"You have a hold violation of 30 ps on a flop-to-flop path. How would you fix it, and what would you check afterwards?"
Show the solution
"First I would see whether it comes from skew or from a genuinely short data path. If the capture clock is unusually late, rebalancing the clock tree is the cleaner fix. Otherwise I would insert a delay cell or a buffer in the data path, at least 30 ps at the fast corner.
Afterwards I would re-check setup on that same path at the slow corner, because the added delay is larger there. And I would check other corners, since a hold fix sized at one corner can be too small at another."
Volume 06 turns to the clock itself. It covers the waveform and duty cycle, where latency comes from, skew in all its forms, jitter, and the difference between an ideal clock and a real one.