JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

Wiring It All Together: Networks-on-Chip and Dataflow

You spent rungs 4 and 5 learning how to build fast cores and clever accelerator tiles. But a chip full of brilliant blocks that cannot talk to each other is just an expensive paperweight. This rung is about the **wires between the blocks** — why the humble bus collapsed under its own weight, how engineers borrowed the idea of the internet and shrank it onto silicon, and why the most radical AI chips throw away the program counter entirely and let **data itself** decide what runs next.

When the bus runs out of road

Picture a small town with one main street. Two shops, a school, a town hall — one road connects them all and everybody shares it. That is a bus: a single set of wires that every block on the chip taps into. For decades it was perfect. With two or three masters fighting for the road, an arbiter waves one through at a time and life is good. But now zoom out to a modern multicore processor with 64 cores, a clutch of AI accelerators, memory controllers, and I/O — all on one street. The road is jammed, and worse, the street keeps getting *longer*.

A bus has three diseases that all get worse with size. First, arbitration: only one transaction at a time, so bandwidth is shared, not multiplied — add cores and each one gets a thinner slice. Second, capacitance: every block hangs off the same wire, so the line gets electrically heavier as you add taps, which slows the maximum clock. Third, length: a wire that must physically reach all corners of a 600 mm² die is long, and at advanced nodes long wires are slow, power-hungry, and a nightmare to time. This is the chip-scale face of interconnect scaling: transistors got faster every node, but wires did not — they got *relatively* worse.

Shrinking the internet onto silicon

The internet solved the exact same problem at city scale: how do millions of computers talk without one giant shared cable? The answer was packet switching — chop messages into addressed packets and let a fabric of small routers pass them hop by hop. Around 2000, researchers asked the obvious question: why not do this *on the chip*? The result is the network-on-chip (NoC). Each block — a core, a cache slice, an accelerator — connects to a tiny router, and routers connect only to their neighbors. To send data you wrap it in a packet, hand it to your local router, and the network ferries it across, one short hop at a time.

Notice the payoff. Wires are now short and local — router to router, not corner to corner — so they stay fast at advanced nodes. Bandwidth adds up: many packets travel on different links at the same instant, so capacity scales with the number of links, not divided among masters. And the whole thing is modular: to grow the chip you drop in more tiles and the network grows with them. The bus's three diseases — arbitration, capacitance, length — are cured in one move, by refusing to share one wire and instead sharing a *fabric*.

A 3x3 mesh NoC.  R = router, C = compute/cache/accel tile.
Each R links only to its N/S/E/W neighbors -> all wires are SHORT.

   C---C---C
   |   |   |
   R---R---R     A packet from the top-left tile to the
   |   |   |     bottom-right tile takes 4 hops, e.g.
   R---R---R       (0,0) -> E -> (1,0) -> E -> (2,0)
   |   |   |              -> S -> (2,1) -> S -> (2,2)
   R---R---R     'X-then-Y' (dimension-order) routing:
   |   |   |     go east until aligned, then go south.
   C---C---C     Simple, and provably deadlock-free.
A 2D mesh, the workhorse NoC topology. Short neighbor-only links and dimension-order routing keep it simple and scalable.

Topology, routing, and the deadlock you must avoid

Topology is the floor plan of the network — how routers connect. The 2D mesh is the favorite: it maps cleanly onto a rectangular die, every link is the same short length, and it is easy to lay out. Its weakness is the corners — a packet crossing an 8×8 mesh diagonally needs up to 14 hops. A torus fixes this by wrapping the edges around, like a Pac-Man screen, halving the worst-case distance — but those wrap-around links are physically long, partly undoing the win. Other shapes (ring, fat-tree, crossbar) trade area, latency, and bandwidth differently; the right pick depends on the traffic.

Routing is the rule each router uses to pick the next hop. The simplest, dimension-order (X-Y) routing, says: travel east/west until your column matches, then travel north/south. It is deterministic and — crucially — provably free of deadlock, the NoC engineer's recurring nightmare. Deadlock happens when packet A holds a buffer and waits for B's, while B holds a buffer and waits for A's — a circular standoff where nothing moves, forever. Adaptive routing can dodge congestion by taking detours, but it must be carefully restricted (or given extra virtual channels) so it never creates such a cycle.

  1. Inject: the source tile builds a packet, splits it into flits, and hands the head flit to its local router.
  2. Route: each router computes the output port from the destination address (e.g. X first, then Y) and requests that port.
  3. Allocate: the router's arbiter grants the output port and a buffer slot (virtual channel) to one of the contending flits.
  4. Traverse: the flit crosses the router's internal crossbar and the link to the next router; back-pressure stalls it if the next buffer is full.
  5. Eject: at the destination router the tail flit drains out and the packet is reassembled at the receiving tile.

Off the die, onto the package: chiplets and UCIe

Here is the modern plot twist. As single dies grew past ~600 mm² they hit the reticle limit — the largest area one lithography exposure can print — and yield fell off a cliff, because one fatal defect kills an entire giant die. The industry's answer: stop building one huge chip. Cut it into several smaller chiplets, each made on the process node that suits it, and stitch them back together on a package. A big CPU's compute dies, its I/O die, and its memory stacks can each be a separate, individually-tested chiplet. This is heterogeneous integration, and it has quietly become the default for high-end silicon.

But now the network has to leave the die. The NoC that linked tiles inside one chip must extend across the package to link tiles on *different* chiplets. For years each vendor had a private die-to-die protocol, so you could only mix chiplets from one company. UCIe (Universal Chiplet Interconnect Express) is the open standard fixing that — a common physical and protocol layer so a chiplet from vendor A can plug into a package from vendor B, like USB for the inside of a package. The dream is a true marketplace of interoperable chiplets, with the on-package interconnect as the great equalizer.

When data, not a counter, decides what runs

Everything so far assumed a control-flow machine — the model in every CPU you have met. There is a single program counter that marches through instructions in order: fetch instruction 1, do it, fetch instruction 2, do it. Even with multicore and out-of-order tricks, the mental model is *a list of commands executed in a sequence dictated by the counter*. Data is something the instructions reach out and grab. The counter is the boss.

The dataflow architecture turns this on its head. There is no program counter. Instead, the program is a graph: nodes are operations, and the edges show which result feeds which next operation. An operation fires the instant all of its input operands have arrived — not when a counter reaches it. If two operations have all their inputs ready, they both fire at once, with no scheduler telling them to. Parallelism is not something you bolt on; it is the natural state, automatically exposed wherever the data dependencies allow.

Compute  d = (a + b) * (a - c)

CONTROL FLOW (a CPU):           DATAFLOW (fire on operands):
  t1 = a + b   ; step 1            (a)__   __(b)      (a)__   __(c)
  t2 = a - c   ; step 2               \ /                 \ /
  d  = t1 * t2 ; step 3              [ + ]               [ - ]
  PC walks 1 -> 2 -> 3                  \____   t1   ____/
  (3 sequential steps,                      \        /
   even though + and -                       [  *  ]   <- fires only
   are independent!)                            |         when BOTH
                                               (d)        t1 AND t2
                                                          have arrived
  '+' and '-' have no data dependence, so dataflow runs them
  AT THE SAME TIME with no scheduler. The '*' waits for both.
Same arithmetic, two world-views. Control flow forces an order; dataflow lets independent operations fire in parallel the moment their operands land.

Why does this matter for AI? A neural network *is* a dataflow graph — a fixed mesh of multiply-accumulates where every result is the input to the next layer, with enormous, regular parallelism and almost no data-dependent branching. That is the worst case for a control-flow CPU (which excels at branchy, irregular code) and the *best* case for dataflow hardware. Modern AI accelerators lean hard into this: a grid of processing elements where, instead of fetching instructions, each cell waits for operands to flow in from its neighbors, computes, and passes results onward. The systolic array you met in rung 5 is essentially a hard-wired dataflow engine, and a NoC is what feeds operands to and from these tiles.

From blocks to a whole chip — and the tools to build it

Step back and see the shape of the journey. Rungs 1–3 taught you how a single block computes. Rungs 4–5 multiplied those blocks into cores and accelerator tiles. This rung gave you the connective tissue: a NoC to move data between tiles on a die, UCIe links to move it between chiplets on a package, and the dataflow model that decides *what* moves *when* on the most specialized engines. A chip is no longer one design; it is a composition — a system assembled from tiles and the network that binds them.

And here is the cliffhanger for rung 7. A 64-tile mesh has thousands of routers, hundreds of thousands of wires, and timing that must close across an enormous die and across chiplet boundaries. No human draws this by hand. Placing the tiles, routing the network, balancing the clock, checking every timing path, and signing off that it will actually work at speed — all of it is done by EDA (electronic design automation): the staggering software pipeline that turns an architecture like the one you just learned into a manufacturable mask set. That pipeline is where we go next.