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