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
  • States and Protocols12
  • Transactions12
    • Read and Write-Permission Flows
    • Forwarding Versus Memory Sourcing
      • Who May Supply Data?
      • Dirty Intervention
      • Three-Hop Versus Four-Hop
      • When Memory Is Stale
    • Writeback, Eviction and Cleaning
  • 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

‹Forwarding Versus Memory Sourcing
  1. Topics
  2. Cache Coherency
  3. Transactions
  4. Forwarding Versus Memory Sourcing
  5. Who May Supply Data?

Part 3 · Transactions · All levels

Who May Supply Data?

Read the directory record and any pending work before choosing who answers a request.

On this page

    Which copy is allowed to answer?

    A copy containing bytes is only a candidate. Its value must be the newest one, and the requester must also receive the permission it needs. Revisit Who Has the Newest Data? for the difference between H's knowledge and an exclusive cache's silent stores.

    The rows below are independent settled snapshots, not a sequence. X started at 0; rows with 1 assume C0 has stored 1. No message is in flight.

    Case

    C0 state / value

    C1 state / value

    H directory

    Memory

    Newest data

    MSI, uncached

    I / -

    I / -

    U

    0

    memory: 0

    MSI, shared

    S / 0

    S / 0

    S{C0,C1}

    0

    C0, C1 and memory: 0

    MESI, E holder

    E / 0

    I / -

    exclusive(C0)

    0

    C0 and memory: 0

    MESI, M holder

    M / 1

    I / -

    exclusive(C0)

    0

    C0: 1

    MOESI, dirty shared

    O / 1

    S / 1

    O: C0, sharers {C1}

    0

    C0 and C1: 1

    Case

    Who answers a new GetS from another cache

    MSI, uncached

    Memory: no cache holds X

    MSI, shared

    Memory: S copies are clean in settled MSI

    MESI, E holder

    C0, through Fwd-GetS, even though memory happens to be current

    MESI, M holder

    C0, through Fwd-GetS: memory's 0 is stale

    MOESI, dirty shared

    C0, the O holder: memory's 0 is stale

    H first checks for pending work, then for an exclusive or dirty-responsible holder, and uses memory only when a U or clean S record justifies it.
    Choosing a source: pending work first, then exclusive or dirty holders, and memory only when the record shows it is current.

    Why the E row still forwards

    The E and M rows have identical directory records. H cannot tell them apart, because the E-to-M store is silent. So H must forward to the exclusive holder before granting a conflicting request, even when the line happens to be clean.

    In the O row, C1 also holds the newest bytes, but in this course H always asks the designated O holder, which is responsible for the dirty data. A read-only copy at C1 gives C1 no right to supply data for another cache's grant.

    A pending transaction can hold the newest value in H's buffer or in a Data in flight. That line is not U merely because both caches show I. The directory record, the data storage and the pending work together decide the source; no one of them alone is enough.

    Common pitfall

    Treating a memory response with no ECC error as proof that it is current. A correctly stored old value is still old.

    Interview

    Given a proposed source, name the state and history that make its value the newest, and the event that removes conflicting permissions. If that is missing, the grant must wait.

    Check yourself Can H answer from memory = 0 when exclusive(C0) happens to refer to E / 0?

    No. The reason is SWMR. If H answers C1 from memory and leaves C0 in E, C0 can still go E to M silently and write while C1 reads. So H must send Fwd-GetS and C0 must downgrade to S, even when the value is current. And H cannot tell E / 0 from M / 1 anyway.

    Related topics

    • Shared course model

    • Next: the forwarded read

    Previous

    30 / 167

    Next: Dirty Intervention

    Up next

    Up nextDirty Intervention

    Sign in to save progress

    Practice this lessonReport an error

    See also

    • Three-Hop Versus Four-Hop
    • When Memory Is Stale