D and W check out by hand, and the network stack gets the core repo's test rigor
Day after bring-up, on the other machine. The README’s status paragraph got a truth pass and now says memory read and write through the monitor is verified by hand over the LAN. That closes the 0x44 thing from the day before. None of the day’s commits names a fix for it, so I’m treating it as a bring-up artifact rather than a bug that got patched.
SPEC.md section 12 got a dated amendment instead of a rewrite. The hardware Etherbone wire contract is superseded by the software server, with the CommUDP dialect written down, a structural bound that a reply never exceeds the request length plus 16 bytes, and the broadcast-request, unicast-reply rule with the reason it exists. Section 13 gained the ARP keepalive requirement and a requirement that the RX path accept both limited and subnet broadcast, which is why udp.c is a fork. VPLAN grew 14 rows for the software transport and now counts 44 of 133 passing.
The bulk of the day was tests. The firmware C compiles on the host against a mocked ethmac, a 4-slot model with a scripted auto-responder. eb8008.c got 26 directed tests plus a 2149-case adversarial sweep over truncated and oversized records, which settled a suspected reply-buffer overflow by showing a read record always consumes at least as many bytes as its reply produces. udp.c got 46 tests covering the subnet-broadcast fix, min-frame padding, source MAC capture, ARP-free replies, and ICMP both directions. The serve glue came out of main.c into eb_serve.c so it could be tested too, 15 tests through the real receive, serve and transmit path including NAT-rewritten ports. dhcp8008.c got adversarial parser cases. A coverage gate fails below 100 percent of lines on all four files. main.c is the one file left without a harness.
On the host side, a golden differential encodes every request with litex’s own EtherbonePacket and decodes the C server’s replies through a pipe harness, plus 50 seeded random records against a Python reference model. A fork-drift test pins the sha256 of the vendored udp.c base and checks each load-bearing change is still there. And a conftest guard makes any UDP sendto off the loopback raise, because the broadcast-probe change had three tests emitting probes onto the bench LAN. Host pytest is 105 and the SoC tier is 48, the latter elaborating all three ethernet configurations through the real CLI.
Mutation pass. Seven bugs planted one at a time, each required to fail its test, then reverted. The subnet-broadcast fix dropped, TX padding dropped, correlation id zeroed, port mirroring hardcoded, MAC-capture reply replaced with broadcast, and 8 bytes of slack either way in both bounds checks. The two bounds mutants survived the first time. The sweep was checking the reply-size contract and a canary but not what the parser did to the bus with truncated input. It now checks that a record section executes only if every one of its bytes arrived, against per-cut expectations across all 2149 cases, and that kills both.
The old Verilator CSR bench is deleted. It drove the Wishbone RAM window and the run/stop control, both removed by the spec, and the structural test asserts the RAM window is gone, so the bench couldn’t even elaborate.
make selftest is new. Five checks over the live board with no arguments, using the same discovery and bridge as make login. Identifier read, console banner, an H command, a scratch write and readback with three patterns, and a 255-word burst read. The bridge startup window went from 5 s to 15 s because a board mid-DHCP can take that long to answer a probe. The board was powered down before it got a live run, so the code path is verified up to discovery only.
Last, a GitHub Actions workflow mirroring the core repo’s. It bootstraps the gitignored LiteX environment on the pinned tag, installs oss-cad-suite, checks out intel-8008-vhdl for the core, and runs the C tests with the coverage gate, both pytest tiers and the SoC elaboration on every push.
Next is TODO.md, which is the plan to get all 133 rows to pass or waived with cocotb, SymbiYosys and EQY, and a b8008net load tool that paces a hex file against the monitor’s echo.