OPEN-SOURCE RTL · NO PAID EDA TOOLS

A chip that does
one thing, extremely fast.

TPE is a small AI accelerator, designed the way a real chip team builds one: hardware description, a C++ reference model, and a verification harness that tries — and catches itself — 7 real bugs on purpose. It multiplies matrices, the operation underneath almost every neural network, using 256 tiny calculators wired together so they all work at once.

256
multiply-add units
7
blocks on chip
7
bugs caught on purpose
224
tests in final proof run
FOR EVERYONE, NOT JUST CHIP ENGINEERS

What does it actually compute?

Almost everything a neural network does — recognizing an image, predicting the next word — boils down to multiplying big grids of numbers together, over and over. A general-purpose CPU does this one number at a time. TPE does it differently.

Weights & activations

Weights are the numbers a trained model learned. Activations are the input flowing through it. Multiplying these two grids of numbers together is the single most repeated operation in AI — this chip exists to do that one operation as fast and efficiently as possible.

256 calculators, one grid

Instead of one fast calculator, TPE arranges 256 small ones in a 16×16 grid — a systolic array. Numbers enter from the edges and pass from neighbor to neighbor in lockstep, like a stadium crowd doing a wave, each one doing a tiny multiply-and-add as the wave passes through.

→▦→

Move data once, reuse it often

Fetching data from memory is slower and more power-hungry than doing math on it. TPE loads a tile of weights into on-chip memory once, then streams activations through it repeatedly — the same idea real accelerators use to stay fast without burning power shuttling data back and forth.

BLOCK DIAGRAM

Here's the whole trip, start to finish

One command — multiply two matrices and store the result — passes through five stages, always in this order. Read it left to right below, or press play to watch it happen.

↳ Click any card for what it does, or press Animate it to watch the command move.

→ → → →
PMU + Debug — counting cycles and recording every one of these steps, the whole time.
IDLE

Click any card above, or press Animate it to see this sequence run.

WHY TRUST A GRID OF WIRES

Verified the way real chip teams do it

Writing hardware is easy to get subtly wrong — off-by-one row counts, a bit flipped in the wrong direction, a timing race that only shows up once in a hundred runs. So this project ships with seven real bugs, injected on purpose, and a test suite built specifically to catch every one of them. If the tests ever stopped catching a bug, that itself would be the red flag.

#1

Systolic row off-by-one

One extra row of the compute grid silently joins the sum when a tile doesn't use the full array.

caught by → random matrix-size testing
#2

Misaligned accumulator seed

Feeding a partial result back in picks up the wrong column's carried-over value.

caught by → nonzero accumulator testing
#3

Asymmetric overflow clamp

A result that overflows negative wraps around instead of saturating, while positive overflow works fine.

caught by → directed overflow test
#4

Dropped final DMA burst

A transfer whose last chunk is exactly one unit long silently never gets written.

caught by → multi-burst boundary test
#5

Full-width tile rejected

A matmul that exactly fills the compute grid is wrongly flagged as out of range.

caught by → exact-boundary test
#6

Coupled interrupt flags

Clearing one interrupt bit accidentally clears an unrelated one alongside it.

caught by → independent-clear test
#7

Off-by-one cycle counter

The performance monitor undercounts every command's latency by exactly one clock cycle.

caught by → hand-derived latency test
224
test invocations in the final regression pass — zero infrastructure errors
100%
free & open-source toolchain — no paid EDA licenses anywhere
4
test tiers — sanity, smoke, 100-test daily, 100-test random regression
VerilatorIcarus VerilogGTKWave cocotbpyuvmcocotb-coverage SystemVerilog AssertionsC++17 golden model
FOR THE ENGINEERS

Spec sheet

ParameterValue
Compute array16 × 16 weight-stationary systolic array — 256 INT8 multiply-accumulate units
Numeric formatINT8 operands, INT32 accumulator (saturating)
Max tile size256 × 256 × 256 per matmul instruction
On-chip scratchpad64 KB (4096 × 128-bit rows), dual-port
Host interfaceAXI4-Lite MMIO, 16-bit address / 32-bit data
Memory interfaceAXI4, 128-bit data bus, burst-capable DMA
On-chip blocksCommand Processor · Scheduler · DMA Engine · Local SRAM · Matrix Compute Engine · PMU · Debug trace
Verification methodologycocotb + pyuvm (class-based, UVM-equivalent) · SystemVerilog Assertions · line/toggle/branch + functional/FSM coverage
Reference modelC++17 golden model, cross-checked against RTL every test
License / costFully open-source toolchain — Verilator, Icarus Verilog, GTKWave, cocotb, pyuvm