journal 2026-04-28

P03 and P04 hardened, four projects on the board

project-03project-04hardenedsignoffnarrative

Long session. Four projects on the ladder now — the first two as of this morning, two more by tonight.

P03 hardening

Failed first try because of a comment-syntax mismatch in pin_order.cfg. The LibreLane ioplace_parser only knows three token prefixes — # for direction (#N/#E/#S/#W/#BUS_SORT), @ for annotations, $ for virtual pins. There is no comment syntax. Lines starting with # Pin ordering for project 03. parsed as a direction declaration with garbage after it and the flow blew up during Odb.CustomIOPlacement. Stripped the comments, re-ran, clean.

Second run: signoff clean across the board.

Cleaner result than P02, which had 11 max-slew violations in slow corner. The difference is mostly that the P03 design doesn’t have any combinational chains as long as P02’s 8-LUT PWM comparator. UART tries hard not to be deep.

P04 — SPI GPIO peripheral

Two clocks meet on the same chip for the first time. Five 2-FF synchronizer chains (cs_n, sck, mosi, all 8 bits of gpio_in). MISO is the trickiest part — needs cmd_byte to be settled before loading shift_out, so the load happens on the first sck-fall after the cmd-capture sck-rise. First version of the RTL had them on the same edge and read all zeroes; pushing the load apart by a half-sck fixed it on the second sim.

Hardened in one pass after that. 3217 cells, +3.78 ns setup slack, 4 max-slew in slow corner (probably the synchronizer-output fanout to cs_active). 0 DRC, 0 LVS.

The pin layout actually looks like a thing now: control pins on the west, SPI cluster on the north, GPIO bus on the south. Pop the chip viewer and rotate it.

Narrative review

Read all four project pages back-to-back as if I’d never seen them. Two small fixes:

  1. P01 and P02 each had a “what just happened?” line saying “X μm² of silicon” with the side length where the area should be (60 μm² / 100 μm²). Should be 3600 μm² / 10000 μm² (or “60 × 60 μm” / “100 × 100 μm”). Fixed.
  2. No forward links between project pages. Each project linked to the one before but not the one after. Added forward arrows.
  3. The start primer didn’t mention SystemVerilog at all, but it’s what we use from P02 onward. Added a short paragraph.

The arc is solid: P01 builds something without a clock, P02 adds the clock, P03 builds the first protocol on the clock, P04 deals with two clocks meeting. Each project introduces exactly one major concept and reuses everything that came before. The “introduces” frontmatter line on each page is doing real work.

Side quest

Killed about six stale dev-server processes that were lingering from earlier sessions and serving stale data-store.json caches. The “UnknownContentCollectionError” both times I added a new project content file traces back to that — Astro’s content store is session-cached, and adding a file from outside the dev-server’s watcher doesn’t always invalidate it. New flow: kill the dev server between project additions.

Status board now reads:

01 comb logic              hardened
02 counter / PWM / LFSR    hardened
03 UART transmitter        hardened
04 SPI-ish GPIO peripheral hardened
05–10                      not-started

40% through the ladder.