Ch442's fit exposed two failing setup families (plus a stale max-skew). Attack both structurally; no reseeding. Family 1 - AWREADY -> Z-FSM (-0.410): gen_p2c_ff[23] (EMIF AWREADY) reached u_zc_emit|u_z's S_SFLUSH_AW/S_FILL_R next-state combinationally. Ch441 registered only the W channel; add the AW twin: - new gs_axi_aw_regbuf (one-entry fully-registered AW buffer), inserted in zc_emit between u_z's AW output and the arbiter s2 AW port. The FSM now sees registered occupancy, never EMIF's combinational AWREADY. Family 2 - texcache drain_idx_q -> tex_mem (-0.370, x7): a single index fanned across the whole 65536x32, 128-M20K macro. Split by WIDTH into four 65536x8 banks, each with its own (* preserve, dont_merge *) write- address launch register; write the four byte lanes together in F_WRITE; reconstruct the sample word by concatenating four registered read bytes. Selector structure and 1-cycle read latency unchanged; total M20Ks unchanged (4x32 == 128); fill_crc still sums the full 32-bit word. Max-skew: relax ONLY the Ch357 tile-write CDC set_max_skew 2.0 -> 2.5 (quasi-static bundle, >=2 dclk stability window); retain set_net_delay 2.0 (the real arrival bound). SDC comment updated. Tests: new tb_gs_axi_aw_regbuf (AW scoreboard: exactly-once/order/no- combinational-AWREADY-bypass/stable-while-stalled); tb_gs_texture_cache strengthened to distinct-per-byte-bank data + per-bank + full-word checks. All pass: aw/w regbuf, texture_cache, texture_psmt8_clut, scanout_diag, ps2_hps_bridge, and the complete f52 replay BYTE-IDENTICAL (Z 0/307200, COLOR 0/245760). No Quartus, board, or push from here. Ready for one owner GUI fit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
rtl/gif_gs
GIF path and Graphics Synthesizer logic. Matches docs/contracts/gif_gs.md.
Current contents
-
gs_stub.sv— GS shell with two architecturally distinct write ports (Ch75 namespace split):reg_wr_*— privileged-block writes (16-bit offset within0x12000000). LatchesBGCOLOR(offset0x00E0) intobg_{r,g,b}; other offsets emitEV_MODE.gif_reg_*— GIF A+D register-number writes (8-bit reg# + 64-bit data). DecodesPRIM=0x00,RGBAQ=0x01,XYZF2=0x04,XYZ2=0x05,FRAME_1=0x4C,ZBUF_1=0x4Einto per-register 64-bit latches; unknown reg numbers emitEV_MODE.- No VRAM, no drawing yet — that is the next architectural step.
-
gif_path_stub.sv— Wave 2 minimal GIF packet logger; project-local single-qword register-write format. Used bytb_bgcolor_via_dma. -
gif_packed_stub.sv— real PS2 GIFtag parser (Ch72-Ch75). Handles PACKED (FLG=0), REGLIST (FLG=1), IMAGE (FLG=2), DISABLE (FLG=3). TheREAL_AD_REG_MAPparameter selects the A+D dispatch port:REAL_AD_REG_MAP=0(default, back-compat) — drivesgs_stub.reg_wr_*using a project-local 16-bit offset carried inin_data[79:64].REAL_AD_REG_MAP=1— drivesgs_stub.gif_reg_*using the real PS2 8-bit reg# carried inin_data[71:64]. Source-of-truth: PCSX2GSRegs.h.
BGCOLOR reset value
At reset, bg_{r,g,b} default to 0x40 each (mid-grey) rather than black.
Rationale: this makes "gs_stub reset but no BGCOLOR write yet" visually
distinct from "video output disabled / black frame" in Milestone A. Override
is a BGCOLOR write from the test harness.
Pitfall: namespace conflation
Ch74 conflated GIF A+D reg numbers with GS privileged-block offsets and
mapped e.g. 0x14→PMODE@0x0000. That is fiction — those are separate
namespaces. Ch75 split them. ZBUF_1 is 0x4E, not 0x4F (that's
ZBUF_2). When adding a new GIF-context register, source the reg# from
PCSX2 GSRegs.h, never from the privileged-block map.