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 Paths
  • Concept Map
  • How to Read the Diagrams
  • Part 0: What Is a Protocol?10
  • Part 1: Timing and Clocking11
  • Part 2: Encoding and Framing12
  • Part 3: Handshakes13
  • Part 4: Flow Control17
  • Part 5: Transactions19
  • Part 6: Concurrency and Performance17
  • Part 7: Ordering13
  • Part 8: Sharing and Arbitration12
  • Part 9: Deadlock and Liveness13
  • Part 10: Reliability and Recovery20
    • Error Models
    • Parity
    • Hamming Distance
    • CRC
    • ECC and SECDED
    • Forward Error Correction
    • Error Responses
    • Poison and Containment
    • ACK and NAK
    • Sequence Numbers
    • Replay Buffers
    • Go-Back-N or Selective Repeat
    • Idempotency and Safe Replay
    • Link-Level or End-to-End Protection
    • Error Classes and Reporting
    • Recovery and Degradation
    • Interface Protection and Safety
    • The Reliability Budget
    • Protocols Compared: Reliability and Recovery
    • Drills: Reliability and Recovery
  • Part 11: Bring-Up and Link Management10
  • Part 12: Power8
  • Part 13: Shared State and Coherence9
  • Part 14: Security and Isolation7
  • Part 15: Specifying and Verifying11
  • Part 16: Protocols Dissected17
  • Part 17: Capstones5
  • Part 18: Interview Preparation6
Loading lesson

‹Part 10: Reliability and Recovery
  1. Topics
  2. First Principles of Hardware Protocols
  3. Part 10: Reliability and Recovery
  4. Poison and Containment

Part 10 · Reliability and Recovery · Senior (S)

Poison and Containment

When data is known to be bad but the transaction is otherwise fine, mark it as poisoned rather than dropping it. How poison travels with data, why it beats both dropping and crashing, and how containment keeps one error from spreading.

On this page

    Note

    Level: Senior (S) · Answers: What if bits go wrong?

    Before this: Error Responses, ECC and SECDED

    A memory controller reads a cache line and finds an uncorrectable ECC error in it. What should it do? If it drops the read, the requester waits for ever (lesson 5.2). If it raises a fatal error, the whole server crashes, perhaps for a line that belongs to a process that will never read it again. If it returns the data as normal, corrupted data flows silently into computation. There is a fourth option.

    What should a system do with data it knows is bad?

    The obvious answer, and why it breaks

    The obvious choices are all poor. Dropping the transaction breaks the one-response rule. Returning an error response stops this requester, but the data may be on its way somewhere else (a cache fill, a DMA transfer) where nobody checks the status. Crashing the system is safe but punishes everyone for one bad line that may never be used. What is needed is to let the transaction complete normally while making sure nobody can use the bad data without noticing.

    The idea: poison travels with the data

    Poison is a marker attached to the data itself: "this data is known to be bad". The transaction completes, the data moves on through caches, buffers and links, and the marker moves with it. Nothing fails until something actually consumes the data (a processor loads it into a register, a device acts on it). At that point the consumer raises an error, precisely, for that use.

    The bad line is not dropped and does not crash the system on sight; it is marked, and only the agent that actually uses it reports the error.

    Containment

    Poison is one part of containment: making sure an error affects as little as possible. The principles:

    • Mark, do not spread silently: corrupted data must never lose its marker (a bridge that strips poison turns a contained error into silent corruption).

    • Fail the user, not the system: the process that consumes bad data gets an error; others continue.

    • Stop writes of bad data reaching storage unmarked: a write carrying poison should keep it in memory (or be refused), so a later reader also sees the problem.

    • Escalate when containment is impossible: if poison cannot be carried (a protocol without a poison bit), the safe choice is an error response or a fatal error, not clean-looking data.

    How real protocols chose

    Protocol

    Poison

    PCI Express

    A poisoned TLP has its EP bit set; it is delivered to the receiver's application layer, which decides what to do; it is reported as a non-fatal error.

    Coherent interconnects and processors

    Poison bits on data in caches and fabrics, raising a precise error on consumption.

    Protocols without poison (simple buses)

    Must use an error response instead, and lose the data.

    What breaks

    A server design (illustrative) crashed the whole machine on every uncorrectable memory error. Most of those errors were in pages that were never read again, or belonged to one process. Adding poison let the memory controller mark the line, let the processor raise an error only when a process loaded it, and let the operating system end just that process. Machine-wide crashes from memory errors dropped to almost none.

    Why this matters

    Senior lens. Decide, for every place data can be found bad (ECC decoders, end-to-end checks, receivers), whether it can be poisoned, and trace the poison to every consumer: caches must store it, bridges must carry it, devices must reject it, processors must trap on it. Any hop that drops the marker converts a contained error into silent corruption; any protocol that cannot carry it needs a defined escalation instead.

    Interview

    Asked: "Why poison data instead of dropping the transaction?"

    Weak answer: To save time.

    Strong answer: Dropping breaks the rule that every request gets a response, so the requester hangs; an error response stops that requester but the data may already be heading into a cache or a DMA buffer where nobody checks status; crashing the system punishes everyone for data that may never be used. Poison lets the transaction complete but marks the data as bad, the marker travels with it, and only whoever actually consumes it raises an error, precisely. That contains the damage, as long as every hop carries the marker.

    Follow-ups: (1) What happens if a bridge strips the poison bit? (2) What should a write of poisoned data do?

    Check yourself A cache line arrives poisoned and is never read again. What happens?

    Nothing visible: it is eventually evicted or overwritten; no error is raised because nobody consumed it.

    Check yourself Why is stripping poison at a bridge worse than an error response?

    Stripping turns known-bad data into clean-looking data, which flows on silently; an error response at least tells the requester.

    Key takeaways

    • Poison marks known-bad data so the transaction completes but the data cannot be used unnoticed.

    • The error is raised only where the data is consumed, containing it to that user.

    • Every cache, bridge and link must carry the marker; where it cannot, escalate instead.

    Keep going

    Next: Lesson 10.9, ACK and NAK. Positive and negative acknowledgements, and what each one detects.

    Related topics

    • Part 10 overview: Reliability and Recovery

    Previous

    149 / 234

    Next: ACK and NAK

    Up next

    Up nextACK and NAK

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Error Models
    • Parity
    • Hamming Distance