Why does inserting buffers along a long clock wire actually reduce delay instead of just adding more delay?
From PDVerse PnR Interview Handbook · pdVerse Mentor Guide
Short Answer
A long wire's propagation delay is dominated by RC and grows with the square of length: t = rcL^2/2. Splitting that wire into N equal segments with a buffer between each one reduces the wire-delay term quadratically -- t = rc(L/N)^2 + (N-1)t_b -- so even though you're adding N-1 buffer delays, the L^2-to-(L/N)^2 reduction more than pays for it once N is large enough. Setting the derivative to zero gives the optimal buffer count: N = Lsqrt(rc/t_b).
Technical Explanation
- A long wire's propagation delay from RC is t = rcL^2/2 -- the L^2 term means delay grows with the square of length, not linearly.
- Splitting the wire into N equal sections with a buffer at each junction changes the formula to t = rc(L/N)^2 + (N-1)*t_b -- the wire-delay term drops quadratically with N, while the buffer-delay term only grows linearly.
- Because one term drops quadratically and the other only grows linearly, adding buffers genuinely reduces total delay up to a point -- this is algebra, not a rule of thumb.
- Setting the derivative of total delay with respect to N to zero gives the optimal buffer count: N = L*sqrt(rc/t_b).
- Tapering buffers don't need to be identical -- drive strength can increase monotonically by a factor alpha per level (alpha^0d, alpha^1d, alpha^2*d, ...) to match the growing load as the tree fans out.
report_clock_qor -type latencyshows the tool-measured insertion delay for a live tree, letting you compare it directly against the t = rc(L/N)^2 + (N-1)t_b formula's prediction.
Formula Or Decision Rule
Undivided wire delay: t = rcL^2/2. Segmented (N buffers) wire delay: t = rc(L/N)^2 + (N-1)t_b. Optimal buffer count: N = Lsqrt(rc/t_b) (from setting dt/dN = 0). Decision rule: increase N toward this optimum while the quadratic wire-delay reduction still outweighs the added linear buffer delay; beyond it, more buffers cost more than they save.
Common Mistake
The Trap: Assuming every added buffer is pure overhead ("more cells = more delay"), without recognizing that the wire-delay term they're splitting up drops quadratically, not linearly -- which is exactly why buffering long wires is a net win, not a compromise.
Follow-up Question & Model Response
"What property must a clock buffer have that a normal data-path buffer doesn't need as strictly?"
Candidate Model Response: Equal rise and fall delay time -- clock buffers need this to preserve duty cycle and avoid clock pulse-width degradation as the signal propagates; a normal data buffer has no duty-cycle requirement to protect. Since perfect rise/fall balance is hard to guarantee, inverters are often used instead of buffers for clock tapering.
Practical Example
Worked Example: For a wire with r=0.5 ohm/um, c=0.0002 fF/um, buffer delay t_b=20ps, and length L=2000um: N = Lsqrt(rc/t_b) = 2000sqrt((0.50.0002)/20) ≈ 2000sqrt(0.000005) ≈ 2000*0.00224 ≈ 4.5, rounding to about 4-5 buffers along that run -- not an arbitrary choice, a direct consequence of the formula.
Physical Design & Planning Handbook
Master ASIC Physical Design Planning & Floorplanning
Dive into 14 comprehensive chapters covering netlist sanity, FinFET grids, macro placement, power grids, CTS, and timing budgeting.
Continue practising