# Memory Ordering > **Status:** Research proposal for the XH-1 128-core RISC-V processor. > Nothing in this document is a finalized architectural commitment unless > explicitly stated. Items marked **[Proposed]** are engineering > recommendations under evaluation; items marked **[Open]** are unresolved > design questions. --- ## 1. Scope and Definitions **Memory ordering** defines the set of rules that determine when memory operations issued by one or more hardware threads become visible to other hardware threads, and in what order such visibility is required to occur. In a single-core, single-threaded system, "ordering" is trivial: program order matches execution order matches visibility order. As soon as a processor exposes: - out-of-order execution, - multiple hardware threads (SMT), - multiple cores with private caches, - coherent or non-coherent interconnects, or - devices that perform DMA, …memory ordering becomes a first-class architectural and microarchitectural concern. For a 128-core design like XH-1, it is one of the dominant correctness and performance constraints. The RISC-V ISA delegates most ordering policy to a **Memory Consistency Model (MCM)** specification rather than baking it into the base ISA. The current published MCM is documented in the RISC-V specification volume *“RISC-V Instruction Set Manual, Volume I: Unprivileged ISA”*, Appendix A — *"RVWMO: The RISC-V Weak Memory Ordering Model"*. RVWMO is the canonical model; "Zam" (the "A" extension candidate) is a candidate formalization of the same weak-ordering contract with additional operational clarifications. This document covers: 1. The RVWMO contract XH-1 must honor. 2. Microarchitectural mechanisms needed to enforce that contract. 3. Scalability concerns specific to 128 cores. 4. Interactions with coherence, the interconnect, the pipeline, the OS, and verification. --- ## 2. The RVWMO Contract XH-1 Must Honor RVWMO is defined by: - **Preserved Program Order (PPO):** a set of (microarchitectural) orderings between pairs of memory operations from the same hart that the implementation must never violate. PPO rules include the obvious ones (a load following a store to the same address, register dependencies, fences such as `FENCE`, `FENCE.I`, etc.) and the subtler "axiomatic" PPO rules covering acquire/release semantics on ordinary AMOs. - **Memory Model Axioms:** a set of forbidden load–load, load–store, and store–store reorderings when no PPO rule requires otherwise (e.g., "no load may be reordered with a store to a different location" except under specific conditions). - **Syntactic Dependencies:** register dependencies via the destination register of a load are sufficient to constrain certain reorderings, mirroring the original SPARC RMO/TSO literature. The base RVWMO does not mandate TSO; an implementation may run hart-local memory accesses in any order consistent with the PPO rules, with a few mandated orderings (e.g., loads after stores to the *same* address are preserved). Key architectural levers available to software: | Construct | Effect (informal) | | -------------------------- | ------------------------------------------------------- | | `FENCE` (various `pred`/`succ`/fm) | Orders memory operations as specified. | | `FENCE.I` | Orders stores to instruction memory w.r.t. subsequent instruction fetches on the same hart. | | `FENCE.VMA` | Orders SFENCE.VMA-style TLB management. | | `SFENCE.VMA` | Orders stores w.r.t. subsequent TLB refills on the same hart. | | Acquire/release on AMOs | Provides PPO ordering for paired RMW operations. | | `LR`/`SC` (LR/SC pair) | Ordering anchored to the reservation. | | `Zalrsc` / `Zaamo` | Standard atomic extensions. | | `Zifencei` | Required for `FENCE.I`. | | `Zihintpause` | Hint only; no ordering effect. | | RV32/64 `fence` on devices | Device ordering via PTE bits (see §10.3). | **XH-1 requirement:** the ISA-visible contract of every memory and synchronization instruction listed in the *Unprivileged ISA* and any extension XH-1 implements (`A`, `Zifencei`, `Zihintpause`, `Zalrsc`, `Zaamo`, `Ztso` if adopted) must be honored by the combined core/LSU/coherence/interconnect subsystem. > **Open:** Whether XH-1 advertises `Ztso` (an optional RVWMO relaxation > that grants TSO at every hart) or only RVWMO. `Ztso` simplifies > software reasoning but slightly constrains hardware ordering > flexibility. Recommendation deferred until microarchitecture is > fixed. --- ## 3. Required Fences and Their Microarchitectural Meaning The `FENCE` instruction is parameterized by: - `pred`: which predecessor operations are ordered (R, W). - `succ`: which successor operations are ordered (R, W). - `fm` field: indicates "fence-mode"; value `0` is the standard fence, value `>=1` is reserved for implementations and is treated as a no-op by standard tools. Custom XH-1 fence-mode encodings are **[Open]**. XH-1 must ensure that a `FENCE` with predecessor set *P* and successor set *S*: - All memory operations of type *P* issued by this hart prior to the `FENCE` are ordered before all memory operations of type *S* issued by this hart after the `FENCE`, in the global memory order, to the extent that the coherence protocol is willing to serialize them. Microarchitecturally, the `FENCE` typically drains in-flight operations of the predecessor classes through the load/store unit (LSU), the coherence point, and the write-completion path. On XH-1 with private L1 and a shared L2 slice, "the coherence point" is the directory controller on the L2 slice; see §7. --- ## 4. Why 128 Cores Changes the Problem A small-count many-core can often "get away" with conservative ordering: a single shared bus or ring, broadcast snoops, and a full-fence on every store buffer drain. At 128 cores these approaches do not scale: 1. **Bandwidth:** A serialized global fence requires all in-flight traffic from the issuing core to drain, *and* the directory to observe all acknowledgments before subsequent operations are injected. With 128 cores contending for the directory and the interconnect, the latency of a single `FENCE` can grow from ~10–30 cycles (small system) to several hundred cycles. This directly impacts lock-based critical sections, RCU grace periods, and `atomic` operations in the OS. 2. **Queue occupancy:** Every core holds per-message-class queues (read requests, write requests, invalidations, data responses, writeback data). A fence must account for occupancy of queues between the core and the L2 directory *and* between directories across the mesh. Without back-pressure, an XH-1 fence could complete locally but leave a "hole" in the global order. 3. **Coherence protocol overhead:** Directory-based coherence (assumed for XH-1; see the coherence research document) replaces broadcast snoop traffic with per-line directory lookups, but introduces ack/grant ordering dependencies that the fence must not skip past. 4. **Scalable coherence introduces non-atomic transitions.** Directory state moves from M→I→S→M through intermediate invalidation acknowledgment states. A store-conditional (`SC`) on one core that has been racing with a remote `LR` may observe the line in intermediate states; the memory model must be specified for these. 5. **Contention of fence-induced drains:** When 128 cores all execute `FENCE` in a short window (e.g., a barrier in a parallel workload), the interconnect can become congested with drain acknowledgments. The microarchitecture must avoid feedback-loop deadlock between the queues and the fence-acknowledgment path. > **Proposed XH-1 stance:** Treat memory ordering as a system-level > performance constraint, not just a per-core correctness one. Evaluate > the cost of every `FENCE` site in the OS, runtime, and synchronization > libraries at the system level, not at single-core simulation. --- ## 5. Microarchitectural Mechanisms The classic toolkit, applied to XH-1: ### 5.1 Load-Store Unit (LSU) Pipeline A typical in-order XH-1 core will have: - A **store buffer (STB)** between the integer pipeline and the L1 data cache. - A **load queue (LDQ)** that issues loads past stores (speculatively) and validates the result at commit, rolling back on a misspeculation. - A **memory dependence predictor** (optional; see §9.1) to reduce the cost of Ld→St forwarding checks. The LSU's job relative to ordering is twofold: 1. **Honor PPO locally** — enforce that a load following a store to the same address returns the store's value (or a younger value), and that the AMO-acquire/release rules produce the required PPO edges. 2. **Provide a clean drain point** for `FENCE` — a place where the LSU can mark "all pred-class operations up to this point have completed globally." ### 5.2 Store Buffer Drain A `FENCE` with `pred` including W must drain the store buffer. In a directory-coherent system the relevant completion is not "store reached L1" but "store has acquired the directory ownership token (e.g., `M` response) and the directory has acknowledged writeback/Invalidate acknowledgments for any invalidated peers." For XH-1: - **L1 hit, no coherence traffic:** store can complete in ~1–3 cycles after reaching L1. - **L1 miss, L2 hit, no sharers:** invalidation may be skipped (silent upgrade to M); store completes when directory grants M. - **L1 miss, L2 hit, sharers exist:** directory generates invalidation messages to all sharers; the store completes when all invalidation acknowledgments are received. - **L1 miss, L2 miss:** directory forwards to home node; home node replies with data and grants M; the store completes when data and the M grant are both received. Only the last three cases impose significant drain latency. > **Proposed XH-1 stance:** The store buffer must be sized to hold > stores pending completion, but the fence-drain path must not depend > on the store buffer draining in order — older stores in the buffer > that have already received their M response should not block the > fence on younger stores still in flight, *unless* the fence > successor set requires it. ### 5.3 Load Issue Rules Loads are the harder side. RVWMO allows loads to be reordered with prior stores to different addresses. XH-1's LSU will speculatively issue loads past older stores; the load is "validated" at commit by checking that the cache line has not been invalidated and that no older store wrote to the same address. A load that needs to "see" the result of an older store on the same hart uses **store-to-load forwarding** through the store buffer; this must respect the size and sign-extension rules of the load. A load that needs to "see" the result of an older store on a *different* hart (which is what `FENCE`/`FENCE.RW` enforces) must wait for that remote store to complete at the directory and update the local view via the coherence protocol. The directory's response is the "happens-before" edge. ### 5.4 Acquire/Release on AMOs A standard `AMO*` operation in RVWMO has the ordering semantics of an acquire (load part) and release (store part) when used in `aq`/`rl` positions. In RV32A/RV64A, the instructions `LR` and `SC` carry acquire/release bits; AMOs (e.g., `AMOSWAP.W`, `AMOADD.D`) also carry these bits. For XH-1, an `aq` AMO must order prior loads/stores from the issuing hart before the AMO, and the AMO before subsequent loads/stores. Microarchitecturally: - `aq`: drain the load and store queues (or at least establish PPO edges) before issuing the AMO to the directory. - `rl`: drain the load and store queues *after* the AMO completes. - `aq+rl`: drain on both sides; this is the strong fence. > **Open:** Whether XH-1 implements `aq`/`rl` purely in the LSU > (with no global fence message) or with a lightweight fence message > to the directory. Purely-local enforcement is faster but requires > that the directory serialize the AMO at the line state machine. ### 5.5 `LR`/`SC` `LR` loads with reservation; `SC` stores conditionally if the reservation is still valid. XH-1's reservation representation is proposed as a small set of reservation-set entries per core, indexed by physical address, anchored in the L1. Coherence actions that invalidate the reserved line (a snoop/Invalidate that the L1 sees) must invalidate the reservation. > **Proposed XH-1 reservation-granularity choice:** XH-1 reserves at > cache-line granularity (the natural L1 line size) and treats > forward-progress as the OS's responsibility. This is the > conservative default; some designs use sub-line reservation to > improve SC success rates, but the gain on typical lock code is > modest. ### 5.6 `FENCE.I` and Self-Modifying Code `FENCE.I` ensures that stores from the issuing hart that preceded the `FENCE.I` are visible to subsequent instruction fetches on the same hart. It does **not** order stores from other harts. For XH-1, `FENCE.I` typically: 1. Drains the store buffer (in the W sense). 2. Invalidates the L1 I-cache (or the local portion of a unified L1). 3. Optionally issues a `FENCE` internally so that the store is visible at the directory before the I-fetch resumes. A cross-hart self-modifying-code sequence (hart A writes code, hart B executes it) requires an explicit `FENCE` on hart A and a `FENCE.I` on hart B (per the RISC-V recommendation), plus coherence to propagate the new data. This is awkward and XH-1 will document it in the programmer's manual. ### 5.7 `SFENCE.VMA` `SFENCE.VMA` orders prior stores to PTEs before subsequent address-translation results on the same hart. XH-1's TLB refill engine must observe the store-completion signal; a typical implementation stalls the pipeline at the `SFENCE.VMA` until the store buffer drains. --- ## 6. System-Level Ordering Devices Beyond per-hart mechanisms, XH-1 needs system-level ordering for I/O and devices. The RISC-V privileged specification provides two mechanisms: ### 6.1 I/O Ordering Bits in PTE A PTE can have the **PBMT** field (Page-Based Memory Types), which can be marked as: - **Non-cacheable, idempotent, weakly-ordered (NC, IO).** - **Non-cacheable, idempotent, strongly-ordered (NC, I/O-strong).** XH-1 must honor these by: - Routing accesses to the appropriate device port on the interconnect. - For weakly-ordered I/O, treating the access as device but allowing reordering with respect to other weakly-ordered I/O of the same type. - For strongly-ordered I/O, treating the access as a full-fence — the load or store completes in program order with respect to all other accesses from the same hart. ### 6.2 Memory-Mapped I/O Fences XH-1 will provide a `FENCE` variant (the standard `FENCE pred=rw, succ=rw, fm=0`) that software uses to order I/O accesses. The microarchitecture must ensure the drain endpoint includes the device-port queue, not just the L1/L2. ### 6.3 Interrupt Acknowledgment and Ordering RISC-V interrupt acknowledgment is itself a memory-mapped I/O write. The microarchitecture must guarantee that the write to the *Platform-Level Interrupt Controller* (PLIC) is ordered with respect to the I/O operations it is acknowledging. The standard idiom is a `FENCE` before the claim/complete operation. XH-1's PLIC integration must be designed so that the `FENCE` does not require extra microarchitectural support beyond the standard fence. > **Open:** Whether XH-1 implements a **"fence fast path"** for > accesses to specific device memory regions (e.g., the PLIC) that > bypasses the directory and uses a dedicated sideband signal. > Such optimizations can reduce interrupt latency by tens of cycles > but complicate coherence reasoning. Not recommended for the first > silicon. --- ## 7. Coherence Interaction XH-1's coherence protocol (described in the coherence research document) is directory-based, MSI or MESI, with a distributed directory across the L2 slices. Memory ordering depends on the coherence protocol's notion of "completion." For a store to be considered "globally performed": - The line is held in **Modified** state by the requesting core. - All prior sharers have sent Invalidate Acknowledgments to the directory (or the directory has confirmed there were no sharers). - The directory has logged the new owner. For a load to be considered "globally performed": - The line is held in **Shared** (or **Modified** if exclusive) by the requesting core. - The data response from the directory (or forwarded from a peer) is the value the directory currently authorizes. > **Important subtlety:** A `FENCE W,W` between two stores on the > same hart must ensure that store 1 has acquired its M grant *and* > the directory has processed the invalidations *before* store 2 > acquires its M grant. In directory terms, store 2 cannot be issued > until store 1's M grant has been observed at the directory. XH-1 > must implement this as an ordering dependency at the directory's > L2 controller, not as a per-line serialization at the directory > (which would be too coarse and too slow). ### 7.1 Coherence-Induced Ordering Pitfalls Common pitfalls in directory-based designs: - **Directory ack starvation under fence pressure:** when many cores fence simultaneously, the directory must serialize invalidation acknowledgments without deadlock. - **Coherence downgrade during fence:** a core that downgrades M→S while a fence is in progress must not let younger loads proceed past the fence. - **Silent upgrade (no-invalidate transition) on store:** a clean line upgraded to M without invalidation must still be ordered with respect to other cores' loads that observed the line in S. The directory must explicitly synchronize this transition. ### 7.2 Ordering at the Interconnect XH-1's interconnect is a mesh (proposed; see interconnect research document). The mesh delivers messages in-order *between a given pair of routers*, but globally the order is not guaranteed. The directory controller is the serialization point. For ordering, XH-1's mesh must: - Not reorder different message classes on the same virtual channel. - Support a "tail" or "credit" signal so that a fence-acknowledgment message can be generated only when all prior messages on the same path have been delivered. --- ## 8. Implementation Approaches Compared This section lists the realistic implementation strategies for an in-order XH-1 core. The choice of in-order vs. out-of-order pipeline is discussed in §9.1; here we focus on ordering-specific mechanisms. ### 8.1 Approach A: Conservative Per-Core Fence (Baseline) - The LSU drains the relevant queue classes fully on every `FENCE`. - The store buffer's "drain complete" is defined as "every store has received its directory M grant." - A `FENCE` is implemented as a special instruction that stalls the pipeline until drain completes. - Acquire/release AMOs are implemented as full `FENCE`s around the AMO at the LSU. - `SFENCE.VMA` stalls the pipeline until the store buffer drains. **Pros:** - Simple to verify. The fence semantics maps directly to "queue empty." - Predictable performance for small core counts. - Easy to reason about coherence interactions. **Cons:** - Poor scalability. At 128 cores, the worst-case `FENCE` latency grows because the drain point is global, not local. - Overly conservative for `aq`/`rl` AMOs, which do not require a full global drain on either side — only ordering relative to surrounding ordinary accesses. ### 8.2 Approach B: Token-Based Completion - The LSU attaches a monotonically increasing **completion token** to each outstanding operation. - A `FENCE` with pred P, succ S becomes: "wait until all operations of type P issued before this `FENCE` have produced a token greater than or equal to the fence's token." - The token is generated when the directory acknowledges the operation; this is exactly the "global completion" notion. - Acquire/Release is implemented as a fence of the appropriate type around the AMO at the LSU. **Pros:** - Fences do not require the entire store buffer to drain; an empty store buffer is sufficient, but so is a store buffer where all older stores have completed. - Naturally parallel: many stores can be outstanding, and the fence only waits for the *oldest* of them. - Slightly more complex but a well-understood technique (used in academic and commercial cores). **Cons:** - Per-message token bookkeeping is more expensive than a simple "queue empty" check. - Verification requires modeling tokens at the testbench, which is a non-trivial simulation infrastructure investment. ### 8.3 Approach C: Directory-Assisted Ordering - A special "fence-ack" message class is added to the coherence protocol. - A `FENCE` instruction sends a fence-ack request to the directory; the directory replies only after all prior messages from the issuing core have been serialized. - The directory tracks per-core "last-seen" sequence numbers to arbitrate fence-ack requests against ongoing traffic. **Pros:** - The directory is the natural serialization point; leveraging it avoids per-core reinvention of global ordering. - Scales well to large core counts because the directory already handles 128-core traffic. - Allows the per-core LSU to continue issuing younger operations while the fence is in progress, as long as they are ordered correctly. **Cons:** - Adds protocol complexity (a new message class, directory state, ack/grant logic). - Risk of fence-ack starvation under heavy traffic. - Requires careful design to avoid deadlock with normal coherence traffic (classic message-class-dependency cycle). ### 8.4 Approach D: Speculative OoO + MOB This is the out-of-order approach. The LSU becomes a Memory Ordering Buffer (MOB) that tracks per-operation completion and issues fences by tracking the "oldest in-flight" of each class. This is how high-performance OoO cores implement fences; the trade-off is pipeline depth and complexity. XH-1 is proposed as **in-order** for power and predictability; see §9.1. OoO is listed for completeness. **Pros:** - Highest performance on workloads with deep memory-level parallelism. - Fences can be "free" if no relevant older operation is in flight. **Cons:** - Significantly larger area and power. - More verification effort, especially for the MOB's speculative reordering. - Diminishing returns on memory-bound workloads at 128 cores (the bottleneck is the interconnect, not the per-core issue rate). ### 8.5 Summary of Approaches | Approach | Perf (single) | Perf (128) | Area | Verif. effort | Risk | | -------- | ------------- | ---------- | ---- | ------------- | ---- | | A: Cons. | Low | Lowest | Lowest | Lowest | Low | | B: Token | Medium | Medium | Low | Medium | Low | | C: Dir-Assisted | Medium-high | High | Medium | High | Medium | | D: OoO+MOB | High | High | High | Highest | High | > **Proposed XH-1 implementation:** **Approach C (Directory-Assisted > Ordering)** as the primary, with **Approach B (Token-Based > Completion)** as the per-core implementation strategy. The > directory handles global serialization, the LSU handles local > token tracking. This combination is the most natural for a > directory-coherent 128-core design. --- ## 9. Interactions with the Pipeline and Other Subsystems ### 9.1 Pipeline Choice (In-Order vs. Out-of-Order) XH-1 is **[Proposed] in-order** for the first silicon. The reasons: - Power envelope. 128 cores at high frequency is a thermal challenge; an in-order core can run cooler. - Predictable timing. Real-time and safety-critical workloads benefit from deterministic `FENCE` and `FENCE.I` latencies. - Verification cost. An OoO core's MOB is a major verification burden; a 128-core OoO design is a multi-year project. An in-order pipeline interacts with ordering as follows: - The LSU is non-speculative on the store side (stores are committed when the integer pipeline commits them) and lightly speculative on the load side (loads may issue before older stores, with a structural dependency check at commit). - `FENCE` stalls the pipeline until drain; the cost is a few tens to a few hundred cycles depending on directory state. - Acquire/release AMOs generate local fence events in the LSU. An OoO pipeline would: - Issue stores from the STB to L1, with the MOB tracking completion. - Issue loads speculatively past stores with prediction; the MOB validates at commit. - `FENCE` becomes a "wait for oldest in-flight of pred class to complete" check; usually very fast. > **Open:** Whether a future XH-2 could be OoO. The research > project is not yet at that question. ### 9.2 Cache Hierarchy Memory ordering is shaped by the cache hierarchy: - **L1 D-cache:** the load-side ordering reference. A load that hits in L1 sees a value that is at least as recent as the cache's coherence state indicates. A load that misses in L1 must go to L2, where the directory arbitrates the order. - **L2 slice (per tile):** home of the directory entry; serializes ordering for the addresses it owns. - **L3 (shared, distributed):** a victim cache and last-level coherence point. XH-1's directory is the L2 directory; L3 is treated as a backing store. Invalidation ordering for XH-1 therefore ends at L2. - **L1 I-cache:** the `FENCE.I` target. The I-cache must be flushed or invalidated to ensure stores are visible. The cache hierarchy directly affects `FENCE` latency because the "completion" point is the L2 directory. A `FENCE W,W` in a system with L1-only ordering would be much cheaper (a few cycles) but incorrect; the L2 directory must be in the loop. ### 9.3 Memory System The memory system (DRAM controllers, on-chip memory, scratchpads) must respect the same ordering. For XH-1, accesses to on-chip scratchpad memory bypass the coherence protocol entirely; they are ordered by the scratchpad controller. > **Open:** Whether XH-1 has a per-tile scratchpad or a shared > on-chip SRAM region. If shared, ordering between scratchpad and cache-coherent regions is a research question. ### 9.4 Interconnect The mesh interconnect has ordering properties (per-link in-order, globally non-ordered) that determine what the directory and endpoints must do to maintain memory ordering. The "virtual channel" abstraction in the mesh is the unit of ordering; XH-1 **[Proposed]** uses: - **VC0:** Coherence requests (in-order). - **VC1:** Coherence responses (in-order). - **VC2:** Data messages (in-order). - **VC3:** Fence-ack and other ordering-sensitive messages (in-order). This separation avoids deadlock and simplifies ordering reasoning. ### 9.5 Interrupts RISC-V interrupts are delivered to a hart based on the *global interrupt-enable* bits and the PLIC. Ordering constraints: - A hart that disables interrupts and then writes to a shared variable does not need a `FENCE` before the interrupt-disable write; the write to `mstatus` or `sstatus` is itself a CSR write and is ordered architecturally. - A hart that claims an interrupt at the PLIC and then reads a device register must `FENCE` between the claim and the read to ensure the claim is globally visible (the claim is a load from the PLIC's claim register; the read is a load to the device). - The interrupt-return path uses `mret`/`sret`, which is architecturally ordered with respect to prior CSR writes. - Trap delivery and `xRET` do not include implicit memory fences; the OS must insert them. XH-1's interrupt controller integration must ensure that the interrupt-acknowledge signal is recognized only after the relevant memory accesses are ordered. ### 9.6 Operating System The OS uses `FENCE` heavily: - **Spinlocks and mutexes:** the lock acquire is typically a `LR`/`SC` sequence; the lock release is an `SC` or a `FENCE` followed by a `SW` to the lock variable. - **Page-table manipulation:** `SFENCE.VMA` after every PTE write. - **I/O:** `FENCE` before/after device accesses (see §6). - **Cross-core TLB shootdown:** an IPI sender writes the invalidation request to a shared memory location, then sends an IPI, and the receiver must see the request after the IPI — this requires a `FENCE` on the sender side. - **RCU grace periods:** RCU relies on the memory model's guarantees; a weak model like RVWMO requires explicit `FENCE` at grace-period boundaries. - **Boot and SMP startup:** the boot hart must `FENCE` before starting secondary harts to ensure the trampoline code and data are visible. XH-1's OS port (Linux, or a research kernel) must insert `FENCE` at all these sites. The cost of a `FENCE` in a 128-core system makes the boot-time and idle-time costs small in absolute terms but potentially large in *relative* terms; an in-order core that spends 200 cycles per `FENCE` will spend a noticeable fraction of its time in fences if it idles on a spinlock. > **Open:** Whether XH-1 ports a vanilla Linux or a research > kernel. The memory-ordering analysis in this document assumes > vanilla Linux semantics but applies in both cases. ### 9.7 Verification Memory ordering is famously difficult to verify because: - The bug is typically a very rare, non-deterministic interleaving. - The legal reorderings are many; enumerating them is hard. - The coherence protocol and the memory model interact in subtle ways. XH-1's verification strategy **[Proposed]**: 1. **Litmus tests** for the memory model. Run a corpus of litmus tests (based on the RISC-V memory-model litmus test suite, plus XH-1-specific tests) on RTL simulation. The tests must include the published RVWMO tests and tests specific to XH-1's coherence protocol. 2. **Coherence protocol model checking.** Use a formal model (e.g., Murphi, TLA+) of the directory protocol; prove invariant properties. 3. **Pipeline formal verification.** Verify the LSU's local reordering rules with bounded model checking. 4. **System-level simulation.** Boot Linux on the RTL or a high-level model; run stress workloads (e.g., `perf bench futex`, RCU torture test). 5. **Stress with random delay injection.** Vary latency on each interconnect path randomly to expose ordering bugs. The published **herd7** tool from Cambridge and the **diy7** litmus-test framework are the standard tools for RVWMO verification. **Operational models** like Zam are more amenable to formal reasoning than axiomatic models; XH-1 should **[Proposed]** support both for verification. > **Open:** Whether XH-1's verification flow includes formal > proofs of the memory ordering contract end-to-end, or whether > simulation-based testing is the primary line of defense. A > research project may choose the latter; a commercial project > should aim for the former. ### 9.8 Performance Memory ordering has two performance axes: 1. **Steady-state throughput:** how fast can the system process ordinary memory traffic. This is dominated by coherence and cache behavior, not by ordering per se. 2. **Fence/atomic latency and throughput:** how fast is a synchronization primitive. This is where ordering directly impacts performance. For a 128-core system, the second axis is the more important contributor to scalability. A workload with frequent synchronization (e.g., a parallel database, a many-core machine-learning inference engine) is dominated by `FENCE` and AMO latency. > **Quantitative note (rough estimate):** Assuming a 1 GHz in-order > core, a directory-coherent L2 slice with a hop latency of ~10 ns > per mesh traversal, and an average of 3–5 hops per coherence > transaction, a single uncontended `FENCE` on a hot line might > take ~30–50 ns (30–50 cycles). A contended `FENCE` (multiple > sharers) requiring invalidation acks could take 100–300 ns > (100–300 cycles). On a 128-core workload that fences once per > critical section, this is the dominant cost. XH-1's performance evaluation **[Proposed]**: - Measure `FENCE` latency distribution under varying contention and across the mesh (corner vs. center tile). - Measure AMO latency under contention. - Measure the effect of `aq`/`rl` vs. explicit `FENCE` in the OS. - Compare against an ideal "no ordering cost" baseline. --- ## 10. Specific RISC-V Considerations ### 10.1 The `Ztso` Extension (Optional) `Ztso` provides TSO (Total Store Order) at every hart. With `Ztso`, the implementation guarantees that stores are not reordered with respect to subsequent loads, simplifying the software model. > **Proposed XH-1 stance:** Do not advertise `Ztso` for the > first silicon. The hardware cost of supporting TSO at every > hart is a tighter store-load ordering in the LSU, and the > benefit is only felt by software that is willing to be > incompatible with weak-ordering implementations. The standard > RISC-V Linux kernel is RVWMO-compatible and does not require > `Ztso`. Re-evaluate if a major software target requires it. ### 10.2 The `Zam` Extension (If Adopted) `Zam` is a proposed extension that provides an operational memory model in addition to the axiomatic RVWMO. It does not change the contract; it provides operational clarity. XH-1 **[Proposed]** will document its memory model in terms of `Zam` where possible because operational models are easier to implement and verify. ### 10.3 The PTE-Based Memory Type (PBMT) XH-1's MMU must support the PBMT field and route accesses to the appropriate ordering class. Specifically: - **PMA = NC (non-cacheable):** accesses go to the device port; load/store ordering is enforced by the device-port controller. - **PMA = IO (weakly ordered I/O):** same as NC, but with explicit reordering rules. - **PMA = WEAK (cacheable but weakly ordered):** accesses are cached but ordered weakly; useful for write-combining buffers. - **PMA = STRONG (cacheable, strongly ordered):** same as cacheable but with fence semantics on every access; rarely used. > **Open:** Whether XH-1 supports all PBMT values or a subset. > A research project may support all four; a commercial project > may support only NC and cacheable. ### 10.4 The `fence.i` and Instruction-Fetch Coherence `FENCE.I` orders stores w.r.t. instruction fetches on the same hart. Cross-hart, the software idiom is: ```c // hart A: write_code(addr, code); __sync_synchronize(); // FENCE send_ipi(hart_B); // hart B: handle_ipi(); __sync_synchronize(); // FENCE __fence_i(); // FENCE.I icache_flush(); jump_to(addr); ``` XH-1's I-cache is a VIPT cache; on an aliasing configuration (small pages, large cache), the OS must use the recommended sequence (or the larger page size). The architecture team will document this. ### 10.5 TSO and RVWMO Differences for Software Although the focus here is hardware, it is worth noting for completeness: - Under TSO, ordinary loads and stores have program order semantics. Under RVWMO, they do not. - A program that is correct under TSO may not be correct under RVWMO without additional fences. The Linux kernel's memory-model code (`tools/memory-model/`) contains the required fences for RVWMO. XH-1's port will use the RVWMO-correct fences; no special support is required in hardware beyond honoring the standard `FENCE`. --- ## 11. Unresolved Design Questions The following questions remain open for the XH-1 architecture: 1. **In-order vs. out-of-order pipeline.** In-order is proposed, but the decision is not final. An OoO pipeline changes the MOB design and may improve `FENCE` latency. 2. **`Ztso` adoption.** Whether to support TSO at every hart. 3. **`Zam` adoption.** Whether to require the operational memory model in the specification. 4. **Coherence protocol.** MSI vs. MESI vs. MOESI. The choice affects the number of transitions and therefore the number of coherence-induced ordering edges. (See the coherence research document.) 5. **Interconnect topology.** Mesh vs. ring vs. hierarchical bus+mesh. The choice affects `FENCE` latency and the directory's role. 6. **PBMT support scope.** Which PTE memory types XH-1 implements. 7. **Per-line vs. per-word reservation.** Affects `LR`/`SC` success rates. 8. **Fence-ack message class.** Whether to add a dedicated fence-ack message (Approach C) or rely entirely on per-core token tracking (Approach B). 9. **Verification strategy.** Simulation-based vs. formal; end-to-end memory model proofs. 10. **OS port.** Linux vs. a research kernel; this affects the set of `FENCE` sites the system must support. --- ## 12. Recommendations Where evidence supports a recommendation, the following are XH-1's proposed positions: 1. **Adopt RVWMO as the memory model.** This is the standard RISC-V model and is the most widely supported by software. 2. **Implement an in-order pipeline with Approach C (Directory-Assisted Ordering) and Approach B (Per-Core Token Completion).** This combination scales to 128 cores while keeping the per-core pipeline simple. 3. **Use a directory-based MESI coherence protocol at the L2 slice.** The directory is the natural serialization point for memory ordering. (See the coherence research document for the full argument.) 4. **Add a dedicated fence-ack message class to the coherence protocol.** This avoids overloading existing messages and reduces verification ambiguity. 5. **Honour the standard `FENCE`, `FENCE.I`, `SFENCE.VMA`, `LR`/`SC`, and AMO semantics.** No architectural deviations. 6. **Document the cross-hart self-modifying-code sequence in the programmer's manual.** Use the standard fence pair. 7. **Implement the PTE-based memory types (PBMT) for at least NC and cacheable.** Other types are deferred. 8. **Provide a memory-model litmus-test suite as part of the verification deliverables.** This is essential for catching ordering bugs. 9. **Measure `FENCE` and AMO latency across the mesh in performance evaluation.** Corner tiles have different latency from center tiles; the asymmetry is a real performance concern. --- ## 13. References The following sources informed this document. URLs and publication details are given where known; the reader should verify currency, as the RISC-V ecosystem is rapidly evolving. - RISC-V International, *RISC-V Instruction Set Manual, Volume I: Unprivileged ISA*. Appendix A, "RVWMO: The RISC-V Weak Memory Ordering Model." - RISC-V International, *RISC-V Instruction Set Manual, Volume II: Privileged ISA*. Sections on fence and memory types (PBMT). - Pulte, C., et al. *"Zam: A Complete and Verifiable Operational Memory Model for RISC-V."* (Reference to the operational memory model paper.) - Owens, S., Sarkar, S., Sewell, P. *"A Better x86 Memory Model: x86-TSO."* (TSO reference; the TSO model is the inspiration for `Ztso`.) - Lamport, L. *"How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs."* IEEE TC, 1979. (The foundational sequential consistency paper.) - Adve, S. V., Gharachorloo, K. *"Shared Memory Consistency Models: A Tutorial."* IEEE Computer, 1996. (Tutorial on memory models.) - Martin, M. M. K., et al. *"Token Coherence."* (Token-based ordering reference, applicable to Approach B.) - ACM SIGOPS Operating Systems Review. *Linux Kernel Memory Model Documentation.* (`tools/memory-model/` in the Linux kernel source tree.) - AMD. *AMD64 Architecture Programmer's Manual*, Volume 2. (TSO reference for comparison.) - Intel. *Intel 64 and IA-32 Architectures Software Developer's Manual*, Volume 3. (TSO reference for comparison.) - ARM. *ARM Architecture Reference Manual*. (Comparison with ARM's weak memory model.) Specific tool references: - **herd7**: litmus-test framework for weak memory models, by Cambridge. https://github.com/herd/herdtools7 - **diy7**: companion tool for herd7. - **Murphi**, **TLA+**: protocol model checkers used for coherence protocol verification. The RISC-V Memory Model working group's published documentation, including the operational model papers and the litmus-test corpus, is the primary source for the RVWMO contract. Specifics of XH-1's coherence protocol are out of scope for this document and are addressed in the coherence research document. --- ## 14. Document Status This document is a **research proposal**. It does not represent a finalized XH-1 architectural commitment. Items marked **[Proposed]** are engineering recommendations under evaluation; items marked **[Open]** are unresolved design questions. The next revisions of this document should: - Reflect decisions on the open questions in §11. - Add quantitative `FENCE` latency measurements once RTL or high-level models are available. - Incorporate results from the verification litmus-test suite. - Align with the final coherence protocol choice. - Document the OS-level `FENCE` insertion policy. --- *End of document.*