Mill Computing, Inc.
Replacing traditional register files with a temporal conveyor belt eliminates renaming hardware and slashes bypass multiplexer sources, enabling 33 operations per cycle at digital signal processor efficiency levels.
AI-assisted summary of The Mill CPU Architecture - the Belt (2 of 13) — original source. Check the original for full context.
Source published:
Key ideas
- Mill Computing introduced the Belt, an alternative CPU operand model that replaces conventional register files and dynamic register renaming with a temporal FIFO queue. (20:55)
- By shifting from spatial registers to temporal addressing, the Mill core slashes routing sources from approximately 450 to 64, cutting the interconnect power overhead that accounts for nearly half of modern superscalar consumption. (32:28)
- The flagship Mill Gold configuration targets 33 MIMD operations per cycle at 1.2 GHz and 28 W, offering up to 80 GOPS peak through compiler-driven exposed-pipeline scheduling. (3:12)
- Software compatibility across diverse Mill microarchitectures is achieved via an install-time specialization model derived from IBM AS/400 rather than fixed instruction bit patterns. (76:05)
Detailed notes
## Background Published on YouTube by Mill Computing, Inc. on July 29, 2013, this video is the second installment in a 13-part lecture series detailing the company's novel CPU architecture. The presentation focuses on the Belt, introducing a conveyor-belt machine model designed to eliminate register renaming, false hazards, and bypass routing overhead.
## TL;DR Ivan Godard presents the Mill CPU architecture and its central mechanism, the Belt, which replaces conventional general-purpose registers with a temporal FIFO structure where functional unit outputs drop at the front and age off the back. He illustrates how standard out-of-order superscalar processors squander over 90 percent of their power and silicon area on register renaming and massive bypass multiplexer trees to handle transient data. By exposing execution latencies directly to the compiler and leveraging temporal addressing, the Mill eliminates write-after-read and write-after-write hazards, drops instruction destination encodings, and achieves up to 33 MIMD operations per cycle at DSP-level energy efficiency.
## Atmosphere & style The presentation carries the dynamic feel of an advanced Silicon Valley engineering colloquium, marked by dry humor, intellectual candor, and technical irreverence. Ivan Godard speaks with the easy confidence of a veteran systems architect, poking fun at industry conventions and openly conceding the design's trade-offs and 'vaporware' status with lines like admitting he is 'lying through his teeth' to simplify complex multiplexer math. The mood is intellectually stimulating and grounded, transforming abstract microarchitectural theory into a lively, first-principles critique of mainstream processor design.
## Bulletin - [20:55](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1255s) Mill Computing introduced the Belt, an alternative CPU operand model that replaces conventional register files and dynamic register renaming with a temporal FIFO queue. - [32:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1948s) By shifting from spatial registers to temporal addressing, the Mill core slashes routing sources from approximately 450 to 64, cutting the interconnect power overhead that accounts for nearly half of modern superscalar consumption. - [03:12](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=192s) The flagship Mill Gold configuration targets 33 MIMD operations per cycle at 1.2 GHz and 28 W, offering up to 80 GOPS peak through compiler-driven exposed-pipeline scheduling. - [01:16:05](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4565s) Software compatibility across diverse Mill microarchitectures is achieved via an install-time specialization model derived from IBM AS/400 rather than fixed instruction bit patterns.
## Key takeaways - [06:33](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=393s) Modern superscalar processors expend over 90% of their power and silicon area on control logic, prediction, renaming, and bypass crossbars rather than actual computation. - [11:20](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=680s) Bypass crossbars on architectures like Intel Haswell require routing paths among roughly 500 sources and 100 sinks, scaling multiplexer latency and consuming about half of the total core power. - [18:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1108s) Empirical studies by Yale Patt indicate that 80% of temporary values are referenced only once, serving strictly as point-to-point dataflow connections between instructions. - [20:55](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1255s) The Belt provides a conveyor-belt machine model using relative temporal addressing (B0, B1, etc.) where newest results enter at the front and older values naturally drop off. - [20:55](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1255s) Temporal addressing eliminates explicit destination register fields in instruction encodings, significantly shrinking machine code size. - [23:56](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1436s) Values that must survive past their belt residency are transferred into a non-addressable, frame-local SRAM scratchpad using static-offset spill and fill operations. - [27:01](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1621s) Operations producing multiple results, such as division generating both quotient and remainder, drop both outputs onto the belt in one cycle without special registers or glitches. - [28:24](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1704s) Function calls and returns execute in a single cycle with zero prologue or epilogue overhead, passing arguments directly on the belt and returning intact caller state. - [35:00](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2100s) Mill pipelines expose exact execution latencies to the compiler, allowing multi-cycle operations to remain in flight across calls and retire directly into their issuing frame. - [40:26](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2426s) Hardware interrupts are handled identically to spontaneous, involuntary function calls, avoiding duplicate supervisor registers or destructive pipeline flushes. - [42:17](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2537s) A two-stage segregated crossbar interconnect directly couples single-cycle ALUs while routing multi-cycle functional units through a secondary network, reducing multiplexer depth to 1–2 levels. - [01:00:39](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3639s) Advancing the belt is implemented by broadcasting an index offset increment across tagged output registers rather than physically shifting data between flip-flops. - [55:56](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3356s) Security and privilege rings are eliminated; protection is enforced purely through memory addressing boundaries, dispensing with supervisor modes and privileged instructions. - [01:16:05](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4565s) Programs are distributed as an abstract intermediate representation and specialized into native machine instructions at installation to adapt to specific belt sizes and issue widths. - [01:19:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4768s) Aggressive software pipelining and if-conversion allow complex control flows like the Unix wc loop to compile into branchless single-cycle kernels issuing up to 25 operations concurrently.
## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=0s) Introduction and the Tale of Two Architectures
Ivan Godard opens the talk by thanking Google for providing the venue and the invitation. He introduces this lecture as part of an ongoing series detailing the Mill general-purpose CPU architecture, focusing specifically on internal data structures, inter-operation data communication, the programmer's execution model, and an overview of the underlying physical implementation.
To frame the problem, he contrasts two contemporary top-of-the-line processors from major manufacturers representing polar opposite design philosophies: 1. **Out-of-Order Superscalar CPU:** A 4-core desktop/server chip operating at 3.3 GHz, issuing a peak of 4 operations per cycle per core. It consumes 130 W, delivers 52 giga-operations per second (GOPS), and sells for $885 in quantities of 1,000. 2. **In-Order VLIW DSP:** A single-core embedded digital signal processor operating at 500 MHz (0.5 GHz) that issues 8 operations per cycle peak. It consumes a mere 1.1 W, delivers 3.6 giga-instructions per second (GIPS), and costs only $17 in 1,000-unit quantities.
Comparing their power and cost efficiencies reveals a staggering gap: the out-of-order superscalar provides 406 MIPS per watt and 59 MIPS per dollar, whereas the in-order DSP operates in a completely different efficiency realm. Normalizing the comparison to a per-core basis underscores this penalty: the superscalar core provides roughly 3.5× higher performance than the DSP core, but it costs 30× as much power and 13× as much money.
| Metric | Out-of-Order Superscalar (4 cores) | In-Order VLIW DSP (1 core) | Superscalar vs DSP (Per-Core Ratio) | |:--- |:--- |:--- |:--- | | **Clock Frequency** | 3.3 GHz | 0.5 GHz (500 MHz) | ~6.6× frequency | | **Peak Issue Width** | 4 ops/cycle/core | 8 ops/cycle/core | 0.5× issue width | | **Power Dissipation** | 130 W total (~32.5 W/core) | 1.1 W | ~30× power per core | | **Throughput** | 52 GOPS total (13 GOPS/core) | 3.6 GIPS | ~3.6× performance per core | | **1k Unit Price** | $885 (~$221/core) | $17 | ~13× cost per core | | **Power Efficiency** | 406 MIPS/W | High DSP efficiency | Severe superscalar penalty | | **Cost Efficiency** | 59 MIPS/$ | High DSP efficiency | Severe superscalar penalty |
---
[03:12](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=192s) The Efficiency Disparity and the Mill Objective
Addressing why such a dramatic commercial disparity persists without being arbitraged away, Godard explains that the DSP is a 32-bit architecture whereas the superscalar is a 64-bit machine. Furthermore, users seeking absolute single-thread horsepower cannot extract it from a DSP. Most crucially, their target workloads are fundamentally incompatible: “Signal processing is just not the same as general purpose code.” A DSP VLIW tasked with running a typical general-purpose desktop operating system and software would perform terribly. Conversely, running DSP workloads on a superscalar is technically feasible, but only “as long as you had enough Freon to keep it cool.”
The founding challenge for Mill Computing was to bridge this gap: achieve DSP-level energy and cost efficiency on general-purpose software workloads. Following nearly a decade of research and development, Godard presents the projected figures for the **Mill Gold**: - **Configuration:** 2 cores on a single chip. - **Issue Width:** 33 operations per cycle peak per core. - **Clock Frequency:** 1.2 GHz (roughly one-third the clock rate of high-end superscalars). - **Power Consumption:** 28 W. - **Throughput:** Just under 80 GOPS peak. - **Projected Price:** $225.
Godard is candid about the current status of the project: “Now, this is vaporware. We are several years still away from having something with pins on the bottom.” The power numbers represent engineering estimates derived from multi-year cycle-accurate simulations, while the projected price is an estimate given that they intentionally operate without a marketing department: “and the longer that lasts, the happier I'll be.”
Comparing the Mill Gold core against the baseline processors shows: - **Mill vs. DSP (per core):** The Mill achieves 11× the performance at 12× the power, demonstrating successful linear scaling of DSP-like efficiency up to high performance. - **Mill vs. Superscalar (per core):** The Mill achieves nearly 2.5× the performance while requiring nearly 2.5× less power and costing roughly half the price.
---
[06:33](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=393s) 33 Operations per Cycle: Why and How?
No existing production processor issues 33 operations per cycle. Godard clarifies that these 33 operations are independent MIMD instructions—not SIMD lanes or packed vector elements where operations inside a vector are inflated into separate counts. If the Mill counted SIMD execution that way, the Gold configuration would claim over 500 operations per cycle peak. Instead, these are 33 distinct, concurrent instructions—branches, loads, adds, and logical operations—that strictly match the chip's functional unit population. On the Gold core, this includes up to 8 integer adds simultaneously alongside other operations.
Explaining why 33-wide issue is desirable, Godard points out that the vast majority of executed instructions reside inside loops. DSP loops are conventionally software pipelined, and software pipelines possess unbounded instruction-level parallelism (ILP). While realized instructions per cycle (IPC) is capped by the number of physical functional units (such as available adders), the potential ILP in loops is enormous. General-purpose loops rarely achieve software pipelining on conventional architectures due to control flow, branches, and function calls.
```mermaid flowchart TD accTitle: Superscalar Resource Breakdown accDescr: Diagram illustrating that functional units occupy only eight to nine percent of superscalar area and power while control and data distribution consume the rest. subgraph ChipBudget["Superscalar Area & Power Budget"] direction TB Control["Control & Data Routing (~91-92%)<br/>• Next-op prediction<br/>• Instruction decode & dispatch<br/>• Execution staging<br/>• Result bypass crossbars"] ALUs["Execution Units (~8-9%)<br/>• Adders, multipliers<br/>• Vector units, shufflers"] end ```
The Mill incorporates architectural mechanisms allowing software pipelining across nearly all loops, including those with embedded calls and irregular branches, driving loop execution overhead down below 15% of cycles. This approach pays off because functional units are cheap: - “An adder is a tiny, tiny little thing.” - On modern processors, all functional units combined (adders, shifters, multipliers, vector engines) account for only 8% to 9% of total chip area and power dissipation. - Nearly the entire area and energy budget of an out-of-order superscalar is squandered on overhead: determining what to execute next, preparing operands, and dynamically routing results to subsequent consumers.
Adding vast arrays of functional units is straightforward and cheap. The real bottlenecks to achieving a 33-issue machine are instruction decoding and data distribution. Godard notes that the decode mechanism—handling variable-length, x86-like instruction bundles at 33 operations per cycle—was addressed in a previous talk at Stanford's EE 380 seminar. The central problem of this lecture is data routing: how to feed data between operations at a rate exceeding 30 operations every single cycle.
---
[11:20](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=680s) The Interconnect Explosion: Sources, Sinks, and Multiplexers
Godard cautions that hardware descriptions at this level are an intentional simplification to provide an intuitive understanding of the engineering challenge: “Any of you who actually do do chip design know I'm lying through my teeth, but at least you'll get a sense of the order of magnitude of the problem.” Modern out-of-order processors suffer from an extreme producer-consumer fan-out problem: - In an architecture like Intel Haswell, there are nearly 500 distinct internal data sources (functional unit outputs, rename registers, bypass buffers). - Haswell contains nearly 100 data sinks (functional unit operand ports, reservation stations, memory queues). - Supporting universal routing—allowing any source to feed any sink across full data-path widths—requires an interconnect fabric with up to 50,000 possible cross-point connections.
```mermaid flowchart LR accTitle: Source to Sink Multiplexer Tree Routing accDescr: Diagram showing how multiple data sources are selected via multiplexer trees driven by control lines to feed a single consumer sink. subgraph Sources["Sources (~500 on Haswell)"] S0["Source 0"] S1["Source 1"] S2["Source..."] SN["Source 499"] end
subgraph MuxTree["Multiplexer Tree"] M1["Mux Layer 1"] M2["Mux Layer 2"] MFinal["Final Mux"] Ctrl["Control Lines"] -.-> M1 Ctrl -.-> M2 Ctrl -.-> MFinal end
subgraph Sink["Operand Sink (~100 total)"] Consumer["Functional Unit Input"] end
S0 --> M1 S1 --> M1 S2 --> M2 SN --> M2 M1 --> MFinal M2 --> MFinal MFinal --> Consumer ```
The fundamental circuit component used to route this data is the 2-to-1 multiplexer (mux). It takes two data inputs at the top, a control select line at the side, and routes one chosen input to its single output. To feed a single sink from hundreds of candidate sources, designers cascade multiplexers into large decoding trees. The control logic configures the select signals across each layer of the tree, guiding the appropriate data word down through the levels of logic until it lands at the destination functional unit input port. Scaling this conventional bypass network up to 33 issue slots causes an unmanageable explosion in multiplexer complexity, wire routing congestion, latency, and power dissipation.
[13:59](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=839s) The Interconnect Tax: Latency, Power, and the Superscalar Limit
Even simplifying away the intricate hardware implementations down to multiplexer trees, the physics of connecting functional units together remains unforgiving. Latency—the time required to route data from a producer source to a consumer sink—scales with the depth of the connection path, which is logarithmic to the number of sources. Power consumption is even harsher, scaling roughly with the product of sources and sinks. A pool of roughly 500 sources yields nine multiplexer levels, adding at least three whole pipeline stages just to traverse the bypass network. The real-world consequence inside modern high-performance superscalars is staggering: on a chip like Intel's Haswell, routing data through this internal interconnect network consumes approximately half of the core's total electrical power.
Engineers have devised countless clever workarounds and routing topologies over decades of chip design, many of which ship in commercial processors today. Yet while these mitigations help around the edges, they cannot alter the fundamental scaling problem. A traditional VLIW processor can achieve high compute density at a fraction of the energy because it only needs to route around eight sources, whereas an aggressive superscalar routes among hundreds. The ceiling on modern processing performance is not functional unit math, but the raw power and timing budget required for data distribution.
> “And when it all comes down to it, this interconnect tends to on a superscalar such as the Haswell will tend to consume around half of the overall power of the chip of the core.”
- **Latency scaling**: Proportional to connection depth, or $\log_2(\text{sources})$; 500 sources require 9 multiplexer levels, adding at least 3 pipeline stages. - **Power scaling**: Proportional to $\text{sources} \times \text{sinks}$. - **Architecture comparison**: Superscalars pay roughly 30 times the interconnect power penalty of an 8-source VLIW machine. - **Root barrier**: The primary performance ceiling is the power-times-delay cost of operand delivery.
---
[15:34](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=934s) Hazards and Register Renaming: Why Processors Need 500 Sources
The sheer volume of sources raises an obvious paradox: if an instruction set architecture only defines 32 architectural registers, why do modern chips contain hundreds of physical sources? The culprit is register renaming. When a naive compiler translates two completely independent source code statements into machine instructions, it frequently reuses temporary registers. For example, if expression one computes an addition into temporary register `RT` and increments it, while expression two independently computes a subtraction into `RT` and adds to it, there is no genuine data dependency between the two calculations. In theory, both initial operations could execute concurrently in cycle one, and both finishing operations could execute in cycle two.
```mermaid flowchart TD accTitle: False Dependency Hazard vs Register Renaming accDescr: Diagram contrasting how reusing temporary register RT creates a hazard, which hardware resolves by renaming to RT1 and RT2.
subgraph Hazard ["Architectural Register Hazard"] direction TB H1["Cycle 1: Add -> RT"] H2["Cycle 1: Sub -> RT"] HZ{{"Hazard: Which RT value survives?"}} H1 --> HZ H2 --> HZ end
subgraph Renamed ["Hardware Register Renaming"] direction TB R1["Cycle 1: Add -> RT1"] R2["Cycle 1: Sub -> RT2"] R3["Cycle 2: Inc RT1 -> Res1"] R4["Cycle 2: Add RT2 -> Res2"] R1 --> R3 R2 --> R4 end ```
The problem arises at the cycle boundary: if both instructions assign to `RT` simultaneously, the processor encounters a write-after-write hazard. When the subsequent instructions reference `RT`, the hardware cannot know which value to read, risking a bit-merged corruption of both results. To allow parallel execution without stalling, out-of-order processors dynamically remap those architectural register names onto a vast internal pool of rename registers, converting `RT` into distinct physical registers `RT1` and `RT2`. Compilers are forced into this reuse because 32 registers are insufficient, architectures lack clean mechanisms to mark when an operand has seen its final use, and calling conventions obscure whether downstream functions will preserve register contents.
> “This is called a hazard, and rename is a device used to avoid hazard in processors.”
- **The false dependency problem**: Compilers running out of registers emit false write-after-write (WAW) and write-after-read (WAR) dependencies between unrelated expressions. - **Hardware renaming overhead**: The CPU must dynamically track and rename architectural names into separate physical registers so instructions can issue in parallel. - **The compiler's dilemma**: Compilers cannot easily communicate the "last use" of an operand, forcing hardware to conservatively keep register allocations alive.
---
[18:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1108s) The Anatomy of Temporaries and the Failure of Stacks
Analyzing how programs actually utilize temporary registers exposes how mismatched conventional register files are to actual execution needs. Academic research conducted by Yale Patt and one of his students revealed that an overwhelming 80% of all temporary values are referenced exactly once. These single-use values exist for no other reason than to serve as ephemeral plumbing—forwarding the output of an adder into the input of a multiplier, never to be touched again. A modest 14% of values are referenced two or more times, behaving as true local fast memory to stash data for short-term reuse. The remaining 6% of produced temporaries are never referenced at all.
Instead of forcing a single, bloated register mechanism to handle both dataflow plumbing and temporary storage, an architecture ought to decouple them. Historical architectures managed dataflow without named general registers: accumulator machines implicitly used the accumulator for results and inputs, eliminating hazards at the cost of strict serialization. Stack machines similarly took both inputs from the top of the stack and pushed results back, naturally avoiding hazards and renaming. However, because a classic stack machine only exposes a single stack top, it can only execute a single operation at a time, entirely defeating wide instruction issue. The ideal machine model requires several interleaved stacks whose entries can be accessed by multiple functional units simultaneously.
> “80% are referenced exactly once. They are used solely to indicate the data flow connection from one operation to another.”
- **Yale Patt temporary value distribution**: - **80% single-use**: Pure dataflow connections between operations. - **14% multi-use**: Reused two or more times as local fast scratch memory. - **6% zero-use**: Computed results that are never read. - **Accumulator machines**: Implicitly reference the accumulator; hazard-free, but structurally limited to single-operation serial throughput. - **Stack machines**: Implicit operands eliminate rename hardware entirely, but a single stack head prevents parallel multi-issue.
---
[20:55](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1255s) The Belt: Conveyor-Belt Execution and Temporal Addressing
The Mill architecture realizes this interleaved multi-operand model through a construct called the Belt. Conceptually, the Belt operates as a fixed-length FIFO conveyor belt. Functional units read their inputs from any position along the belt and perform their operations. When results are produced, they drop onto the front of the belt simultaneously, shifting all existing entries down the line and letting the oldest values fall off the back end. It is vital to understand that the conveyor belt is the programmer's conceptual execution model rather than a literal giant physical shift register in the silicon.
```mermaid flowchart LR accTitle: Conceptual Diagram of the Mill Belt accDescr: A conveyor belt showing new operation results dropping at the front, pushing older values toward the back where expired values drop off.
subgraph Inputs ["Functional Unit Inputs"] FU["Functional Units\n(Add, Sub, Mul)"] end
subgraph BeltSlots ["The Belt (FIFO)"] direction LR B0["B0 (Newest)"] B1["B1"] B2["B2"] B3["B3"] B4["B4"] B5["B5 (Oldest)"] B0 --> B1 --> B2 --> B3 --> B4 --> B5 end
DropOff["Drop Off / Expire"] B5 --> DropOff
FU -->|"Read Any Slot (e.g. B3, B5)"| BeltSlots FU -->|"Drop Results at Cycle Boundary"| B0 ```
Belt addressing abandons fixed spatial register locations in favor of relative temporal addressing. In Mill assembly, an instruction specifies its input operands but specifies no destination address whatsoever, because results implicitly land at the front of the belt. Operands are indexed by how recently they were produced: `B0` is the most recent result, `B3` is the fourth most recent, and `B5` is the sixth most recent. As subsequent operations retire and drop new values onto the belt, the names of existing values change dynamically cycle by cycle. An operand sitting at `B3` will slide down to `B6` once three new results drop into position. While this temporal address shifting would make writing raw machine assembly by hand agonizing for a human, it represents an ideal, mathematically clean target for compiler instruction scheduling.
> “Writing hand code for this is not a pleasant exercise. It is ideal for a compiler code generator, however.”
- **No destination registers**: Instructions drop results at the belt head implicitly, eliminating destination operand fields and radically compressing instruction encoding. - **Temporal vs. spatial addressing**: Operands are referenced by their age (`B0`, `B1`, `B2`...) rather than fixed physical pigeonholes. - **Dynamic re-indexing**: An operand's Belt address shifts downward by exactly the number of results dropped in intervening cycles. - **Parallel drop**: All operations retiring in a single cycle drop their results onto the front of the belt together.
---
[23:56](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1436s) "Use It or Lose It" and the Frame-Local Scratchpad
Because the Belt is a finite FIFO, values that slide past the end drop off into oblivion: it is strictly "use it or lose it." To maximize code efficiency, the compiler schedules producer instructions as close as possible to their consumers, ensuring transient values are picked up while still riding the belt. Across the Mill family—which spans from compact embedded cores up to massive high-performance implementations, mirroring the architectural breadth of the IBM System/360—belt capacities are typically configured at 8, 16, or 32 positions. This design ensures that the 80% of single-use temporaries are consumed directly off the belt without ever requiring physical register allocation or renaming.
For the 14% of values that must persist across longer spans of code or survive multiple reads after falling off the belt, the architecture provides a dedicated hardware scratchpad. The scratchpad is an on-chip SRAM structure that is completely separate from main memory: it cannot be indexed, carries no memory pointers, and exists purely to hold statically referenced temporaries. A program preserves an item by issuing a `spill` instruction from the belt into a static scratchpad offset, and retrieves it later via a `fill` instruction that drops the value back onto the front of the belt. The scratchpad is strictly frame-local, allocating each function call its own private storage budget with an efficient hardware-managed illusion of infinite capacity, and operates with a fixed three-cycle spill-to-fill latency.
> “The scratchpad is a hardware, actually SRAM structure. It is not addressable as memory.”
- **Family belt capacities**: Typically 8, 16, or 32 positions, replacing the 300+ physical rename registers required by equivalent superscalars. - **Scratchpad characteristics**: - Pure on-chip SRAM; not part of the unified memory address space. - No pointer arithmetic or dynamic indexing; addressed strictly via static byte offsets. - Frame-local allocation: each function invocation receives a private scratchpad context. - **Spill and fill mechanics**: - `spill`: Copies a value from a belt position into a scratchpad slot. - `fill`: Reads from the scratchpad and drops the value onto the head of the belt. - Latency: 3 cycles from spill to fill availability.
[27:01](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1621s) Multi-Result Operations and the Canonical Pain of Divide
The Mill belt architecture naturally solves the awkward problem of operations that produce multiple outputs. In standard instruction set design, integer division is a notorious nuisance: while operations like add or multiply take two inputs and produce one output, divide naturally produces both a quotient and a remainder. Most conventional architectures resort to kludges to accommodate this mismatch. As the speaker explains:
> “And if you look at the instruction set of any machine of your choice, you will discover horrible clues called divide. Sometimes they're special registers, sometimes they're register pairs, sometimes there's this, sometimes there's that, but it's always a glitch.”
On the Mill, the functional unit for division takes two items off the belt just like any other unit. It computes over several cycles across internal pipeline boundaries, and when it finishes, it simply drops two results simultaneously onto the belt without special register pairs or side channels.
```mermaid flowchart LR accTitle: Multi-Result Divide Operation Flow accDescr: Divide reads two inputs from the belt and writes quotient and remainder directly to the belt. subgraph Inputs["Inputs"] BIn["Belt Inputs (2 Operands)"] end subgraph Execution["Execution"] Div["Divide Unit (Multi-Cycle Pipeline)"] end subgraph Outputs["Outputs"] BOut1["Belt Output 0: Quotient"] BOut2["Belt Output 1: Remainder"] end BIn --> Div Div --> BOut1 Div --> BOut2 ```
[28:24](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1704s) Function Calls and Multi-Valued Returns
Calling a function on the Mill requires no tedious register saving, reloading, or stack warm-up protocols. The caller simply issues a `call` operation specifying the target function and the belt positions of the arguments. One cycle later, execution enters the callee with an empty, fresh belt that is preloaded only with copies of the passed arguments.
When the callee finishes its work, it executes a `return` operation. Exactly one cycle later, the caller resumes with its belt completely untouched and intact, except that the callee's returned results are dropped right onto the front of the belt. Calls can return multiple values just as cleanly as single values, making a function call behave uniformly like an ordinary operation. As the speaker notes:
> “So, a call has the same effects as an operation like add. And a call can drop multiple results.”
Language features like Ada `out` parameters or C++ `std::pair`—constructs invented to work around the linear, left-to-right constraints of human programming languages that obscure true dataflow graphs—are transformed directly by the toolchain into clean, multi-result functions.
- Function calls require zero prologue/epilogue register saving or restoring instructions. - Caller arguments are copied directly into the callee's brand-new belt. - Callee returns drop single or multiple values directly onto the restored caller belt in a single cycle.
[30:46](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1846s) Belt Save/Restore and the Spiller
The seamless reappearance of the caller's belt after a function returns is managed automatically by a dedicated background hardware engine called the spiller. Similar in purpose to SPARC register windows or Intel Itanium register stack engines, the spiller operates entirely behind the programmer's back without requiring explicit save/restore instructions.
Every value residing on the belt is tagged with a hardware frame ID (for example, frame 742) in addition to its positional belt index. A running function can only reference values whose frame tag matches the current execution frame ID. Switching frames on a call instantly hides the old values, leaving the new function with an empty belt, while the physical data remains stored in background buffers to be saved and restored by the spiller at leisure. Because arguments are passed by copy, they are stamped with the callee’s new frame ID; the caller cannot touch them during the call, and the callee cannot see the caller's older values.
[32:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=1948s) Functional Unit Pipelines and Mux Sources
Functional units such as ALUs and shifters are grouped into clusters, slots, or pipelines that share common input wiring. Each pipeline on the Mill has exactly two data inputs shared across all internal units, while output connections are separated by operation latency. A single-cycle `add` routes out through latency-one outputs, whereas a three-cycle `mul` routes through latency-three outputs.
Each latency output feeds an internal, non-addressable capture register. Because operations like divide can produce multiple outputs per latency, every capture register constitutes an internal source that can be routed back as an input to other functional units. Encoding constraints dictate that the total number of physical sources must be at least twice the belt length. On the large "Gold" configuration of the Mill, the native outputs do not quite reach that threshold, so additional buffering is added to bring the machine to 64 total sources—an astonishingly small number when compared to the roughly 450 sources typical of an out-of-order superscalar design. As the speaker emphasizes:
> “This is the major reason why we are showing DSP power rather than superscalar power consumption.”
| Architecture Metric | Typical Superscalar | Mill "Gold" | |:--- |:--- |:--- | | **Bypass / Operand Sources** | ~450 sources | 64 sources | | **Power Profile** | High superscalar dissipation | Low DSP-level dissipation | | **Pipeline Input Ports** | Dynamic rename crossbars | 2 shared inputs per pipeline |
[35:00](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2100s) Wide Issue and Exposed Pipeline Execution
The Mill uses a wide-issue, statically scheduled model reminiscent of VLIW or Itanium. A single instruction word contains multiple operations packed into slots, which are issued simultaneously to corresponding functional pipelines.
Because it is an exposed-pipeline architecture, operation latencies are directly visible to software rather than being hidden behind out-of-order scheduling hardware:
> “What that means is that the latency of operations is visible to the program.”
If an operation takes three cycles, its result simply will not appear on the belt until three cycles later. For an expression like `(A + B) - (C * D)`, an adder and a multiplier can issue in parallel in cycle one. If the add completes in one cycle while the multiply requires three, the add result could sit on the belt waiting for the multiply, but letting idle results occupy belt positions wastes slots. Instead, code schedules best when producers feed directly into consumers: starting the multiply first, starting the add two cycles later, and issuing the subtract precisely when both results emerge together. This leaves the adder slot open during earlier cycles to perform unrelated work for other operations.
```mermaid flowchart TD accTitle: Producer-to-Consumer Scheduling accDescr: Scheduling multi-cycle multiply before single-cycle add so both complete simultaneously for subtraction. subgraph Cycle0["Cycle 0"] Mul["Multiply (Latency: 3 Cycles)"] end subgraph Cycle1["Cycle 1"] Other["Other Work (Adder Slot Free)"] end subgraph Cycle2["Cycle 2"] Add["Add (Latency: 1 Cycle)"] end subgraph Cycle3["Cycle 3"] Sub["Subtract (Consumes Add and Mul Results)"] end Mul --> Sub Add --> Sub ```
[38:43](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2323s) In-Flight Operations Across Calls
An exposed pipeline raises a subtle design question: what happens if a multi-cycle operation is in flight when a function call occurs? If code issues a signed integer multiply (`mulS`) and immediately calls another function on the next cycle, the multiply's result will become ready while execution is inside the callee.
The hardware does not drop the caller's multiply result into the middle of the callee's belt. Instead, the operation remains bound to the frame in which it was issued. The callee executes to completion, returns, and restores the caller's belt frame. Only then does the in-flight multiply retire into the caller's restored frame:
> “So, the multiply retires in the frame in which it was issued. Intervening calls are like intervening adds. Nothing happened.”
[40:26](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2426s) Interrupts as Involuntary Function Calls
An audience member interrupts with a critical question regarding in-flight operations over a function call: where does an in-flight operation's result go in the meantime? The questioner points out that it cannot remain stuck in the multiplier, or else the system would be ruined. The speaker reassures the audience that the answer is coming right up, explaining that fundamentally the mechanism relies on a hardware component called the "spiller."
Calls on the Mill architecture are atomic, and in-flight operations retire after the called function returns. This exact mechanism provides an elegant, unified way to handle hardware interrupts. On conventional processors, an interrupt requires complex context switching, dedicated shadow registers, or pipeline flushing. On the Mill, an interrupt is handled identically to a normal function call. As the speaker explains:
> “And is on a Mill nothing but a spontaneous function call that you didn't have to code.”
They are simply involuntary function calls. The processor hardware automatically vectors execution to the interrupt service routine's entry point and supplies the interrupt arguments directly onto the handler's belt. Because this follows standard call semantics, there is no duplicated hardware state (such as separate register banks for application and interrupt contexts), no task switch overhead, and no need to flush the pipeline. When the handler completes and returns, execution resumes without any restart penalty.
The only penalty incurred during an interrupt stems from branch prediction. Because the instruction decoder was busily decoding along the application's instruction stream and was not expecting the interruption, the arrival of an interrupt registers as a misprediction. On the Mill, an instruction mispredict costs only four clock cycles plus the top-level cache access time, and that is the entirety of the interrupt delay.
- Interrupts are treated identically to hardware-initiated function calls with arguments deposited directly onto the handler's belt. - No duplicate register sets for supervisor or interrupt modes are required. - No pipeline flushes or task-switch overhead occur on interrupt entry or exit. - Mispredict recovery cost on the Mill is strictly four cycles plus top-level cache access time.
---
[42:17](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2537s) Data Forwarding via a Two-Stage Crossbar
The belt is not implemented in silicon as an enormous, power-hungry shift register. Moving massive quantities of bits physically across silicon on every clock tick would be prohibitively expensive. Instead, internal data forwarding is handled by a two-stage crossbar interconnect. While software engineers often treat physical implementations conceptually, leaving specific multiplexer tree topologies to hardware designers, the underlying hardware model relies on segregating operations by latency.
Results produced by single-cycle operations—such as basic integer adds, shifts, and bitwise logical operations—must reach their consumers immediately to sustain tight back-to-back operational dependencies. To achieve single-cycle throughput without stalling, the Mill features a dedicated single-cycle crossbar linking all single-cycle producers (primarily the ALUs) directly to all potential consumers. This single-cycle path incurs a delay of only one or two multiplexer levels.
Longer-latency units—such as floating-point units and byte/vector shufflers—route through a separate latency-$N$ crossbar. This crossbar narrows down the broad array of multi-cycle operational outputs into two inputs, which are then fed into the latency-1 crossbar to reach execution consumers.
```mermaid flowchart TD accTitle: Two-Stage Crossbar Data Forwarding accDescr: Diagram showing how single-cycle ALU operations feed directly to consumers while multi-cycle units funnel through a latency-N crossbar first.
subgraph Producers ["Execution Units"] ALU["Single-Cycle ALUs<br/>(Adds, Shifts, Bitwise)"] Multi["Multi-Cycle Units<br/>(FPUs, Shufflers, Multipliers)"] end
subgraph Crossbars ["Interconnect Network"] LatN["Latency-N Crossbar<br/>(Windows down to 2 outputs)"] Lat1["Latency-1 Crossbar<br/>(1-2 mux levels)"] end
Consumers["Execution Unit Consumers"]
Multi --> LatN LatN --> Lat1 ALU --> Lat1 Lat1 --> Consumers ```
- System clock timing is defined by the duration of a 32-bit addition plus the traversal through the latency-1 crossbar. - The single-cycle crossbar introduces only one to two levels of mux latency depending on the number of ALUs. - Multi-cycle operations span several internal clock boundaries and borrow a portion of the trailing cycle slack because the latency-$N$ crossbar does not require an entire cycle.
---
[45:31](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2731s) Retiring Operations of Differing Latencies
The Mill instruction encoding specifies exactly one operation per pipeline issue slot per clock cycle. Once issued into a pipeline, an operation matures internally within its functional unit and retires onto the belt an exact number of cycles later matching its specific latency.
To illustrate how varying latencies interact, the speaker traces a sequence issued into a single pipeline across sequential clock cycles: 1. **Cycle 0:** A binary floating-point add (`addB`), which has a 4-cycle latency, issues. Its intermediate state begins advancing through the floating-point pipeline. 2. **Cycle 1:** A signed integer multiply (`mul`), a 3-cycle operation, issues into the integer multiplier unit while the floating-point add continues processing. 3. **Cycle 2:** A vector widening operation (`widenM`), which takes a vector of shorts, converts it into two vectors of 32-bit words, and has a 2-cycle latency, issues into its functional unit. 4. **Cycle 3:** A standard unsigned integer add (`add`), a 1-cycle latency operation, issues into the ALU.
Because each successive operation had a latency exactly one cycle shorter than the operation issued before it, all four operations complete at the very same instant. On Cycle 4, every one of these operations retires to the belt simultaneously.
- Each functional unit maintains its own internal pipeline stages, allowing different units within the same pipeline to advance simultaneously. - Multiple operations issued across consecutive cycles can retire together in the exact same cycle if their latency countdowns align. - An operation can produce multiple retirement outputs simultaneously, such as `widenM` producing two distinct result vectors.
---
[48:13](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=2893s) Output Registers, Daisy-Chaining, and the Spiller
Every functional pipeline contains output registers designated by latency (`lat1`, `lat2`, `lat3`, `lat4`). If an instruction stream executes repeated single-cycle adds back-to-back, the first add moves into the `lat1` register after one cycle. When the next add completes, `lat1` is occupied. However, the `lat2` register is guaranteed to be vacant because the only way `lat2` could contain a value is if a 2-cycle operation had been issued a cycle earlier—which the program did not do.
Consequently, results daisy-chain upward across the latency registers without hazard or collision: the existing value steps up from `lat1` to `lat2`, and the newest result enters `lat1`. This progression continues along the chain as more adds execute. When values must be preserved, hardware only needs to extract data spilling off the end of the highest-latency register (`lat4`).
When the latency registers become entirely saturated, the processor routes the overflowing value off `lat4`. The data may be directed to a vacant register in another pipeline or moved into a dedicated bank of buffer registers managed by the spiller. This answers the audience's earlier question about where values live over function calls: an in-flight multiply that matures over a call shifts down the daisy-chain into the spiller's buffer registers. The spiller moves these values into fast internal SRAM, and, if the call chain runs deep enough, out into DRAM and the broader memory hierarchy, eventually replaying them back into top-level registers upon return.
Hardware implementations can vary—utilizing a register file, implementing the belt as a Content-Addressable Memory (CAM), or applying other circuit topologies—provided there are sufficient latency and buffer registers to match belt positions. Software remains completely agnostic to these physical trade-offs.
---
[52:16](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3136s) Architectural Summary: The In-Order, Exposed Pipeline
The speaker summarizes the core architectural principles that differentiate the Mill from traditional out-of-order processors. The Mill operates strictly in-order: instructions execute in program order, and execution scheduling is handled statically by the compiler rather than dynamically by silicon schedulers. Because the compiler controls issue timing and pipeline latencies are fully exposed, the compiler knows the exact cycle in which every result retires.
General-purpose architectural registers are completely eliminated; transient values live entirely on the temporary belt. Because every belt position adheres strictly to Static Single Assignment (SSA) form, values are immutable and cannot introduce write-after-read (WAR) or write-after-write (WAW) hazards. As a direct consequence, register renaming is completely unnecessary.
Without the overhead of complex hardware renaming, dynamic issue scheduling, and out-of-order retirement, the Mill pipeline is remarkably compact:
> “The Mill has only four, which means that a mispredict is a third of the cost of a mispredict on a different machine.”
While modern superscalar microarchitectures like Intel Haswell feature deep stacks of pipeline stages (and historical designs like Pentium 4 NetBurst reached over thirty stages), the Mill requires only four pipeline stages. Furthermore, because result destinations are implicitly assigned to the front of the belt, instructions omit explicit destination addresses, resulting in dense, compact binary code.
| Architectural Feature | Conventional Modern Out-of-Order (e.g., Haswell) | Mill CPU Architecture | |:--- |:--- |:--- | | **Execution Ordering** | Dynamic, out-of-order hardware scheduling | Static, in-order compiler scheduling | | **Pipeline Latency** | Hidden / dynamic | Fully exposed to the compiler | | **Intermediate Storage** | Named general-purpose register files | Implicit FIFO-like temporal belt | | **Hazard Resolution** | Dynamic register renaming hardware | SSA representation on belt (no renaming) | | **Pipeline Depth** | Deep (14–20+ stages; 30+ on NetBurst) | 4 stages | | **Branch Mispredict Penalty** | High (typically 14–20+ cycles) | 4 cycles plus top-level cache access time | | **Result Addressing** | Explicit destination register encoded in instruction | Implicit push to the head of the belt |
[53:46](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3226s) Function Calls, Argument Passing, and Upcoming Talks
Because the Mill architecture eliminates register specifiers in favor of temporal belt positions, instruction encodings remain exceptionally compact, saving substantial silicon footprint, wire routing, and power within the instruction cache. The architecture naturally handles multi-result operations without awkward register-pairing workarounds. Furthermore, function calls and returns take only a single cycle and a single operation, eliminating the traditional compiler-generated prelude and postlude entirely. Callers can pass up to an entire belt's worth of arguments directly. If a routine requires more parameters than fit on the belt, or if it passes massive structs or variable argument lists (`varargs`), those spill over into memory just as they do on conventional platforms. For the vast majority of software, however, parameters remain entirely on the belt. As Ivan Goddard puts it:
> “Anything you could pass to the registers you can pass to the belt.”
Additional technical resources, white papers, and recorded presentations are hosted on the project website. The team maintains a strictly technical mailing list focused on publishing notifications for upcoming white papers and appearances. Scheduled presentations include upcoming sessions with the IEEE, two presentations at Stanford University, and a planned event at Microsoft, with each talk exploring distinct facets of the architecture. Goddard notes that the immediately following talk will examine the memory hierarchy, detailing how the Mill avoids pipeline stalls—a challenge that historically hobbles statically scheduled machines.
- Calls and returns execute in a single cycle and a single instruction with zero prelude or postlude code. - Argument passing supports up to a full belt capacity; oversized structs and `varargs` fall back to standard memory passing. - Upcoming technical presentations announced for IEEE, Stanford, and Microsoft, including an in-depth session on memory hierarchy design.
---
[55:56](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3356s) Task Switching, OS Protection, and Multithreading vs. Multicore
When asked how the architecture coordinates thread scheduling, process contexts, and operating system state saves, Goddard clarifies that raw hardware has no intrinsic concept of an operating system. The Mill is engineered as a general-purpose processor capable of hosting standard operating systems like Linux and Windows. Task switches function under the exact same mechanics as standard function calls: the operating system executes a call into a context-switch routine, which subsequently returns into the target thread, leaving the hardware spiller to transparently save and restore the underlying belt state.
Addressing security and isolation, Goddard previews the Mill’s unique protection architecture. Rather than relying on hardware protection rings, supervisor modes, or privileged instructions, all system protection is enforced directly through the memory addressing environment:
> “The Mill does not have rings. It has no supervisor mode. There are no privileged operations. All protection is done through the memory addressing environment.”
On the subject of hardware multithreading, Goddard reveals that current Mill chips intentionally omit simultaneous multithreading (SMT). Extensive architectural simulations demonstrated that dedicating chip area and electrical power to additional physical cores yields vastly superior performance compared to multiplexing multiple threads onto a single core. Conventional superscalar designs implement multithreading primarily to keep execution units occupied during high-latency L2 cache misses. Because the Mill’s architecture fundamentally experiences far fewer cache misses and incorporates alternative stall-hiding mechanisms, it avoids the memory latency bottlenecks typical of conventional processors. Goddard notes that while random lookups across massive hash tables exceeding cache size will inevitably run at raw memory speeds on any architecture, the Mill hides typical latencies without the structural baggage of SMT.
```mermaid flowchart TD accTitle: Mill Protection and Thread Model accDescr: Diagram illustrating how the Mill processor relies on memory addressing for protection and favors multicore scaling over hardware multithreading.
subgraph ProtectionModel["Protection Model"] direction TB P1["Uniform Execution Mode"] --> P2["No Rings / No Supervisor Bit"] P2 --> P3["Memory Addressing Capability Enforces Security"] end
subgraph CoreStrategy["Core Allocation Strategy"] direction TB C1["Avoid SMT / Hyperthreading"] --> C2["Eliminate Thread-Switching Overhead"] C2 --> C3["Dedicate Die Area & Power to Multiple Physical Cores"] end ```
- Hardware has no supervisor rings or privileged opcodes; access control is mediated entirely by whether software possesses a valid, usable address. - Simultaneous multithreading is omitted; hardware simulations proved that silicon area and power budgets deliver higher throughput when allocated to additional cores. - SMT on out-of-order chips exists primarily to hide L2 cache miss penalties, which the Mill mitigates through internal pipeline and memory designs.
---
[01:00:39](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3639s) Hardware Implementation: Pipeline Latencies and Associative Belt Tagging
An audience member asks for clarification regarding the relationship between functional pipeline latency stages (latencies one through four) and specific belt positions, inquiring whether the machine relies on an out-of-order core, CAM lookups, or centralized crossbar routing. Goddard emphasizes that the belt is not a monolithic physical shift register, register file, or SRAM block. Instead, discrete pipeline output registers hold values that are explicitly tagged with a frame ID, producing operation ID, and current belt position. When an instruction requests an operand, the consumer functional unit broadcasts a request for a specific frame and belt offset, prompting the matching physical register to provide the data. Belt advancement is accomplished simply by broadcasting an offset update across the tagged registers:
> “The way we advance the belt is we tell all of those registers, ‘Add two to your belt number.’ It’s that easy.”
Addressing crossbar interconnects, Goddard explains that the pipeline employs two daisy-chained crossbars. Time-critical single-cycle operations utilize only the primary latency-one crossbar to meet aggressive clock targets, whereas multi-cycle operations traverse both crossbars in succession. Hardware implementers can realize operand routing in several ways: designers can either implement content-addressable memory (CAM) where matching registers self-identify, or use decode and issue logic to track operand locations statically and drive crossbar multiplexers directly.
```mermaid flowchart LR accTitle: Belt Operand Resolution accDescr: Flow diagram showing how consumer instructions match tagged registers or route through crossbars to obtain operands.
subgraph BeltState["Tagged Registers"] R1["Register A<br/>Frame: 742 | Belt: B3"] R2["Register B<br/>Frame: 742 | Belt: B1"] end
subgraph Query["Consumer Request"] C["Consumer Op<br/>Needs Frame 742, B3"] end
subgraph Interconnect["Routing"] X1["Latency 1 Crossbar<br/>(Clock Critical)"] X2["Latency 2+ Crossbar<br/>(Chained)"] end
C -.->|"Broadcast Target"| R1 R1 -->|"Match Found"| X1 X2 --> X1 ```
- Belt storage does not use a central register file; values sit in pipeline output registers tagged with frame ID, generating operation, and belt index. - Advancing the belt does not shift data physically; the controller commands active registers to increment their belt index tags. - Routing utilizes two daisy-chained crossbars, isolating latency-one operations onto a high-speed routing stage to prevent clock cycle degradation. - Operand matching can be implemented either associatively via CAMs or deterministically via instruction decode tracking logic.
---
[01:02:58](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3778s) Crossbar Contention and Multi-Consumer Data Distribution
In response to questions regarding whether inputs ever compete over crossbar sinks or experience dynamic congestion, Goddard states that input routing is completely deterministic. Each execution pipeline requires two operand inputs, and the compiled instruction bundle specifies the exact belt locations feeding those inputs. Because input requirements are scheduled in advance, structural collisions cannot occur at the sink. Multiple functional units can freely read from the exact same belt location in the same cycle without conflict, mirroring how multiple ALUs in an out-of-order machine can read the same physical source register.
Managing outputs requires ensuring that multi-cycle results do not overwrite older values that must remain accessible to subsequent operations. Goddard explains that pipeline stages move results along daisy-chained intermediate registers within functional pipelines until they reach their final retirement latency, after which they migrate into staging buffers. When asked if the architecture relies on multi-ported SRAM—particularly for managing wide execution configurations where 30 parallel operations might simultaneously read from a single belt position (creating up to 60 concurrent reads)—Goddard clarifies that the core avoids complex multi-ported SRAM arrays. Instead, broadcast values drive functional units directly from flip-flop registers, while the background memory spiller relies on standard single-ported SRAM banks. Goddard highlights the extreme fan-out requirement handled by the design:
> “It is required that a single belt position be able to feed data to every possible consumer of of a particular cycle.”
- Instruction streams explicitly dictate operand origins, preventing input port collisions and eliminating runtime routing contention. - A wide 30-wide instruction packet with two inputs per operation represents up to 60 concurrent operand reads from the belt in a single clock cycle. - Extreme fan-out scenarios (all units reading the same belt position) are sourced directly from dedicated flip-flop register outputs rather than heavily ported SRAM arrays. - Backing buffers and spiller hardware rely on efficient, single-ported SRAM structures rather than costly multi-ported storage.
[01:05:45](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3945s) Compiler Simplicity and Time-Reversed Scheduling
An audience member asks what a compiler targeting the Mill architecture must optimize compared to compilers targeting conventional superscalar processors. Ivan Godard answers from the perspective of an industry veteran who has written nearly a dozen compilers over his career. He notes that chip architects often pass the buck by claiming the compiler will work out all the difficult hardware complexities, leaving the hardest optimization problems as an afterthought. Determining to avoid that trap, the Mill team designed the machine to be fundamentally "compiler-easy," stripping away the need for exotic target-specific heuristics. Beyond standard machine-independent optimizations like constant folding—which Mill is handling by integrating with LLVM—the backend pipeline requires very little optimization.
When generating code specifically for the belt, the compiler's primary job is simply scheduling producers so that their retiring outputs align directly with when downstream consumers need them. Ivan explains that the Mill achieves this by borrowing a proven 40-year-old technique widely used in signal processing compilers: scheduling in reverse time order. The compiler examines the final consumer—such as a function return—schedules it, and then steps backward along the dataflow graph, scheduling each preceding producer according to its pipeline latency. Because the hardware offers a single, predictable way to execute each operation rather than a tangled web of specialized processor states, the compiler does not need complex case-selection logic.
“I've had much bitter experience of people who design chips and say, 'Well, the magic's in the compiler.' And they push that off until the last,” Ivan remarks, drawing knowing chuckles from compiler engineers in the room.
```mermaid flowchart TD accTitle: Time-Reversed Instruction Scheduling accDescr: Dataflow pipeline scheduled in reverse order from terminal consumer back to producers. subgraph Sched ["Reverse Time Scheduling"] direction TB Ret["1. Schedule Terminal Consumer (e.g. Return)"] Pred1["2. Step Back Latency Cycles: Schedule Immediate Producer"] Pred2["3. Step Back Latency Cycles: Schedule Source Operands"] Ret --> Pred1 Pred1 --> Pred2 end ```
[01:08:41](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4121s) Simulator Status, Toolchain Maturity, and Startup Constraints
Responding to an audience question about the public availability of the Mill compiler and architectural simulator, Ivan provides a frank assessment of where the project stands. While the architecture has been running inside an internal software simulator for several years, the surrounding toolchain remains what he politely calls "alpha grade." As a small, self-funded bootstrap startup, Mill Computing has focused strictly on the novel architectural components necessary to validate the design. Major functional blocks that are standard industry commodities—such as standard IEEE floating-point units—have not even been built internally because the company plans to license proven third-party IP rather than reinvent existing technology.
Public distribution of the simulator and tools is currently blocked by resource constraints, as supporting general public users would overwhelm their small engineering team. However, Ivan indicates that the company is open to making arrangements with qualified, self-supporting individuals or organizations who can sign non-disclosure agreements, with the caveat that any intellectual property developed around the architecture must belong to Mill Computing.
“In order to let the public play with it, we would have to be able to support the public,” Ivan admits. “And we haven't got the resources.”
- The Mill simulator has been actively running internal workloads for several years. - The software toolchain is operational for core validation but remains in an early alpha state. - Floating-point and other commodity logic blocks will be acquired as third-party IP rather than designed in-house. - Access is restricted to self-supporting partners under NDAs while the team seeks funding to expand support capabilities.
[01:10:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4228s) Belt Operand Uniformity: Vectors, Scalars, and Unified Types
An attendee asks whether supporting short vectors implies that individual slots on the belt can hold different operand widths, and whether differing widths restrict which functional units or instructions can consume them. Ivan confirms that each belt position is completely width- and type-agnostic. A slot can hold a single byte, a double word, a quad word, or a packed vector of half-words; every slot simply holds an operand.
Conventional processor architectures typically segregate values into distinct physical register files—such as separate register banks for integer, scalar floating-point, and SIMD/vector operations—primarily to reduce the excessive wire and port count of a massive unified register file. Ivan points out that partitioning register files introduces immense friction into compilers and hardware alike, forcing costly and awkward cross-bank moves whenever code performs operations like converting a floating-point number into an integer. The Mill avoids this entire class of problems by allowing any belt instruction to consume any operand slot regardless of its underlying format.
“The belt holds an operand, any kind of operand the machine supports,” Ivan emphasizes.
[01:11:50](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4310s) Variable Latency, Cache Misses, and Memory Timing
When asked how an in-order machine with a belt handles variable-latency operations—such as data cache hits versus misses—Ivan notes that while the exact internal mechanics of the memory hierarchy are reserved for an upcoming talk pending patent filings, he can explain the programming model's guarantees. Despite executing strictly in-order without the massive hardware reorder buffers found in out-of-order processors, the Mill architecture successfully hides the operational latency of L1 and L2 caches completely.
Furthermore, Ivan explains that the Mill can hide main DRAM latency in the exact same application profiles where an out-of-order superscalar processor could hide it. An audience member asks if this means the machine stalls on memory delays, but Ivan flatly rejects that characterization. While neither an out-of-order core nor the Mill can hide memory latency during truly unpredictable memory traversals—such as pointer chasing or random accesses across a hash table—the Mill matches out-of-order tolerance for predictable patterns while completely eliminating out-of-order hardware overhead.
“We succeed in hiding the latency of both levels of cache and can hide the latency of DRAM in those cases in which an out-of-order machine could hide the latency of DRAM,” Ivan asserts.
[01:13:47](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4427s) Patent Law Changes, Stealth Mode, and the Disclosure Schedule
Asked when Mill Computing will publish an official instruction set manual, Ivan explains that publishing the raw instruction set would prematurely disclose proprietary mechanisms whose patents are still in flight. He recounts how the company operated in complete stealth mode until September 2012, when changes to United States patent law—specifically the transition from a "first-to-invent" to a "first-to-file" system under the America Invents Act—forced an abrupt pivot. The shift made prolonged secrecy dangerous, prompting the team to rapidly write and submit over fifty distinct patent applications.
Ivan vents about the grueling effort required to document these innovations legally while simultaneously preparing deep-dive technical talks, noting that the team aims to unveil a new functional area of the machine approximately once a month. When another audience member asks if memory loads require a dedicated spill buffer to manage asynchronous arrival times, Ivan clarifies that loads behave just like any other functional operation: their results drop straight into the front of the belt, and their arrival timing is fully known and deterministically coordinated.
“With the change from first to invent to first to file, we were in a situation where, guys, we can't keep on being in stealth mode,” Ivan explains. “We are going to have to file these and now.”
- Over fifty patents have been drafted and filed by the Mill Computing team. - Public technical presentations began after an initial presentation at the USENIX conference in Vail, Colorado in June 2013. - Memory loads drop directly into the front belt position (slot 0) on arrival, behaving identically to computational functional unit results.
[01:16:05](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4565s) Binary Compatibility Across Processor Families: The AS/400 Approach
The session concludes with an audience member addressing the trade-offs of static scheduling across a diverse hardware family. If different Mill models feature varying belt capacities, pipeline depths, and functional unit counts, does every model require a completely different, recompiled binary? Ivan explains that the Mill solves this problem using the battle-tested deployment model pioneered by IBM for the System/38 and AS/400 lines, which has preserved software compatibility across four decades of radical hardware evolution.
Instead of shipping low-level hardware bit patterns directly to users, Mill software is distributed in an abstract, platform-independent intermediate representation. When a software package is installed onto a specific target device, an install-time specialization tool translates the abstract representation into the native machine code optimized for that exact processor configuration—its specific belt length, functional unit count, and execution latencies. Consequently, different chips within the Mill family remain entirely incompatible at the raw machine-instruction bit level, yet retain complete application-level portability across the entire ecosystem.
“Consequently, the individual family members at the bit level are incompatible in terms of their instructions,” Ivan explains, emphasizing that portability lives in the intermediate representation rather than an immutable legacy machine code.
[01:17:02](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4622s) Target Workloads, Peak vs. Sustained IPC, and the Gold Configuration
An audience member asks about expected performance: with 33 functional units operating in parallel, what kind of effective instruction count or instructions per cycle (IPC) does the architecture achieve across different application types? The speaker clarifies that the "Gold" configuration shown in the presentation is not designed to be an HPC (high-performance computing) chip. Instead, Gold targets general-purpose server workloads—the kind of compute infrastructure Google runs in its data centers. Because of this target, Gold offers numerous operation slots to exploit parallelism, but its vector width is modest; it includes only two floating-point units. By contrast, a high-performance compute variant intended for scientific institutions like NASA would provide eight floating-point units and process 128 bytes at a time. Performance characteristics will therefore vary substantially across different members of the Mill family depending on hardware specialization.
```mermaid flowchart LR accTitle: Mill Family Configuration Comparison accDescr: Comparing the Mill Gold server chip with an HPC chip variant. subgraph Gold["Mill Gold (Server Target)"] G1["Target: Web & Enterprise Servers"] G2["High slot count (33-issue peak)"] G3["2 Floating-Point Units"] G4["Moderate vector width"] end subgraph HPC["HPC Variant (Scientific/NASA)"] H1["Target: High-Performance Computing"] H2["8 Floating-Point Units"] H3["128-byte vector paths"] end ```
When pressed on typical server benchmarks like SPEC CPU, the speaker points out that discussing performance outside actual customer code runs often comes down to peak numbers. “That Gold can issue 33 operations per cycle sustained. But that is peak. That's not simulated performance. It can do this.” He emphasizes that hardware width delivers high performance only when the compiler can pipeline the loop bodies. If code has serial data dependencies where step B strictly requires step A, the Mill must execute operations one at a time, just like any conventional machine. “The width is intended for pipelining. Because 80% of code is pipelined.”
- **Mill Gold specification:** Server-oriented design with 33 operation slots peak issue per cycle and two FPUs. - **Mill HPC specification:** Scientific variant with eight FPUs and 128-byte vector paths. - **Serial code behavior:** Code with strict sequential dependencies falls back to executing single operations sequentially, meaning wide issue capability offers no benefit unless loops are pipelined.
---
[01:19:28](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4768s) Pipelining in Action: The Unix `wc` Optimization Example
To illustrate how software pipelining exploits the architecture's wide execution engine, the speaker references an assembly optimization contest centered around the classic Unix `wc` (word count) utility. Standard naive implementations of `wc` read an input character and dispatch it through a `switch` statement checking whether it is whitespace, a newline, or ordinary text. On modern pipelines, this approach incurs devastating branch mispredictions. On the Mill, the compiler transforms the sparse `switch` statement into a chain of `if` statements and then applies `if-conversion`. This converts conditional control flow directly into a data-flow graph using conditional operations (analogous to conditional moves on x86), eliminating internal branches entirely except for the single loop branch.
Once the control-flow branches are eliminated, all switch outcomes evaluate concurrently. For modern `wc` implementations—which track not just character, word, and line counts, but also the length of the longest line—the entire loop body compiles down to 25 operations. On the Gold chip, those 25 operations execute simultaneously in a single cycle. The Mill can therefore ingest and process one full character per cycle out of the input stream. This dramatic throughput is achieved purely through software pipelining and data-flow conversion mapped across the machine's functional units.
---
[01:22:43](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4963s) Absence of Condition Codes and Global Architectural State
When asked whether the Mill architecture features condition codes, the speaker responds with an emphatic negative. “The machine maintains no global state at all. No global application state like the condition codes have.” In traditional architectures, condition flags create hidden dependencies across instructions and complicate out-of-order execution, register renaming, and pipeline speculative state. On the Mill, comparison results and conditional operations do not set side-channel flags; instead, all comparison outputs produce standard values that are placed directly onto the belt as regular data items.
---
[01:23:18](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=4998s) Stack Inspection, Garbage Collection, and the Spiller Debugging API
An attendee raises the challenge of runtime stack inspection for garbage collectors, language runtimes, and profilers. On conventional register architectures, inspecting stack frames and register state is well-understood, whereas hardware that hides activation state behind specialized mechanisms (such as register windows on SPARC) can incur severe runtime penalties when forcing that state into memory. The questioner asks if a garbage collector on the Mill must spill all belt state to main memory to perform a root scan.
```mermaid flowchart TD accTitle: Debugger and GC Stack Inspection Path accDescr: How debuggers and garbage collectors access state buffered in the hardware spiller. A["Active Frame on Belt"] --> B["Nested Function Call"] B --> C["Caller State Pushed to Hardware Spiller SRAM"] C --> D{"Debugger / GC Inspection Request"} D --> E["Spiller API Accesses Internal SRAM"] E --> F["State Flushed to Memory Lazily / on Demand"] F --> G["Garbage Collector Scans Standard Memory"] ```
The speaker explains that conventional garbage collectors already implement special cases for CPU registers, and an engine on the Mill would similarly handle the belt. For deeper stack frames beneath the current function, state is managed automatically by the hardware spiller. When deep nested calls are made, parent frames migrate into the spiller's internal SRAM. The Mill provides a dedicated hardware access mechanism and an API specifically designed for debuggers to walk and inspect non-top frames:
- **Debugger/GC API:** Exposes hardware hooks to read frame data directly from the spiller. - **Cost:** Inspecting frames through this API merely requires accessing memory. - **Flushing Behavior:** While accessing the API forces the spiller's internal SRAM to flush, that flush normally occurs lazily through the regular overhead of invoking the debugging or profiling infrastructure itself. - **SPARC comparison:** The attendee observes that on SPARC, window flushing makes GC activation significantly slower than on flat register files, but the speaker confirms that once the spiller memory is addressed, memory scanning proceeds in standard linear memory without exotic penalties.
---
[01:25:57](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=5157s) Concluding Remarks and Upcoming Presentations
Noting the time has passed 9:00 PM, the speaker checks whether the audience wants to continue or wrap up, joking that he would happily talk about his "baby" all night. Seeing the signal from event organizers to conclude, he closes the session and thanks the audience for attending.
During the sign-off, an attendee asks about the location of the upcoming memory subsystem talk and whether it will take place at Stanford. The speaker clarifies that their next Stanford appearances are scheduled for October and February. For details on upcoming talks and locations outside Stanford, he directs attendees to sign up for the company's mailing list on the Mill Computing website.
## Notable quotes > [55:56](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=3356s) The Mill does not have rings. It has no supervisor mode. There are no privileged operations. All protection is done through the memory addressing environment. — Ivan Godard
> [03:12](https://www.youtube.com/watch?v=QGw-cy0ylCc&t=192s) Signal processing is just not the same as general purpose code. — Ivan Godard
## Mentioned America Invents Act, AS/400, Google, IBM, IBM System/360, IEEE, Intel Haswell, Intel Itanium, Ivan Godard, Linux, LLVM, Microsoft, Mill Computing, Inc., Mill Gold, NASA, Pentium 4 NetBurst, SPARC, SPEC CPU, Stanford University, System/38, Unix wc, USENIX, Windows, Yale Patt
## Video description Please share via this link: http://MillComputing.com/docs/belt/
00:00:00 01 The Belt - a new machine model 00:00:37 02 Two architectures 00:03:12 05 Why huge cost in both power and price? 00:04:31 06 Our result - rough numbers 00:06:33 09 33 MIMD operations per cycle peak 00:07:24 10 33 operations per cycle peak ??? Why? 00:09:59 11 33 operations per cycle peak ??? How? 00:11:20 13 The problem - lots of producers and consumers 00:13:05 17 The cost - and performance limit 00:15:34 23 Why renames? 00:18:28 26 What are the temps used for? 00:19:12 27 Split the uses 00:20:33 29 What you really want... 00:20:55 30 We call it the Belt - like a conveyer belt 00:21:50 32 Multiple operation issue 00:21:58 33 Multiple operation retire 00:22:12 34 Belt addressing - temporal addressing 00:23:56 36 Use it or lose it 00:25:18 37 The scratchpad 00:27:12 38 Single operation with multiple results 00:28:24 39 Function calls 00:30:46 40 Belt save/restore 00:33:36 42 Functional unit pipelines - 64 sources vs 450 00:35:00 43 Wide issue 00:35:48 44 Exposed pipeline 00:38:43 47 In-flight over call 00:40:40 49 Interrupts, traps and faults 00:42:16 50 Data forwarding 00:44:31 51 Belt timing 00:45:30 52 Retiring ops of different latencies 00:48:12 54 Belt data location 00:52:16 57 Summary 00:54:32 60 Want more? 00:55:55 Questions 01:26:22 end 01:26:49 fin
[Source](https://www.youtube.com/watch?v=QGw-cy0ylCc)