SNUG San Jose 2001 Synthesis and Scripting Techniques for
Rev 1.2 Designing Multi-Asynchronous Clock Designs
5
Timing analysis on modules with two or more asynchronous clocks is error prone, more difficult and can be time
consuming. Static timing analysis on signals generated from one clock domain and latched into sequential elements
within a second, asynchronous clock domain is inaccurate and for the most part worthless. The timing information
for a signal latched by a clock that is asynchronous to the latched signal is inaccurate because the phase relationship
between the signal and the asynchronous clock is always changing; therefore, the static timing analysis tool would
have to check an infinite number of phase relationships between the signal and asynchronous clock. The fact is, one
must assume that signals that pass from one clock domain to another at some point will violate either setup or hold
times on the destination sequential element.
There is no good reason to perform timing analysis on signals that are generated in one clock domain and registered
in another asynchronous clock domain. It is a given that these signals DO violate setup and hold times on the
destination register. This is why synchronizers (see section 3.0) are needed, to alleviate the problems that can occur
when a signal is passed from one clock domain to another.
For RTL modules that have two or more asynchronous clocks as inputs, a designer will be required to indicate to the
static timing analysis tool which signal paths should be ignored. This is accomplished by "setting false paths" on
signals that cross from one clock domain to another. This can be a tedious and error prone job unless the guidelines
in the next two sections are followed.
5.0 Clock Naming Conventions
Guideline: Use a clock naming convention to identify the clock source of every signal in a design.
Reason: A naming convention helps all team members to identify the clock domain for every signal in a design and
also makes grouping of signals for timing analysis easier to do using regular expression "wild-carding" from within
a synthesis script.
A number of useful clock naming conventions have been used by various design teams. One that was used by
design engineers in 1995 while designing video ASICs for In Focus projectors required that a leading prefix
character be used to identify the various asynchronous clock domains. Examples included: uClk for the
microprocessor clock, vClk for the video clock and dClk for the display clock.
Each signal was synchronized to one of the clock domains in the design and each signal-name had to include a
prefix character identifying the clock domain for that signal. Any signal that was clocked by the uClk would have a
u-prefix in the signal name, such as uaddr, udata, uwrite, etc. Any signal that was clocked by the vClk would
similarly have a v-prefix in the signal name, such as vdata, vhsync, vframe, etc. The same signal naming convention
was used for all signals generated by any of the other clocks in the design.
Using this technique, any engineer on the ASIC design team could easily identify the clock-domain source of any
signal in the design and either use the signals directly or pass the signals through a synchronizer so that they could
be used within a new clock domain.
The naming convention alone contributed significantly to the productivity of the design team. How do we know
there was a productivity gain? One of the design engineers started his part of the ASIC design using his own naming
convention, ignoring the convention in use by the other design team members. After much confusion about the
signals entering and leaving his design partition, a team meeting was called and the non-compliant designer was
"strongly encouraged" to rename the signals in his part of the design to conform to the team naming convention.
After the signal names were changed, it became easier to interface to the partition in question. Fewer questions and
less confusions occurred after the change.