An asynchronous input is any signal that can change at any moment relative to the clock that reads it. Examples:
- a push button or switch;
- a sensor or another chip with no shared clock;
- a signal from a part of the same chip running on a different clock (a clock domain crossing).
Within a synchronous design, timing analysis guarantees that every D input is stable during its flip-flop's setup and hold window. An asynchronous input breaks that guarantee: no analysis can say when it will change. Sooner or later it changes right inside the window, and the flip-flop that samples it may go metastable.
You can't prevent that, but you can contain it:
- Pass the input through a two flip flop synchronizer before any logic uses it.
- Synchronize it once, then fan out the synchronized copy.
Don't confuse this with an asynchronous control input such as an asynchronous clear. That's a flip-flop pin that acts without waiting for the clock. An asynchronous input is a signal not timed by your clock.