Looking at a failing endpoint tells you what fails. Looking at which scenarios it fails in tells you why. The second question is faster to answer and narrows the search before any path is read.
Failing scenarios share... | Suspect |
|---|---|
One mode only | That mode's constraints: clocks, case values, exceptions |
All slow-process scenarios, setup | Genuine setup problem, or too-pessimistic derate |
All fast-process scenarios, hold | Genuine hold problem on short paths |
One interconnect corner only | Extraction or a long, resistive or highly coupled route |
One voltage only | Library at that voltage, or voltage-specific path |
Everything | Constraint or netlist problem, not a corner problem |
def parse(view):
mode, pvt, rc = view.split("/")
return {"mode": mode, "pvt": pvt, "rc": rc}
all_views = [f"{m}/{p}/{r}" for m in ("func", "scan") for p in ("ss", "ff") for r in ("cw", "cb")]
def explain(failing):
attrs = [parse(v) for v in failing]
out = {}
for key in ("mode", "pvt", "rc"):
values = {a[key] for a in attrs}
universe = {parse(v)[key] for v in all_views}
if len(values) == 1 and len(universe) > 1:
out[key] = values.pop()
return out
assert explain(["scan/ss/cw", "scan/ss/cb", "scan/ff/cw", "scan/ff/cb"]) == {"mode": "scan"}
assert explain(["func/ss/cw", "scan/ss/cw"]) == {"pvt": "ss", "rc": "cw"}
assert explain(all_views) == {}
print("PASS: pattern explanations computed for three failure sets")Four failing views that are exactly the scan-mode views are explained by the mode alone. Two failures that share both the slow process and the worst-capacitance corner are explained by those two attributes together. When every view fails, no attribute is shared more narrowly than the whole set, which is why that pattern points at constraints or the netlist rather than a corner.
Before any path analysis, a table of failing scenarios by attribute.
A claim of cause names the attribute and the evidence that other values of it pass.
A pattern explained by several attributes is split with one more scenario run.
At the failing mode's constraints: its clock definitions, case values and exceptions, because a corner-independent failure is a constraint-level one.