Asynchronous Domain Crossings


Background

Moving data between different asynchronous clock domains is a common issue in chip design. Trying to keep clocks balanced across an entire chip is impractical for several reasons:

Asynchronous clock domain crossings (CDC) must be handled with proper design techniques because: In other words, if asynchronous clock domain crossings are not properly handled in design the result will be an unreliable design which is near impossible to debug.

Experience

I've dealt with this situation in several points in my career:

Discussion

There is a very good treatment of this topic at: SNUG-2008 Paper.
So how would I handle asynchronous domain crossings? If I need to get data from clock domain A to clock domain B, I would look at: Obviously there are much more complicated cases that could arise. The primary thing to remember is that if you violate the setup and hold of a flop you are risking that the data will not settle at the input by the next cycle.