The timing-closure triage checklist: what to do when slack goes negative

The timing report says -0.42 ns and the demo is Friday. Timing closure rewards systematic triage over heroics — the fastest engineers I know all work the same ladder, in the same order. Here it is.

Step 0: trust, but verify the constraints

Before optimizing anything, confirm the failure is real:

A quarter of "timing problems" end here, fixed by making the constraints describe reality. Full command syntax in the Vivado TCL cheatsheet.

Step 1: read the failing path like a story

report_timing -max_paths 10 and actually read it:

Step 2: the cheap wins, in order of cheapness

  1. Enable primitive output registers. BRAMs and DSPs have free pipeline stages; using them is a netlist attribute or one line of RTL.
  2. Retime around the critical path. Move a register across a chunk of logic; total latency unchanged, worst path halved.
  3. Reduce fanout of the hot net. max_fanout attributes or manual register duplication for enables/resets that fan to thousands of loads (see reset strategies — often it's the reset net).
  4. Pipeline the arithmetic. A 64-bit add-compare-select in one cycle at 300 MHz is asking a lot; two stages make it easy. The multipliers lesson shows the area/time dial.
  5. One-hot the hot FSM. Wide state decoders shrink to single-bit tests (FSM generator will re-emit yours one-hot).

Step 3: the structural moves

Step 4: the last 50 picoseconds

Multiple place-and-route seeds, phys_opt_design iterations, tool-directive exploration. Legitimate — but if you're here every build, the design has structural debt from steps 2–3. Margin, not luck, is the goal: close with 5% to spare and the next RTL change doesn't reopen the hunt.

The habit that prevents the fire drill

Run timing analysis from the first day the RTL elaborates, not the week before the demo. Negative slack on day 2 is a design conversation; negative slack on day 90 is an emergency. Pair it with report_cdc and the constraints cheatsheets, and Friday demos get a lot more relaxing.