Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • Reading Path
  • CDC/RDC Glossary
  • CDC/RDC Metrics Reference
  • CDC/RDC Interview Prep
  • CDC/RDC Signoff Cheatsheet
  • Clock Domains and Failure Modes8
  • Metastability and Synchronizers16
  • CDC Protocols and Handshakes16
    • Pulse Synchronizers
    • Handshake Protocols Across Domains
      • Four-Phase Req/Ack
      • Two-Phase Toggle
      • Valid/Ready Across Domains
      • Latency and Throughput
    • Async FIFO CDC
    • CDC Protocol Verification
  • Reconvergence and Gray Coding16
  • Reset Domain Crossing16
  • Architecture and Design Rules16
  • CDC Signoff Methodology24
  • RDC Signoff16
  • Debug and Case Studies11
  • CDC and RDC Interview Prep30
  • Capstone: Sign Off a Multi-clock Peripheral4
Loading lesson

‹Handshake Protocols Across Domains
  1. Topics
  2. CDC & RDC
  3. CDC Protocols and Handshakes
  4. Handshake Protocols Across Domains
  5. Four-Phase Req/Ack

Part 3 · CDC Protocols and Handshakes · All levels

Four-Phase Req/Ack

The return-to-zero protocol, why levels make it safe, and what each word costs in latency.

On this page

    Why it matters

    The four-phase handshake is the default recommendation for occasional multi-bit transfers across clocks: configuration writes, commands, status words. It is slow but easy to reason about, easy to verify, and every step is a level that a synchroniser can carry. Signoff reviewers treat it as the reference against which faster variants must justify themselves.

    The protocol

    1. Source puts the word on the data bus and raises req. The data stays stable from now on.

    2. Destination sees req through its synchroniser, captures the data, and raises ack.

    3. Source sees ack through its synchroniser and lowers req. Only now may the data change.

    4. Destination sees req low and lowers ack. Both sides are back where they started.

    Sequence diagram of a four-phase request and acknowledge handshake.
    The four phases. Every arrow between the two sides is a synchronised single bit; data is stable throughout.

    Why it is safe

    Only single-bit levels cross a synchroniser: req one way, ack the other. The data bus never touches a synchroniser, which is legal precisely because the protocol guarantees stability: data is driven before req rises and held until ack has been seen. Metastability can delay any single crossing by a cycle, but it cannot corrupt the word, because no sampling of data happens near a data change.

    Simulation: one word across

    The waveform below is simulation output for the wave source of this topic: one word carried source to destination and both sides returned to zero. One slot is one cycle of clk_s.

    How to read it: req rises in slot 4 while the data bus is already stable. req_sync rises in slot 7, after the destination edges in slots 5 and 7. ack rises together with the capture in slot 9, and out_valid stays high across slots 9 and 10: one full destination period. ack_sync is high in slot 10, one slot after ack, even though its two-flop synchroniser needed two source-clock edges. The timing explains it: the lanes are sampled 2 ns after each 10 ns source edge, ack changes at about 90 ns (just after the destination edge) and is first visible in slot 9, and the two synchroniser edges fall at 95 ns and 105 ns. The first of them lands inside slot 9's window, so the second flop's output, ack_sync, shows up one slot later, in slot 10. A change that happens just before a source edge can therefore appear on a two-flop path only one slot after the raw signal; it does not mean a single flop was enough. On the way down, req falls in slot 11, req_sync in slot 15, ack in slot 17 and ack_sync in slot 18, by the same timing.

    Cost in latency

    Each word pays two crossings in each direction: req there and back to zero, ack there and back to zero. With N destination cycles per synchroniser and M source cycles per synchroniser, one word costs about 2N destination cycles plus 2M source cycles (counted exactly in the latency lesson). That is the price of certainty, and the reason streams use FIFOs instead.

    Common mistakes

    Common pitfall

    Changing the data bus while req is high, for example by connecting it straight to a live register instead of a holding register. The destination captures whenever its synchronised req arrives, which is several cycles after req rose: by then the bus has moved on and the captured word is garbage.

    Interview

    Be ready to say when the source may change data (after it has seen ack high and lowered req) and what the destination captures on (the synchronised req, not the raw one).

    Check yourself The destination captures data on the cycle it sees req_sync high. Why is the data guaranteed stable at that moment?

    The source holds data from before req rises until after it sees ack, and the destination only raises ack after capturing. So the capture instant always falls inside the stability window, however many synchroniser cycles req took to arrive.

    Related topics

    • Two-phase toggle

    • RTL: CDC Protocols

    Previous

    35 / 179

    Next: Two-Phase Toggle

    Up next

    Up nextTwo-Phase Toggle

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Valid/Ready Across Domains
    • Latency and Throughput
    clk_sreqreq_syncackack_syncclk_dout_valid
    Simulation output: a four-phase handshake carrying one word from a 10 ns source domain to a 20 ns destination domain