smallcore

Physical results

Measured numbers from the Tiny Tapeout IHP CMOS5L flow in asic/janestreet/, one row per RTL milestone. Architectural tradeoffs get decided against this table, not by estimate.

Milestones

Milestone Synth cells Routed cells Cell area Util. Setup slack Hold slack Date
RTL-0 control (pc, delay counter, decode, stall) 161 209 2642 µm² 0.29% +12.2 ns +0.12 ns 2026-09-25
+ SET/GPIO –
+ CONFIG –
+ SHIFT –
+ WAIT/JMP/SKIP –
+ FIFO interface –
+ FIFO storage (top: core + TX/RX FIFOs, DEPTH 4), Baseline v1 695 991 16,571 µm² 1.84% +10.86 ns +0.14 ns 2026-09-26
+ program memory/interface (smallcore: host + ROM + top, real pinout), Peripheral v1 1,010 1,334 20,249 µm² 2.24% +10.15 ns +0.11 ns 2026-09-27
+ REPEAT, run test, accumulator; ROM slots 12..15, Protocol Engine v2 1,894 2,403 31,759 µm² 3.52% +7.20 ns +0.11 ns 2026-09-28
+ writable program RAM (256 × 16 in flops) and loader, final 23,330 31,816 499,646 µm² 55.37% +1.10 ns +0.14 ns 2026-09-29

Columns, all from runs/wokwi/final/metrics.csv unless noted:

Every hardened row so far also had zero routing DRC errors, zero Magic DRC errors, zero antenna violations and zero LVS errors; a row that does not will say so.

Synthesis breakdown

Where the cells go, one row per milestone, appended as they land. Yosys + abc against the typ lib, no place and route, so a row takes seconds; the flow column is the Milestones table’s synth cells.

Milestone Core cells Core area Core flops FIFO cells FIFO area FIFO flops Top cells Top area Flow synth cells Flow synth area Commit Date
RTL-0 control 98 1,517 µm² 14 – – – 98 1,517 µm² 161 – – 2026-09-25
+ FIFO storage (2 × DEPTH 4) 310 4,380 µm² 39 257 6,630 µm² 82 567 11,010 µm² 695 11,948 µm² f795664 2026-09-26
+ program memory/interface (smallcore: host + ROM + top) 312 4,420 µm² 39 236 6,608 µm² 82 548 11,028 µm² 1,010 15,372 µm² 132fe20 2026-09-27
+ REPEAT, run test, accumulator; ROM slots 12..15 (Protocol Engine v2) 719 9,772 µm² 76 246 6,530 µm² 82 965 16,302 µm² 1,894 25,268 µm² 85d9380 2026-09-28
+ writable program RAM (256 × 16 in flops) and loader 688 9,494 µm² 76 289 6,541 µm² 82 977 16,035 µm² 23,330 391,653 µm² 8842436 2026-09-29

To add a row: from asic/janestreet/, run make synth-breakdown. It prints cells, area and flops for core, top and the wrapper; subtract core from top for the FIFO columns. Take the flow columns from the harden, and put anything surprising in that milestone’s notes section.

RTL-0 notes

FIFO storage notes

Commit f795664: rtl/top.v with the complete ISA core, a TX FIFO and an RX FIFO, both DEPTH 4, end-to-end UART TX and RX passing in tests/rtl/top_tb.py. The rows from SET/GPIO to FIFO interface were not hardened on their own; this row is the first measurement after RTL-0 and covers all of them.

Program memory/interface notes

Commit 132fe20: rtl/smallcore.v, the chip: host.v (a four-register bus, strobes synchronized and edge-detected, a program select that restarts the core), rom.v (all eleven programs, 272 words, generated from programs/manifest.txt, looked up by {sel, addr}) and top.v with a core-only restart and halted out. The Tiny Tapeout wrapper has its real pinout: ui write data, uo read data, uio[7:4] address and strobes as inputs, uio[3:0] the four protocol pads, bidirectional. This is Peripheral v1, tag v1.1.

Protocol Engine v2 notes

Commit 85d9380: the core with REPEAT (cd91c7c), the run test, SKIP_RUN and SKIP_NORUN (f4c205f), and the accumulator, a second stream register with optional LFSR feedback (543f55d); and the ROM’s last four slots taken so the chip carries programs that use them: 12 the SWD read in REPEAT form, 13 CAN stage 6A (the whole data frame, stuffing by the run test, the CRC in the accumulator, 8 clocks a bit), 14 the CAN receiver with the CRC in the core, 15 the destuffing receiver on the accumulator. Every instruction the ISA has is in the ROM but SKIP_RUN, which no program uses (tests/model/test_rom_slots.py).

Writable program memory notes

Commit 8842436 stages ef7fdd4 into the package: rtl/ram.v, 256 words × 16 bits, synchronous write and combinational read, no reset; host.v gains a loader (CONTROL 0x20 enters load mode, TX_DATA bytes pair low then high into one RAM write per word, CONTROL 0x10 runs the RAM), and smallcore.v muxes the fetch word and program length between ROM and RAM. The core, FIFOs and ROM are unchanged since v2.

Unit costs, typ lib

Per-cell areas from the mapped netlist, for reading deltas: a reset flop dfrbpq_1 is 49.0 µm², mux2_1 18.1, mux4_1 38.1, nand2_1 7.3, inv_1 5.4. So a plain 8-bit register is about 390 µm² of flops before its muxing, and a FIFO’s storage scales at about 49 µm² per bit plus pointers and the read mux. Measure anyway; abc does not always map the way the arithmetic suggests.

Flow

Same versions as tt-gds-action@ihp-cmos5l on 2026-09-25: ttihp-verilog-template cmos5l, tt-support-tools ihp-sg13cmos5l, LibreLane 3.1.0.dev3 in Docker, IHP-Open-PDK 2bbec755, sg13cmos5l_stdcell_typ_1p20V_25C.lib. The 6x4 run takes about 50 minutes on this machine, most of it Magic DRC over the fill. make synth takes seconds and tracks the synth-cells column; use it while iterating and run make harden at each milestone.

cd asic/janestreet
make synth      # yosys, core alone
make harden     # full flow, runs/wokwi/
make stats      # utilization, cell categories, warnings