feat: DDRManager phase 1 - single-slot look-ahead activation prefetch (EXP-0083)
New ddr_prefetch_mgr.v wraps act_tile_fetch.v with a depth-2 ping-pong buffer, issuing the next tile's DDR3 fetch as soon as the fetch engine is free instead of waiting for packed_slot.v to finish consuming the current tile. Wired into packed_slot.v's tile loop (job-level start instead of per-tile req), simplifying the S_TILEWAIT join in the process (ddrpf_tile_valid is level-held, no separate act_seen latch needed). Verification: new tb_ddr_prefetch_mgr.v (25/25 PASS after fixing a real testbench polling race found via iteration-tagged tracing, not an RTL bug), tb_packed_slot.v re-run unmodified (9/9 PASS, bit-identical results), tb_n2_system_ddr3.v re-run via real xsim against real ddr3_model.sv (8/8 PASS). Real P&R: WNS +0.073ns (up from EXP-0082's +0.068ns), LUTs 5644, DSP48E1 16 unchanged, 0 failing endpoints. Honest result: real A/B on the actual DDR3 backend (same testbench, before/after) shows a real but modest 2.86% reduction in total simulated time - smaller than the original hypothesis suggested, because neural_processor_packed.v already accepts one operand per cycle, so the per-tile dead time being removed was already small relative to real DDR3 fetch latency. Docs updated to report this honestly rather than oversell it; the larger multi-slot DDRManager is deferred pending re-measurement against the (still pending, user-gated) 32-bit channel widening. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUG92aM9m68TRc4rG55BcC
This commit is contained in:
@@ -118,7 +118,7 @@ these from an ESP32 doing real JTAG bit-banging (TAP state machine, IR/DR
|
||||
shifting) rather than a bench programmer — that firmware is separate,
|
||||
software-side work, not covered here.
|
||||
|
||||
## 3. Real timing signoff (EXP-0082, the current, trustworthy number)
|
||||
## 3. Real timing signoff (EXP-0083, the current, trustworthy number)
|
||||
|
||||
Real in-context Vivado place-and-route (not out-of-context, not estimated):
|
||||
|
||||
@@ -126,9 +126,10 @@ Real in-context Vivado place-and-route (not out-of-context, not estimated):
|
||||
|---|---|
|
||||
| DDR3 PHY clock (sys_clk_i) | **310.078 MHz** (3.225ns period) |
|
||||
| Compute domain clock (ui_clk, PLL-derived 2:1 from sys_clk_i) | **155.039 MHz** |
|
||||
| WNS (setup slack) | **+0.068 ns** — real, still thin but improved vs EXP-0078/0079. Re-verify with a fresh P&R after ANY further logic addition. |
|
||||
| WNS (setup slack) | **+0.073 ns** — real, still thin but improved vs every prior real run. Re-verify with a fresh P&R after ANY further logic addition. |
|
||||
| WHS (hold slack) | +0.036 ns |
|
||||
| Failing endpoints | 0 (setup), 0 (hold) |
|
||||
| LUTs used | 5437 / 63400 (8.58%) |
|
||||
| LUTs used | 5644 / 63400 (8.90%) |
|
||||
| DSP48E1 used | 16 / 240 (6.67%) — 8 per compute core × 2 cores, unchanged since EXP-0059 |
|
||||
| Block RAM used | 0 |
|
||||
| STARTUPE2 used | 1 / 1 (100%) — the config-flash bridge |
|
||||
@@ -141,7 +142,8 @@ Signoff history (every real change, same target, in-context P&R):
|
||||
| 0076 (+regfile, +pins, +SPI fix) | +0.056 | 5173 | 16 |
|
||||
| 0078 (+flash bridge, STARTUPE2) | +0.013 | 5213 | 16 |
|
||||
| 0079 (+real activation engine) | +0.030 | 5379 | 16 |
|
||||
| 0082 (+denser activation packing) | **+0.068** | 5437 | 16 |
|
||||
| 0082 (+denser activation packing) | +0.068 | 5437 | 16 |
|
||||
| 0083 (+DDRManager phase 1, `ddr_prefetch_mgr.v`) | **+0.073** | 5644 | 16 |
|
||||
|
||||
## 4. Real DDR3 memory layout convention
|
||||
|
||||
@@ -243,11 +245,23 @@ table is a summary/index.
|
||||
## 7. Known-open items (honestly disclosed, not hidden)
|
||||
|
||||
- Scaling past N=2 compute cores (silicon budget allows up to ~30 per the
|
||||
DSP48E1 count) is not yet built or timing-verified.
|
||||
DSP48E1 count) is not yet built or timing-verified. A result-writeback
|
||||
engine (currently `result_data_a/b` are literal top-level pins, fine at
|
||||
N=2 but a real pin-budget blocker beyond that) must land first — see
|
||||
`docs/ARCHITECTURE_ANALYSIS.md` §5.3.
|
||||
- The reset pin and other very-low-pin-count signals have no fixed PCB
|
||||
location yet — assign once the rest of the board layout (reset circuit,
|
||||
status LEDs, etc.) is decided.
|
||||
- The §3 timing margin (+0.013ns) is real but thin — do not add logic
|
||||
- The §3 timing margin (+0.073ns) is real but thin — do not add logic
|
||||
without a fresh real P&R to confirm it still closes.
|
||||
- ESP32-side JTAG bit-banging firmware (§5.1) does not exist yet — it's
|
||||
software work on the host side, not part of this FPGA RTL.
|
||||
- A 32-bit-wide DDR3 channel (decided, see `docs/ARCHITECTURE_ANALYSIS.md`
|
||||
§5.4) requires the user's own real interactive Vivado MIG "Customize IP"
|
||||
wizard session (Data Width + Input Clock Period changed together) —
|
||||
not yet done; every timing/bandwidth number in this document still
|
||||
reflects the current 16-bit channel.
|
||||
- `ddr_prefetch_mgr.v` (DDRManager phase 1, EXP-0083) is real, built, and
|
||||
timing-verified, but its measured benefit (2.86% real reduction in total
|
||||
simulated time) is modest — see `docs/ARCHITECTURE_ANALYSIS.md` §5.2 for
|
||||
the honest number and why. The larger multi-slot DDRManager is not built.
|
||||
|
||||
Reference in New Issue
Block a user