The method is a signoff decision with cost: pessimism costs area, power and schedule; optimism costs silicon. The decision should be made from a comparison on real paths, not from habit.
Method | Needs | Strength | Weakness |
|---|---|---|---|
Flat OCV | Two numbers per scenario | Simple, quick, easy to audit | Pessimistic for deep paths |
Depth-based | Tables by depth (and distance) | Credits averaging over stages | Ignores which cells are on the path |
Statistical | Sigma per cell and arc | Per-path margin; sees outlier cells | More data, more run time, independence assumed |
import math
paths = {
"p1": {"means": [0.10] * 3, "sigmas": [0.005] * 3},
"p2": {"means": [0.10] * 9, "sigmas": [0.005] * 9},
"p3": {"means": [0.10] * 16, "sigmas": [0.005] * 14 + [0.03, 0.03]}, # two noisy cells
}
budget = {"p1": 0.38, "p2": 0.97, "p3": 1.72} # ns available to the data path
def slack_flat(p):
return budget[p] - sum(paths[p]["means"]) * 1.15
def slack_depth(p):
n = len(paths[p]["means"])
return budget[p] - sum(paths[p]["means"]) * (1 + 3 * 0.05 / math.sqrt(n))
def slack_stat(p):
sg = math.sqrt(sum(s * s for s in paths[p]["sigmas"]))
return budget[p] - (sum(paths[p]["means"]) + 3 * sg)
res = {p: tuple(round(f(p), 3) for f in (slack_flat, slack_depth, slack_stat)) for p in paths}
assert res == {"p1": (0.035, 0.054, 0.054), "p2": (-0.065, 0.025, 0.025), "p3": (-0.12, 0.06, -0.019)}
fails = {m: [p for p in paths if res[p][i] < 0] for i, m in enumerate(("flat", "depth", "statistical"))}
assert fails == {"flat": ["p2", "p3"], "depth": [], "statistical": ["p3"]}
print("PASS: slack (flat, depth, statistical)", res, "; failing", fails)Path | Flat 1.15 | Depth-based | Statistical (3 sigma) |
|---|---|---|---|
p1 (3 stages) | 0.035 | 0.054 | 0.054 |
p2 (9 stages) | -0.065 | 0.025 | 0.025 |
p3 (16 stages, two noisy cells) | -0.120 | 0.060 | -0.019 |
Flat OCV fails two of three paths: it charges 15% to every path regardless of depth. Depth-based derating passes all three, because it credits averaging over 9 and 16 stages. Statistical analysis agrees with the depth-based result on the two uniform paths but fails p3: two noisy cells (sigma 0.03 ns each) give it a sigma of 0.046 ns, which the depth-based table, blind to which cells are on the path, does not see. Flat is the safest and most expensive, depth-based the cheapest here and the one that missed the real risk, statistical the one that found it. All numbers are illustrative.
Flat OCV is used for early implementation and as a conservative cross-check.
Depth-based or statistical analysis is used for signoff where the process provides the data; many flows use one for implementation and the other to confirm.
Whatever is chosen is written in the signoff policy and applied the same way to every scenario.
The method, its data source and the number of sigmas or the table version are stated in the signoff package.
A comparison on real paths shows what the chosen method gains and what it can miss.
Paths with unusually variable cells are reviewed individually, whichever method is used.
The statistical method, because it carries a sigma per cell and p3 has two noisy cells. The depth-based table depends only on the number of stages (16), so it gave p3 the same small derate as any 16-stage path.