Treat two clocks as unexpandable when the timing engine cannot find a common period within the first 1000 cycles. The engine then uses the worst setup relationship across those cycles. That result is not always the true worst case.
This typically occurs with odd fractional period ratios. For example,
consider two clocks, clk0 and clk1, generated by two MMCMs that share the same primary clock:
-
clk0has a 5.125 ns period. -
clk1has a 6.666 ns period.
Their rising clock edges do not realign within 1,000 cycles. Timing then uses a 0.01 ns setup requirement between the clocks. Even if both clocks share a known phase at the clock-tree root, their waveforms prevent safe timing between them.
As with asynchronous clocks, reports show slack, but you cannot trust the value. Treat unexpandable clocks like asynchronous clocks. Constrain them and design clock-domain crossings the same way.