Professional Documents
Culture Documents
Set - Clock - Groups During Crosstalk Analysis Are The Following
Set - Clock - Groups During Crosstalk Analysis Are The Following
Set - Clock - Groups During Crosstalk Analysis Are The Following
PHYSICALLY_EXCLUSIVE:
Means Timing paths between these clock domains are false, but only one clock can exist in the design at
the same time. ETS/Tempus will filter out the SI interactions of nets/paths between these groups.
To phrase it differently, if the clocks are exclusive, then there should be no SI victim/aggressor
interaction at all between nets clocked by physically excluded clocks.
ASYNCHRONOUS
If two clocks are asynchronous, it means that they don't have any phase relationship among them at all.
So instead of using definite timing windows based on arrival times/skew etc, the tool will use infinite
timing windows when calculating aggressors and victims, therefore you will see maximum SI impact.
LOGICALLY_EXCLUSIVE
Logically exclusive means the timing paths between these clock domains are false, but both clocks can
exist in the design at the same time, so SI interactions between paths in these domains should still be
considered. However crosstalk analysis will be done with regular timing windows based on arrival
times/skew etc.
Question:
I have some clock logic that selects among a clock, its divide-by-2 version, and its divide-by-4
version:
The divide-by-2 and divide-by-4 clocks are generated using parallel state machines to avoid the
latency penalty and duty cycle variations of cascaded clock dividers. The MUX is statically
switched and does not switch between the clocks dynamically during device operation.
Answer:
Although the clock logic is simple, the correct clock specification might not be obvious. Let's
walk through the problem and explore how these clocks should be specified.
First, we create a primary clock at the input port. Then, we create two generated clocks at the
MUX output, one for each divider. We use the -master and -add options to allow multiple
generated clocks to be created on the same pin. We specify the -source pin for CLKdiv2_mux
as FFdiv2/CK, and the -source pin for CLKdiv4_mux as FFdiv4/CK. Finally, we mark all three
clocks as physically exclusive as only one clock at a time could be present at the output of the
MUX.
With these commands in place, let's generate the timing reports and analyze the results:
The most obvious issue here is that there are timing reports for the divided clock domains, but
there is no report for the parent clock domain CLK. This is due to the following behavior of
generated clocks:
When a generated clock is created at a pin, all other clocks arriving at that pin are blocked
unless they too have generated clock versions created at that pin.
In other words, clock CLK gets blocked at UMUX/Y unless we also create a generated clock
version of clock CLK at UMUX/Y (and adjust the set_clock_groups command accordingly):
create_clock -period 10 CLK
create_generated_clock -name CLK_mux -combinational UMUX/Y -source CLK -master
CLK -add
create_generated_clock -name CLKdiv2 -divide_by 2 UMUX/Y -source FFdiv2/CK
-master CLK -add
create_generated_clock -name CLKdiv4 -divide_by 4 UMUX/Y -source FFdiv4/CK
-master CLK -add
set_clock_groups -physically_exclusive -group {CLK_mux} -group {CLKdiv2}
-group {CLKdiv4}
In other words, although we have specified "-source FFdiv2/CK" for CLKdiv2_mux, it does
not force the source latency path to go through that pin. Instead, PrimeTime observes that the
non-inverted sense of CLK is present at pin FFdiv2/CK. Then, the tool searches for all possible
non-inverting paths back to source of clock CLK, which is the input port named CLK. Since
these are setup paths, the slowest non-inverting path back to input port CLK is the path through
FFdiv4, and the fastest non-inverting path is through the undivided path.
The best way to steer the source latency paths for generated clocks is to create the generated
clock directly at the point of the clock's transformation. In this case, the divided clocks should be
created at the Q pin of each divider flip-flop. This ensures that the generated clocks can only
look at source latency paths which can reach that divider's clock pin:
By creating each generated clock on different pins, the -master and -add options are no longer
necessary. Also, the undivided clock now simply propagates through the MUX to converge with
the divided clocks at the MUX output. This results in the following correct timing reports:
In an analysis where signal integrity (SI) effects are included, this is not necessarily true. What if
there was coupling between the outputs of the two dividers, as shown in Figure 2?
According to these constraints, CLKdiv2 and CLKdiv4 would never be simultaneously present
in the design, and PrimeTime SI should not compute any SI interactions (such as delta delays)
between these two clocks. While the two clocks cannot be simultaneously present downstream of
the MUX, they can interact with each other upstream of the MUX.
The correct way to specify the clocks in an SI analysis is to create generated clocks at:
any point where the clock waveform is transformed (such as at the divider outputs),
PLUS
any point where multiple clocks converge and become statically switched, such as at a
MUX output
Note: We create the MUXed generated clocks at the MUX inputs to avoid the complexity of
creating multiple clocks on the same MUX output pin.
Finally, we apply the physically exclusive relationship to the three MUXed generated clocks
only:
set_clock_groups -physically_exclusive \
-group {CLK_mux} \
-group {CLKdiv2_mux} \
-group {CLKdiv4_mux}
Note that no clock group relationships exist between the clocks upstream of the MUX (CLK,
CLKdiv2, and CLKdiv4) because no timing paths exist between these clocks. If there were
additional flip-flops that were clocked off these pre-MUX clocks, then any cross-clock paths
would likely be valid. If they are not valid for functional reasons, an additional logically
exclusive relationship would be needed between these pre-MUX clocks.
In this case, the divide-by-3 flip-flop could potentially divide one of three different clocks. To
correctly handle this case, a unique divide-by-3 clock must be created for each potential clock
reaching the divider:
create_generated_clock \
-name CLK_mux_div3 -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master CLK_mux
-add
create_generated_clock \
-name CLKdiv2_mux_div3 -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master
CLKdiv2_mux -add
create_generated_clock \
-name CLKdiv4_mux_div3 -divide_by 3 FFdiv3/Q -source FFdiv3/CK -master
CLKdiv4_mux -add