AdvancedQuestion 31 of 63Source: Synopsys PrimeTime User Guide: Specifying Clock Characteristics

Why does interclock uncertainty override simple clock uncertainty when both apply to the same path?

From PDVerse STA Mentor Guide · pdVerse Mentor Guide

Short Answer

Simple clock uncertainty describes the skew of one clock against its own ideal edges; interclock uncertainty describes the skew specifically between two named clock domains, and it is the more specific description of the two. When a path qualifies for both because its launch and capture clocks are different, PrimeTime uses the interclock value and ignores the simple one, on the assumption that a value written specifically for that pair of clocks is more accurate than a general per-clock value.

Technical Reference DiagramWhy does interclock uncertainty override simple clock uncertainty when both apply to the same path?
Two clocks CLKA and CLKB with a simple set_clock_uncertainty of 5 shown on CLKA's own ideal-edge waveform, and a separate interclock uncertainty arrow of 2 drawn specifically from CLKB to CLKA, with a report_timing box showing the path uses 2, not 5, as the required-time margin

Technical Explanation

  • Simple uncertainty applies per clock, with no notion of which other clock a path is crossing to. set_clock_uncertainty 5 [get_clocks CLKA] (SDC) sets a single skew value for every path whose capturing register is clocked by CLKA, regardless of which clock launched the data.
  • Interclock uncertainty is written specifically for a pair of clock domains. set_clock_uncertainty 2 -from [get_clocks CLKB] -to [get_clocks CLKA] (SDC) applies only to paths that launch from CLKB and capture on CLKA, a narrower and more specific statement than the simple form.
  • When both could apply to the same path, PrimeTime picks the interclock value. A path from CLKB to CLKA in the example above uses the interclock uncertainty of 2, not the simple uncertainty of 5 that CLKA also carries, because the interclock command targets that exact crossing.
  • Interclock uncertainty has to be set for both directions of a crossing if both exist. A value defined -from CLKA -to CLKB does not also cover paths -from CLKB -to CLKA; each direction needs its own command even when the number is the same in both directions.
  • This precedence exists because a general, per-clock number cannot know about the specific relationship between two domains. Two clocks with independent PLLs might have far more relative skew between them than either has against its own ideal edges, and only an interclock value written for that specific pair captures it.
  • The interaction still needs to be checked deliberately. Because the override is silent - there is no warning that the simple value was set aside - it is worth confirming with a report before assuming a per-clock uncertainty is actually in effect on a cross-domain path.

Common Mistake

  • Setting a single per-clock set_clock_uncertainty value and assuming it covers every path that ends on that clock, including paths launched from a different clock domain.
  • If an interclock uncertainty command also exists for that specific crossing, it silently wins - the simple value is not merged with it or averaged against it, it is simply set aside for that one path.
  • Cost: a designer reviews the simple uncertainty value, believes it is the margin in effect on a cross-domain path, and never notices the real, different number that the interclock command is actually applying there.

Follow-up Question & Model Response

If a chip has three clock domains and every pair of them can exchange data, how many set_clock_uncertainty commands does full interclock coverage actually require, and why is a single simple value on each clock not a shortcut for this?

Candidate Model Response: With three clocks and every direction of crossing possible, full interclock coverage needs six commands - one for each ordered pair, since -from CLKA -to CLKB and -from CLKB -to CLKA are independent statements even if the numeric value ends up the same for both. A simple value on each of the three clocks is not a shortcut for this, because it describes only that clock's own skew, not the skew of any specific crossing; if the real hardware has a larger relative skew between two particular clocks than either has against its own ideal edges, only the interclock value for that pair will catch it, and the simple values will simply be overridden wherever an interclock statement exists.

Practical Example

A design sets set_clock_uncertainty 5 [get_clocks CLKA] (SDC) as a general margin for every path capturing on CLKA. It separately sets set_clock_uncertainty 2 -from [get_clocks CLKB] -to [get_clocks CLKA] (SDC) for the specific CLKB-to-CLKA crossing, based on a tighter, measured skew budget between those two clock trees. A report_timing -from [get_clocks CLKB] -to [get_clocks CLKA] (PT) run on any path along that crossing shows a clock uncertainty of 2 in the required-time calculation, not 5 - confirming the interclock value is the one actually driving the setup margin, even though the simple value of 5 is still technically set on CLKA.

Complete STA Handbook

Get the complete 10-chapter STA handbook covering setup/hold margins, clock modeling, OCV/POCV, crosstalk noise, and PrimeTime closure.

Static Timing Analysis (STA) Handbook — ten chaptersSTA HandbookTen chapters on setup, hold, OCV, and PrimeTime signoff. →