A block was signed off in 12 scenarios. A low-voltage power mode is added late and the matrix grows to 20. The overnight run reports 2,400 setup violations with a worst slack of -0.082 ns, all in one scenario, lowv_ss_cold_cworst. The other 19 scenarios, including lowv_ss_hot_cworst, are clean. Tape-out is nine days away. The team's first instinct is to suspect the new scenario's constraints.
Scenario (setup) | WNS (ns) | Violating endpoints |
|---|---|---|
func_ss_hot_cworst | +0.031 | 0 |
func_ss_cold_cworst | +0.044 | 0 |
lowv_ss_hot_cworst | +0.056 | 0 |
lowv_ss_cold_cworst | -0.082 | 2,400 |
16 other scenarios | all positive | 0 |
Which attributes do the failing scenarios share? Here: one mode and one temperature.
Is the failure uniform across endpoints, or concentrated? The report suggests broad: 2,400 endpoints.
What changed since the last clean run: the mode, the matrix, the libraries? The new mode and a new scenario.
Is the failing scenario a new kind of condition or a repeat of something already covered?
scenarios = {"func_ss_hot": 0.031, "func_ss_cold": 0.044, "lowv_ss_hot": 0.056, "lowv_ss_cold": -0.082}
failing = [s for s, w in scenarios.items() if w < 0]
assert failing == ["lowv_ss_cold"]
mode, pvt = failing[0].split("_", 1)[0], failing[0].split("_", 1)[1]
attrs = {s: s.split("_") for s in scenarios}
shared_mode = {a[0] for s, a in attrs.items() if s in failing}
other_cold = [s for s in scenarios if s.endswith("cold") and s not in failing]
assert shared_mode == {"lowv"} and other_cold == ["func_ss_cold"]
print("PASS: failing", failing, "; the other cold scenario passes:", other_cold, "; the other lowv scenario passes:", [s for s in scenarios if s.startswith("lowv") and s not in failing])Only the combination of the low-voltage mode and cold fails. The functional mode is fine when cold, and the low-voltage mode is fine when hot. Neither the mode alone nor the temperature alone explains it, which already rules out a broken mode constraint file (it would fail hot too) and a general cold-corner problem (the functional mode passes cold). Something about low voltage and cold together is the lead.
The low-voltage mode's constraints and netlist behave in at least one slow condition, so the fault is in what cold does at low voltage, not in the mode's constraints.