Two engineers get different slack on the same path, same corner. One used report_timing, the other report_crpr plus hand arithmetic. How do you adjudicate?
From PDVerse STA Mentor Guide, part of the pdVerse Mentor Guide
Short Answer
report_timing is the signoff number, and the gap almost certainly comes from a merging step that only report_timing performs: it merges adjacent common-clock-path points whose reconvergence pessimism differs by less than a threshold, 5 picoseconds by default, which slightly under-credits pessimism removal. report_crpr reports the unmerged, more granular value, so hand-adding its numbers on top of a separately-run report_timing double-counts or misaligns the credit.
Technical Explanation
This is not really a disagreement about which command is right — it is two different levels of granularity on the same calculation.
- Why
report_timingmerges points at all. For computational efficiency,report_timing(PT) merges points along the shared clock path when the CRP difference between adjacent points is small, controlled bytiming_crpr_threshold_ps(PT), default 5 picoseconds. - What that merging costs. Merging close-but-not-identical points slightly under-credits the true pessimism removal. The guide states plainly: when
report_crprandreport_timingdisagree on CRP, thereport_crpr(PT) value is the more accurate one, since it skips the merging step. - Why
report_timingis still the signoff number. Despite the slightly less precise CRP,report_timing(PT) is the tool's official, integrated slack — folding in path-specific derating, voltage/temperature scaling, and SI delta-delay in one consistent pass. A hand-assembled number is not that same calculation, and manual arithmetic reintroduces its own errors — a missed slew-dependent derate, a transposed sign, or the wrong path's CRP value. - The adjudication is procedural. First, confirm both engineers ran the identical netlist, SDC, and PrimeTime version — a stale cache or uncommitted local edit produces exactly this mismatch. Second, re-run
report_timing -derate -path_type full_clock_expanded(PT) on the path to see the full arc-by-arc breakdown officially used for signoff. Third, checkreport_crpr(PT) for that path and see if the CRP gap is close to the 5 ps default threshold — if so, merging is the likely explanation. - The rule to state plainly: the official signoff slack comes from
report_timing(PT);report_crpr(PT) is a diagnostic for the CRP component, never a substitute for the integrated calculation, and hand arithmetic overrides neither.
Common Mistake
The Trap: trusting a manually-assembled CRPR number over report_timing (PT) output when preparing a formal signoff waiver, because the manual number looks more "precise".
- Hand arithmetic on top of
report_crpr(PT) output easily misses transition-time derates, non-linear slew propagation, or picking the correct edge-specific reconvergence point — none of which show up as an obvious error in the spreadsheet. - A waiver built on the hand number rather than the tool's official slack is not reproducible by a reviewer re-running the same commands, which is itself a signoff red flag.
Follow-up Question & Model Response
"What would you check to confirm CRPR itself is even enabled and correctly configured before trusting either number?"
Candidate Model Response: I would confirm set_app_var timing_remove_clock_reconvergence_pessimism true (PT) is active for the run, since CRPR is disabled by setting that variable false and the whole mechanism silently stops applying if it is off. I would also check timing_crpr_threshold_ps (PT) is at its intended value — the guide recommends setting it to about half the smallest CRP difference you care to resolve — because a threshold left far too large would merge more points than intended and understate pessimism removal more than the default already does.
Practical Example
Two engineers report slack on the same path launched from regA, captured at regB, both under the SSG 0.81 V 125 °C corner. Engineer A's report_timing -derate -path_type full_clock_expanded (PT) shows −12 ps slack with a 38 ps CRP credit already folded in. Engineer B manually summed a report_crpr (PT) printout showing a 45 ps CRP credit and arrived at +5 ps by adding that credit to a slack number pulled from an older run. Re-running report_crpr (PT) on Engineer A's exact netlist and SDC confirms the same 45 ps unmerged credit, while report_timing's internal merging under the 5 ps default threshold rounds it to the 38 ps folded into the official slack — the 17 ps discrepancy is entirely explained by the merging behavior plus Engineer B pulling a stale baseline slack rather than a genuine tool disagreement.
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.
Offline PDF Bundle
Want all 1109 questions offline?
Get the complete 4-book PDF bundle (PnR, STA, MMMC, Low Power) with a clickable table of contents - no ads, no internet needed.

Continue practising