From 530d58df4f10e7c0e9b2569682c91e992002deb9 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sat, 10 Oct 2026 11:30:50 +0200 Subject: [PATCH] Record the measured timing cost of the command register file A/B on identical seeds rather than comparing against a different sweep, since seed-to-seed spread on this design is larger than the effect being measured: seed 1 clk seed 2 clk SB_DFFE SB_LUT4 before 28.72 27.04 934 2818 after 29.07 26.39 1038 2959 So +104 FFs, +141 LUTs, and about -2.4% fmax on the worst seed while seed 1 improved -- most of the spread is placement noise over a modest real cost. 8/8 seeds still close; best seed 3 at 29.74 MHz is 1.24x over the 24 MHz target. Also records why the storage covers the full low nibble rather than only the registers libogc2 touches: a sparse decode would silently drop writes to anything unlisted, which is exactly the behaviour this replaced. Noted as the obvious thing to narrow if clk margin ever needs reclaiming. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index 8ee4dc6..1e7d388 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1443,6 +1443,15 @@ register; if a real-hardware reset ever turns out to depend on it, this is the place to add the side effect. The NCRA reset follows immediately in that sequence anyway, which is why ignoring it costs nothing today. +**Measured cost** (A/B on identical seeds, 2026-10-10): +104 `SB_DFFE`, ++141 `SB_LUT4`, and `clk` 27.04 → 26.39 MHz on seed 2 while seed 1 went +28.72 → 29.07, i.e. about −2.4% on the worst seed with the rest inside +placement noise. 8/8 seeds still close; best seed 3 at 29.74 MHz = 1.24×. The +storage is a full low nibble (`0x00`–`0x0F`) rather than only the registers +listed above, deliberately: a sparse decode would silently drop writes to +anything unlisted, which is the behaviour being fixed. If `clk` margin ever +needs reclaiming, this array is the obvious thing to narrow. + Test: `bba_register_file` **T14** covers the whole table — revision ID value and read-only-ness, write/read-back on `0x04`/`0x05`/`0x09`/`0x0B`/`0x0F`, and `0x20` still reading `0x00` so a stray high register cannot alias onto a real