Read this exception report line and tell me what happened: From { A B C }, To D, Setup 2, Hold *, Ignored f,o.
From PDVerse STA Mentor Guide, part of the pdVerse Mentor Guide
Short Answer
A set_multicycle_path 2 -from {A B C} -to D (SDC) was only partly applied. The f code means one startpoint, C, was invalid and got dropped; the o code means another path, A-to-D, was overridden by a higher-priority exception. Only B-to-D actually carries the multicycle value of 2.
Technical Explanation
The report line reads { A B C }, D, 2, , f,o โ startpoints A, B, and C into endpoint D, a setup value of 2, no hold value (shown as ), and an Ignored column carrying two letter codes. That combination, read from report_exceptions (PT), tells you set_multicycle_path 2 -from {A B C} -to D (SDC) was accepted syntactically but only partly took effect.
- The
fcode: at least one named startpoint is invalid for this kind of exception โ here, C โ so the C-to-D path is dropped from the exception entirely, not applied at all. - The
ocode: at least one path was overridden by a higher-priority exception โ here, A-to-D, which some other command already covers, for instance a false path, and a false path outranks a multicycle path in the tool's exception precedence order. - What's actually left: only B-to-D, which is the sole path enforced with the multicycle value of 2.
- The reading skill this tests: a command being accepted without a syntax error doesn't mean the whole thing took effect โ of the three startpoints written, one was never valid, one is excused by something stronger, and only one behaves as intended.
- Why the Ignored column matters most: every field in the line is informative, but the Ignored column is the one that tells you the command's real, as-applied scope rather than its as-written scope.
Common Mistake
The Trap: treating a syntactically clean set_multicycle_path as fully applied to every startpoint and endpoint named in the command.
- A designer writes the three-startpoint exception, sees no error at load time, and moves on assuming all three paths now carry the multicycle relaxation.
- Signoff timing later shows A-to-D and C-to-D still checked as single-cycle paths, which looks like a tool inconsistency until
report_exceptionsreveals thefandocodes were there all along, unread.
Follow-up Question & Model Response
If you wanted the A-to-D path to actually get the multicycle relaxation despite the existing false path, what would you need to change?
Candidate Model Response: You'd need to remove or narrow the false path that currently covers A-to-D, since a multicycle path can't outrank a false path in the precedence order regardless of how it's written. If A-to-D genuinely shouldn't be a false path anymore, for example because a design change made it a real, timed path again, the fix is to update the false-path exception's scope so it no longer includes A-to-D, then let the multicycle command take effect on that path. Simply repeating or reordering the multicycle command won't change the precedence outcome.
Practical Example
A block has set_false_path -from A -to D (SDC) written earlier in the SDC, followed later by set_multicycle_path 2 -from {A B C} -to D (SDC) where C is a clock-domain pin invalid as a multicycle startpoint. Running report_exceptions -ignored (PT) produces the line { A B C } D 2 * f,o, confirming C was dropped for being an invalid startpoint and A was overridden by the pre-existing false path, leaving only B-to-D with the multicycle value of 2 actually enforced in the signoff run.
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