Asynchronous circuits are circuits that aren't driven by a central/external clock signal. Instead, they use signals for communication between stages (e.g. one stage informs the next stage that it has completed).
While many of the first circuits were asynchronous, the vast majority of complex circuits produced since the 1950s have been synchronous, as this facilitated circuit designing at the time. In 1990s and 2000s, there was a lot of active research about asynchronous circuits that claimed them advantageous over synchronous counterparts. However, the limiting factor here is that there aren't many tools currently that facilitate this kind of design.
Theoretically, the following advantages can be found in asynchronous circuits:
- Faster execution - Stages don't wait until the next clock tick once completed; the next stage is started almost as soon as the previous is finished.
- Minimised energy consumption - No energy is consumed for propagating the clock signal, because simply there is no clock signal. This also results in less heat produced, which is ever-useful in smaller CPU processes.
- Adjustability to different conditions - Synchronous circuits are assumed to work under some conditions that affect operation speed (e.g. temperature ranges, wire length, etc) and the clock is tuned for that. Changing the conditions would make the clock too slow or too fast for the circuit itself (in the first case wasting processing time and in the second case making the circuit outright unusable). Some types of asynchronous circuits can be fully adjusted to different conditions (or even different circuits, thus adding modularity) without any modification.
- No "clock-skew" problems - Clock signal can't be significantly delayed throughout the circuit's sub-circuits, because simply there is no clock signal.
However, there are also disadvantages concerning asynchronous circuits:
- Harder to handle metastability issues - Metastability issues are much more common/prevalent in (badly-designed) asynchronous circuits.
- Lack of tools and expertise - There aren't many widely-used tools for asynchronous circuits and most hardware design experts are specialised on synchronous circuits.
- Harder to test - There is no way to get the circuit state by stopping the clock, because simply there is no clock.
Usually, the communication between stages in asynchronous circuits consists of handshakes, i.e. Ack/Req signals.
There are two families of protocols used for communication in asynchronous circuits.
- Two-phase protocols - These signal on any transition from 0 to 1 or from 1 to 0.
- Four-phase protocols - These signal only after being reset, i.e. only on transitions from 0 to 1.
There are various encodings used in asynchronous circuits.
- Bundled-data encoding - It uses one wire per data bit. Circuits using it are also referred to as "micropipelines".
- Multi-rail encoding - It uses multiple wires.
- Dual-rail encoding - It uses two wires, as it represents three states (0b01 for 0, 0b10 for 1 and 0b00 for reset state - 0b11 is invalid).
- Four state encoding - It uses a data bit and a parity bit. This means there are two valid/stable states and two transition states.