Why must you query .mean/.std_dev on POCV attributes instead of the bare attribute?
From PDVerse STA Mentor Guide, part of the pdVerse Mentor Guide
Short Answer
Under POCV (parametric on-chip variation), a slack or arrival value isn't one number, it's a statistical distribution, so there is no single scalar the bare attribute could return. .mean gives the average of that distribution and .std_dev gives its sigma, the spread.
Technical Explanation
In an ordinary, deterministic timing run, an arrival or slack value is one number, so asking for the attribute directly makes sense.
- What changes under POCV: the tool now represents that same quantity as a distribution โ a mean plus a spread (sigma) โ because POCV models cell delay as varying randomly around a center value, not as one fixed number.
- Why the bare attribute comes back empty: there's no single number to hand back for a distribution, so querying it directly returns an empty list,
{}. People often misread that as "the attribute doesn't exist" or "POCV isn't actually enabled" โ it does exist, you just have to ask for one specific statistic of it. .meanand.std_dev:.meanreturns the average of the distribution;.std_devreturns its standard deviation, the sigma that describes how much it typically varies.- Where this convention shows up: the same pattern applies to the whole POCV attribute family โ pin-level
min_rise_variation_arrival,max_fall_variation_slack, and the path- and timing-point-levelvariation_arrivalandvariation_slack. - What it means for scripting: any Tcl script doing sorting, thresholding, or margin arithmetic on POCV results has to be explicit about which statistic it wants. A script written for deterministic slack that's simply pointed at a POCV run won't error, it'll just silently return empty results instead of wrong ones.
Common Mistake
The Trap: reusing a deterministic-mode Tcl script unchanged against a POCV run and trusting an empty result as "clean, no violations."
- The script queries the bare
slackattribute, gets{}on every path, and treats that as zero violations rather than a query error. - The real slack numbers were sitting there the whole time under
.mean/.std_dev; the script simply never asked for them, so a genuinely violating design can pass a broken check silently.
Follow-up Question & Model Response
If .mean and .std_dev are separate queries, how would you build a single "effective slack" number for ranking paths under POCV?
Candidate Model Response: A common approach is to combine the two statistics into one pessimism-adjusted number, for example mean slack minus some multiple of sigma, such as three sigma, to represent a conservative, low-probability-of-failure value. That means querying both .mean and .std_dev in the same script and doing the arithmetic yourself in Tcl, since the tool doesn't hand back a single blended figure. Which multiple of sigma to use is a signoff-policy choice, not a fixed PrimeTime default, so it should match whatever margin convention the project already uses for statistical timing.
Practical Example
A POCV-enabled run on a 200 MHz core reports get_attribute [get_timing_paths -to reg_out/D] slack (PT) as an empty list. Switching the query to get_attribute [get_timing_paths -to reg_out/D] slack.mean returns 45 (ps), and slack.std_dev returns 6 (ps). A signoff script computing mean minus three sigma gets 45 โ 18 = 27 ps of pessimism-adjusted slack, still positive, so the path passes even under the conservative statistical margin.
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