RTL (GS rasterizer, EE core stub, platform bridge, LPDDR4B path), sim regression (272 TBs), docs, and tooling. Copyrighted PS2 content (BIOS, game code, GS dumps, and all dump-derived textures/traces) is excluded via .gitignore and stays local. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.9 KiB
Ch305 closeout — DSUBU; THIRD inflection (+1.46M retires); EE-core reality checkpoint queued
Status: Closed. Verdict from re-running qbert.elf:
elf_timeout_with_hot_pc (1489428 retires, hot_pc=0x00106154) —
qbert advanced 29,417 → 1,489,428 retires (+1,460,011), a
third inflection, then hit a new steady-state wait loop in a
different code region.
What landed — rtl/ee/ee_core_stub.sv (4 edits)
R5900 DSUBU (SPECIAL funct 0x2F), the 64-bit-subtract sibling of Ch272's DADDU. Modelled as SUBU on the low 32 bits, no overflow trap:
localparam FUNC_DSUBU = 6'h2F.is_dsubu = is_special && (func == FUNC_DSUBU).- Added
is_dsubutois_rtype_alu(which auto-excludes it fromis_nop_classvia the SPECIAL clause — no separate nop_class edit needed). - Extended the SUBU writeback arm:
is_sub || is_subu || is_dsubu→rs_val - rt_val.
Focused TB — tb_ee_core_dsubu.sv
Three cases, all PASS:
- Normal:
dsubu $t0, $a0, $a1(8 - 3 = 5). - Exact qbert encoding asserted
0x0062102F=dsubu $v0, $v1, $v0(10 - 4 = 6). - Underflow:
dsubu $t3, $0, $a3(0 - 1 = 0xFFFFFFFF, no trap).
Result: $t0=5 $v0=6 $t3=0xFFFFFFFF errors=0 PASS.
qbert progression — third inflection
| Chapter | retire_count | verdict |
|---|---|---|
| Post-Ch304 (0x6B) | 29,417 | opcode trap (DSUBU) |
| Post-Ch305 (DSUBU) | 1,489,428 | timeout_with_hot_pc |
+1.46M retires. The third time a single opcode/syscall addition has unlocked a >1M-retire stretch (after Ch293's syscall 0x7A and Ch297's syscall 0x77). DSUBU was the last blocker in a hot numeric-init path; clearing it let qbert run deep into a new region (hot_pc 0x00106154 — note 0x00106xxx, lower than all prior blockers, so a different/earlier-linked function).
The new wait loop at 0x00106154 is a Ch307+ autopsy candidate — deferred in favor of the Ch306 reality checkpoint per the strategic decision below.
Strategic pivot — Ch306 = EE core reality checkpoint
Codex and the project owner have (correctly) called the question: the qbert track is building a behavioral compatibility oracle, not a synthesizable R5900. Before sinking more chapters into either track, Ch306 is a recon/design checkpoint that splits the roadmap into two explicit tracks:
- Track A — EE Behavioral Oracle (
ee_core_stub): continue qbert only to discover required instructions/syscalls/MMIO. Output = a living compliance checklist. - Track B — Synthesizable EE Core: a separate, deliberate RTL plan. Must NOT grow accidentally from the stub.
Ch306's job (a workflow): inventory every ee_core_stub feature
and classify each as:
- architectural instruction → graduates to real RTL,
- HLE syscall behavior → BIOS/kernel, lives in ROM or an HLE companion, NOT the CPU,
- TB-only / qbert-specific hack (gate pokes, $a0-aware returns, Ch215 shim) → pure scaffolding for missing async hardware, NEVER graduates,
- unsynthesizable / sim-only (trace ports, hierarchical peeks) → must be stripped or gated for synthesis.
Plus: a go/no-go on whether a simple multicycle/interpreter-style R5900 subset fits the Agilex 5 and passes the existing ~178 TBs. The qbert-focused TBs become the compliance suite for Track B.
The validation answer (the concern that triggered this pivot): we can validate a real R5900 RTL — the 178 TBs + qbert boot path already ARE the harness. We've been writing a spec-by-execution for 35 chapters; Ch306 makes it explicit and decides the graduation path before, not after, building Track B.
Files changed
rtl/ee/ee_core_stub.sv— 4 DSUBU edits.sim/tb/integration/tb_ee_core_dsubu.sv— new focused TB.sim/Makefile— target + both regression lists.
Regression
178/178 PASS — clean full regression covering both Ch304 (syscall 0x6B) and Ch305 (DSUBU), with tb_ee_core_dsubu in the suite. (Was 177 in Ch304; +1 for the new DSUBU TB.)