# Ch406 — deep request-FIFO timing repair (pre-fit gate)

## Trigger

The owner Quartus 26.1 GUI compile for Ch405 fit in the device but failed the
310 MHz EMIF clock by 0.267 ns, with design-wide TNS of -4.802 ns.  All 77
failing endpoints belong to `u_zc_emit|u_req`.  The leading path is the
registered empty flag through the 15-bit binary-pointer increment, Gray
conversion, equality reduction, and back into the empty flag.  Secondary
violations are the same empty/pointer cone feeding the 16K FIFO RAM address,
plus the asynchronous RAM bank mux feeding request-head decode.

This is a local consequence of increasing the Ch405 request FIFO from 4K to
16K.  Hold timing, Gray-pointer skew constraints, and all other clock domains
pass.

## Structural repair

- Treat `gs_async_fifo.rd` according to its existing interface contract: it is
  an accepted read, already qualified by `!rempty` in each wrapper.  Remove the
  redundant internal `!rempty` gate from the read-pointer increment.  This
  removes the empty-to-pointer feedback and the empty-to-RAM-address fanout.
- Add an optional synchronous/registered read port to `gs_async_fifo`.
- Enable that port only for the 16K x 92-bit Z/color request FIFO.  Keep the
  smaller existing users on their original FWFT interface.
- Add a one-cycle pending bit in `gs_lpddr_zc_emit` so its request-head stage
  captures the registered FIFO word on the following cycle and cannot issue a
  second pop while a word is in flight.
- Make the standalone FIFO testbench explicitly qualify its randomized read
  requests, matching the documented production interface.

No clock, SDC, FIFO depth, fixture, draw, texture, blend, or Z behavior changes.

## Pre-fit proof

- Async FIFO scoreboard: 3,284 writes / 3,284 reads, zero order, duplicate, or
  drop errors, final empty asserted, PASS.
- Ch405 worst three epochs, empty Z: 43,680 fed and passed, zero drops,
  high-water 12,953/16,384, exact color, exact Z, PASS.
- Ch405 worst three epochs, checkerboard Z: 43,680 fed, 21,839 passed, zero
  drops, high-water 11,389/16,384, exact color, exact unchanged Z at all
  307,200 pixels, PASS.
- A sequential production sweep additionally replayed epochs 0 through 19:
  291,597 fragments, zero drops, and every scene drain completed.  It was
  stopped after this redundant prefix because the complete 287-epoch run would
  consume more than an hour; the maximum-pressure tail and both Z outcomes had
  already passed exact comparisons above.
- Production RTL elaborates with the 16K request FIFO and registered-read path.

## Owner fit gate

Run the next compile only in the owner-controlled Quartus 26.1 GUI.  The fit
must confirm that the request RAM remains inferred in device memory, resources
still fit, setup and hold both pass, and the previous `rempty` feedback family
is absent.  Do not deploy an RBF unless those checks pass.
