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
  • Races and Controller Design8
  • Progress and the Fabric16
    • Virtual Networks and Progress
    • Filtering and Snoop Pruning
    • Latency, Fairness and QoS
    • Hierarchical and Chiplet Coherence
      • Two-Level Directories
      • Clusters and Global Homes
      • Coherence Across Dies
      • Hierarchy Trade-Offs
  • 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

‹Hierarchical and Chiplet Coherence
  1. Topics
  2. Cache Coherency
  3. Progress and the Fabric
  4. Hierarchical and Chiplet Coherence
  5. Clusters and Global Homes

Part 5 · Progress and the Fabric · All levels

Clusters and Global Homes

Follow a dirty cross-cluster transfer without moving the line's serialization point or losing its value.

Who orders X when requests cross cluster boundaries?

Use MSI with the clusters of the previous lesson, K0 = {C0, C2} and K1 = {C1}. C2 stays I / - throughout and is left out of the table. H is the global serialization point between clusters. While K0 holds global exclusive(K0), H0 serializes requests from K0's own cores without contacting H. A request from outside K0 always goes to H, which recalls the permission through H0. H queues other requests for X until this transfer's grant has been delivered.

Warm-up from X = 0: C0 acquired M and stored 1, C1 is I / -, memory = 0, and the directory reads G: exclusive(K0) | H0: exclusive(C0) | H1: U. C1 now writes X. Each node keeps the data until the next node has received it. The rows marked (assumed) use the course model's grant-delivery assumption instead of an extra completion message.

C1 requests through H1 and H, which forwards through H0 to C0. The newest value 1 travels back through H0, H and H1 to C1.
Eight message legs through the local proxies. H remains the global serialization point for X.

Step

C0 state/value

C1 state/value

Directory (G | H0 | H1)

memory value

Newest data

0 warm-up

M / 1

I / -

G: exclusive(K0) | H0: exclusive(C0) | H1: U

0

C0: 1

1 GetM at H1

M / 1

IM^D / -

G: exclusive(K0) | H0: exclusive(C0) | H1: U, pend GetM C1

0

C0: 1

2 GetM at H

M / 1

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: exclusive(C0) | H1: U, pend GetM C1

0

C0: 1

3 Fwd-GetM at H0

M / 1

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: exclusive(C0), pend GetM K1 | H1: U, pend GetM C1

0

C0: 1

4 Fwd-GetM at C0

I / -

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: exclusive(C0), pend GetM K1 | H1: U, pend GetM C1

0

Data(1) in flight to H0

5 Data at H0

I / -

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: exclusive(C0), pend GetM K1 | H1: U, pend GetM C1

0

Data(1) in flight to H

6 Data at H

I / -

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: exclusive(C0), pend GetM K1 | H1: U, pend GetM C1

0

Data(1) in flight to H1

(assumed) Data delivered to H, H0 retires its entry

I / -

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: U | H1: U, pend GetM C1

0

Data(1) in flight to H1

7 Data at H1

I / -

IM^D / -

G: exclusive(K0), pend GetM K1 | H0: U | H1: U, pend GetM C1

0

Data(1) in flight to C1

8 Data at C1

I / -

M / 1

G: exclusive(K0), pend GetM K1 | H0: U | H1: U, pend GetM C1

0

C1: 1

(assumed) grant delivered

I / -

M / 1

G: exclusive(K1) | H0: U | H1: exclusive(C1)

0

C1: 1

As in the four-hop route of Three-Hop Versus Four-Hop, H keeps exclusive(K0) with its pending entry until it learns the grant was delivered; only then does it record exclusive(K1). The value 1 is always in exactly one place, even while neither private cache has a usable copy. Memory stays stale at 0, which is legal: C1 is now the dirty holder. H0 applies the same rule to its own record: it keeps exclusive(C0) with its pending entry after step 5, although C0 is already I, and records U only when it learns that H received the Data. Likewise H1 keeps its pending entry until C1 has its grant.

C0 loses permission before C1 receives it, and C1 waits in IM^D. Other requests for X, from any cluster, wait behind H's pending entry. Completion assumes reserved buffer space for responses along this path, eventual reliable delivery and fair service, as stated in Stating Progress Assumptions. Adding levels does not prove those conditions automatically.

Common pitfall

Letting H0 grant a request that came from outside K0, or letting H0 and H1 each order requests for X on their own. A local proxy serializes only its own cores' requests, and only while its cluster holds the global permission those requests need.

Interview

Locate the newest data after every leg. Explain why H still controls conflicting requests while the grant is on its way through H1.

Check yourself After step 7, may H serve a conflicting GetS from memory = 0?

No. The transfer is not complete and memory is stale. H keeps the pending entry until it learns of delivery, and then knows K1 holds the newest value.

Related topics

  • Shared course model

  • Source and route are separate decisions

  • Data readiness and pending responsibility

Previous

59 / 167

Next: Coherence Across Dies

Up next

Up nextCoherence Across Dies

Sign in to save progress

Practice this lessonReport an error

See also

  • Hierarchy Trade-Offs