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
  • Cache Coherency Glossary
  • The Shared Course Model
  • Cache Coherency Revision Sheet
  • Why Coherence Exists8
    • Caches and Shared Data
    • Permissions and Values
      • Permission Versus Data
      • Who Has the Newest Data?
      • Dirty Responsibility
      • Epochs and Serialization
  • States and Protocols12
  • Transactions12
  • Races and Controller Design8
  • Progress and the Fabric16
  • Ordering and Synchronization12
  • Performance and Scalability12
  • Real Protocols12
  • SoC Integration12
  • Power, Clocking and Reliability12
  • Verification12
  • Debug and Bring-up12
  • Interview and Design Review17
  • Capstone: A Coherent Model Lab5
Loading lesson

‹Permissions and Values
  1. Topics
  2. Cache Coherency
  3. Why Coherence Exists
  4. Permissions and Values
  5. Dirty Responsibility

Part 1 · Why Coherence Exists · All levels

Dirty Responsibility

Use an MOESI dirty read to separate responsibility for preserving a value from permission to modify it.

On this page

    Who must preserve a value that memory lacks?

    Suppose C0 has the only current value and another core wants to read. Must the newest data return to memory first? The answer depends on the protocol. Dirty responsibility names the obligation to preserve or transfer the authoritative version. It does not, by itself, grant the right to change that version. Prerequisite: distinguish E, M, S and O from the permission lesson.

    MOESI permits a dirty-responsible O copy alongside read-only S copies, with memory still stale. MSI and MESI have no stable O state: as the previous lesson showed, a remote dirty read must update memory before settling into S / S. See the Primer's discussion of dirty sharing and the Owned state. The following four-message route is one teaching choice coordinated by H, not a universal dirty-transfer ordering.

    C1 reads C0's dirty value: MOESI

    Assume the same history under MOESI, which also has E: C0 is M / 1, C1 is I / -, H records exclusive(C0), and memory = 0. H forwards the request to C0, accepts C0's value, then gives C1 read permission. C0 gives up write permission at step 2 and keeps dirty responsibility as O. H does not write memory. No local store occurs in this read transaction.

    C1 sends GetS to H, H forwards to C0, C0 supplies value 1 through H and becomes O, while C1 receives S and memory stays 0.
    An H-coordinated MOESI dirty read: C0 retains O responsibility and C1 receives S permission.

    Step

    C0 state / value

    C1 state / value

    H directory

    Memory

    Newest data

    0. Warm start

    M / 1

    I / -

    exclusive(C0)

    0

    C0: 1

    1. GetS at H

    M / 1

    IS^D / -

    exclusive(C0), pend GetS C1

    0

    C0: 1

    2. Fwd-GetS at C0

    O / 1

    IS^D / -

    exclusive(C0), pend GetS C1

    0

    C0: 1, Data(1) in flight to H

    3. Data at H

    O / 1

    IS^D / -

    O: C0, pend GetS C1

    0

    C0 and H buffer: 1, Data(1) in flight to C1

    4. Data at C1

    O / 1

    S / 1

    O: C0, pend GetS C1

    0

    C0 and C1: 1

    (assumed) grant delivered

    O / 1

    S / 1

    O: C0, sharers {C1}

    0

    C0 and C1: 1

    H's old exclusive record at step 2 is covered by a pending transaction, so it cannot be used to grant a conflicting request. At step 3 the payload sits in H's buffer, not in a third private cache, and H records O: C0 as soon as it arrives, because C0 stays responsible and memory will not be written. Compare the previous lesson: there H kept exclusive(C0) until it had written memory; here memory keeps 0. C1 joins the sharer list only in the '(assumed) grant delivered' row.

    What O requires, and what it forbids

    At the endpoint H records O: C0, sharers {C1}; C0 can read as well. Both cores may read 1, neither may write, and memory cannot supply a fresh read. C0 must not silently discard the dirty version: to evict, it sends PutM with the data and keeps the line until Put-Ack shows that H has written memory and taken responsibility. S does not mean 'memory current' in every protocol: here C1's S is backed by an O holder. O does not mean C0 is the only cache containing the newest bytes; it identifies the designated responsible holder.

    Stable remote-read endpoint

    C0

    C1

    Memory

    Writer

    MSI or MESI (previous lesson)

    S / 1

    S / 1

    1, updated before settling

    None

    MOESI trace above

    O / 1

    S / 1

    0, stale

    None

    Common pitfall

    Do not let the MOESI O holder store locally: keeping responsibility is not keeping exclusive permission. C0 must first send GetM and wait until H has invalidated C1 and granted M.

    Check yourself C1 has S / 1 after step 4. Why is that insufficient reason for C0 to discard O silently?

    The existence of another readable copy does not make C1 responsible for preserving the dirty version. H still identifies C0 as responsible, and memory is stale. C0 must complete an accepted transfer or writeback so the authoritative value remains reachable under the directory's rules.

    Interview

    Explain O using three facts: it can coexist with S, it carries dirty responsibility, and it cannot write. Then contrast the memory value at an MSI or MESI S / S endpoint. This exposes whether you understand the obligation behind the state letter.

    Related topics

    • Course Model

    • Who Has the Newest Data?

    Previous

    12 / 167

    Next: Epochs and Serialization

    Up next

    Up nextEpochs and Serialization

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Permission Versus Data