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 <noreply@anthropic.com>
This commit is contained in:
2026-10-10 11:30:50 +02:00
parent 7116bc1ecc
commit 530d58df4f
+9
View File
@@ -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 place to add the side effect. The NCRA reset follows immediately in that
sequence anyway, which is why ignoring it costs nothing today. 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 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 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 `0x20` still reading `0x00` so a stray high register cannot alias onto a real