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
    • Async FIFO CDC
      • Gray Pointers in Signoff
      • Full and Empty
      • Depth Sizing
      • FIFO Reset and Tool Checks
    • 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

‹Async FIFO CDC
  1. Topics
  2. CDC & RDC
  3. CDC Protocols and Handshakes
  4. Async FIFO CDC
  5. Full and Empty

Part 3 · CDC Protocols and Handshakes · All levels

Full and Empty

Conservative flags derived from stale pointers, and why the staleness is safe.

On this page

    Why it matters

    Full is computed in the write domain from a synchronised (hence stale) read pointer, and empty in the read domain from a stale write pointer. A newcomer to signoff often reads this as a bug: decisions made from out-of-date information. It is in fact the central safety argument of the FIFO, because the staleness always points in the safe direction.

    Why conservative flags are safe

    The synchronised copy of a pointer always lags the true pointer, and pointers only advance. So the write side overestimates how full the FIFO is, and the read side underestimates it:

    Flag

    Computed from

    Staleness effect

    Direction of error

    Full (write side)

    Own write pointer minus stale read pointer

    Reads that happened recently are not yet visible

    Occupancy overestimated: full asserts early, never late

    Empty (read side)

    Stale write pointer minus own read pointer

    Writes that happened recently are not yet visible

    Occupancy underestimated: empty asserts early, never late

    Early full costs a little throughput (the writer waits while space already exists); early empty costs a little latency (the reader waits while data already exists). Neither corrupts data. A flag that could assert late would be a genuine bug: writes into a full FIFO overflow, reads from an empty one underflow.

    What the checks look for

    A structural review confirms that full is registered in the write domain from the next write pointer against the synchronised read pointer, and empty symmetrically; that the comparisons use the Gray-domain identities (equal for empty, top bits inverted for full); and that no flag is consumed combinationally in the far domain. Verification checks the safety direction directly: whenever true occupancy is within the margin of full or empty, the flag must already be set, as the coverage lesson exercises.

    Common mistakes

    Common pitfall

    Adding a second layer of correction on top of the conservative flags, for example treating almost-full as full in the writer or almost-empty as empty in the reader. Stopping early is the safe direction, so it costs throughput rather than correctness, but the layered margins need their own review and can hide the real depth requirement. Obey full and empty as hard limits.

    Check yourself The write side sees a read pointer that is three cycles stale. Does full assert too early, too late, or on time?

    Too early: up to three cycles of reads are invisible, so the FIFO looks fuller than it is. That is the safe direction; the symmetric argument protects empty.

    Related topics

    • Gray pointers in signoff

    • Depth sizing

    • RTL: Asynchronous FIFO

    Previous

    40 / 179

    Next: Depth Sizing

    Up next

    Up nextDepth Sizing

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • FIFO Reset and Tool Checks