4e8c3a16b8957c91e95b5ff23a6933a5aa28d03e
The per-triangle gradient engine already time-shared ONE divider across all GRAD_STEPS attributes, but computed every grad_load_num[0:GRAD_STEPS-1] numerator IN PARALLEL — ~44 wide multiplies (~100 physical DSP) for once-per-triangle setup consumed one-at-a-time. Pure redundant hardware; the design was DSP-maxed (187/188, 99%) so nothing new could fit (fog needed 191/188). Replace the parallel bank + the grad_num_q[] pre-latch array with grad_num_step: computes ONLY the current grad_step's numerator from ONE mux-selected pair of signed multipliers (attribute triple by grad_step>>1, axis by grad_step[0]; shared da1/da2, two shared products, signed subtract, <<<20). grad_word_q/grad_slot are held stable the whole solve, so it is bit-identical to the old grad_num_q[grad_step]. Removed grad_num_dadx/dady (inlined once). FSM sequencing and throughput unchanged. Width note: da1/da2 are 33-bit (products 50-bit), NOT operand-width 32-bit — the original (a1-a0) lived in a signed-64-bit expression context and never wrapped; full-32-bit Z with |a1-a0|>2^31 needs the wider intermediate. tb_gs_grad_num_equiv (extreme signed corners + 200k random = 494770 checks, 0 errors) caught a 32-bit first cut that f52's real data never exercised. Resource (26.1 Seed-3 fit): DSP needed 168->83 / final placement 187->119, i.e. 99% -> 44%, ~85 blocks reclaimed (Codex gate >=70 met). ALM 40458->38784 (86->83%). RAM 322/358 unchanged. Timing CLEAN: setup +0.077, all classes >=0, 0 violated. Verification: tb_gs_grad_num_equiv 0/494770; f52 replay BYTE-IDENTICAL golden d0047677 (drops=0, occupancy unchanged); gradient/perspective/texture regressions (tri_interp, grad_divider, persp_uv, zbuffer, fog_persp, textured_triangle, triangle/perspective/combined/gouraud demos) all PASS. Byte-identical => the screen is unchanged; this is the resource unlock for fog + coverage. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
retroDE_ps2 Planning Docs
This directory is the working design scaffold for the PS2 core.
Purpose:
- define the intended repository shape before RTL lands,
- define subsystem boundaries before implementation choices harden,
- document what each block owns, what crosses the boundary, and how we will validate it.
Recommended reading order:
- repo_layout.md
- phase0_checklist.md
- contracts/README.md
- stub_module_plan.md
- wave2_dma_gif_plan.md
- wave25_memory_backed_dma_plan.md
- wave26_multi_beat_dma_plan.md
Relationship to references/:
references/is the research library.docs/is the project-definition layer.
Rule of thumb:
- If a file explains PS2 hardware as it exists, it belongs under
references/. - If a file explains how
retroDE_ps2intends to model, partition, or validate that hardware, it belongs underdocs/.
Description
Languages
SystemVerilog
75.5%
Verilog
15.4%
Tcl
4.7%
HTML
1.1%
Python
1%
Other
2.3%