docs: real timing closure for 32-bit DDR3 channel (EXP-0086)

Reverting Clock Period to 3225ps (keeping Data Width=32) closes real
timing: WNS=+0.095707ns, WHS=+0.036275ns, 0 failing endpoints, all
user-specified constraints met. This is the real final signoff for the
32-bit DDR3 channel widening effort (EXP-0083 through EXP-0086),
replacing EXP-0083's 16-bit-era baseline as the project's current
trustworthy number. Confirms the EXP-0084 root-cause analysis: the
earlier -0.618ns failure was caused by a separate, stacked clock
speedup, not the width change itself.

Also found and fixed a second, wholesale real occurrence of the
stale-import bug: the MIG wizard regeneration needed to revert Clock
Period silently re-imported the entire v3 RTL tree (9 files) plus the
top XDC back to pre-EXP-0084 stale copies, not just the file(s) the
regeneration touched. CLAUDE.md's lesson extended accordingly.
This commit is contained in:
2026-09-20 18:05:30 +02:00
parent bdc821222f
commit 678caa9bce
4 changed files with 248 additions and 120 deletions
+90
View File
@@ -5617,3 +5617,93 @@ the tight I/O/VCCO budget further. Document the real ESP32-side
GPIO/interrupt wiring implication once the board's own reset-circuit
pin planning (S7, still open) is decided, since data_ready_n and
sys_rst now share bank 15's own real, tentative pin choices.
EXP-0086 -- real timing closure for the 32-bit DDR3 channel (clock
period revert), plus a real recurrence of the stale-import bug
(2026-09-20, continuation: user reverted Clock Period 2900->3225ps via
a second real MIG wizard session, keeping Data Width=32, per this
session's own EXP-0084 root-cause recommendation: "torna esattamente
nelle condizioni gia' testate")
CONTEXT: EXP-0084 left the 32-bit DDR3 channel functionally complete
but with real timing FAILING (WNS=-0.618ns) at the paired 2900ps/
172.414MHz ui_clk speedup. Root cause (EXP-0084) was decoupled from the
width change itself: the failing path was neural_processor_packed.v's
own packed-MAC accumulation tree, unchanged since EXP-0059, which had
real margin at the OLD 155.039MHz clock but not the new, faster one.
Recommendation given to the user: revert ONLY Clock Period back to the
already-proven-safe 3225ps, keep Data Width=32 (the width alone already
delivers the full 2x bandwidth target, independent of clock speed).
REAL BUG FOUND BEFORE THE REAL FIX COULD EVEN BE MEASURED: the first
re-run of the final P&R (Clock Period=3225ps, Data Width=32, all
EXP-0084 RTL/XDC fixes already committed) failed immediately with
"ERROR: [Place 30-58] IO placement is infeasible. Number of unplaced IO
Ports (41) is greater than number of available pins (10)" plus a
CRITICAL WARNING that PROHIBIT was again an invalid property. Both were
supposedly-already-fixed EXP-0084 bugs. Root-caused (not guessed) by
checking which XDC file Vivado actually parsed in the log
(".../constrs_1/imports/constraints/n2_system_ddr3_top.xdc" -- the
STALE IMPORTED COPY, not the live hardware/v3/ source) and then
querying the project's sources_1 fileset directly: the user's own
second real MIG wizard regeneration (the one that produced the
3225ps/DataWidth=32 mig_a.prj) had triggered Vivado to rescan and
RE-IMPORT THE ENTIRE v3 RTL SOURCE TREE, not just the XDC -- 9 RTL
files (host_mem_bridge.v, layer_prefetch_ctrl.v, layer_weight_buffer.v,
mig_native_adapter.v, neural_director_packed.v, neural_processor_
packed.v, sdram_arbiter_n.v, weight_tile_gather.v, mac2_dsp_packed.v)
plus n2_system_ddr3_top.xdc were all silently reset to stale copies
predating EXP-0084's fixes. This is the SAME class of bug CLAUDE.md
already documented for EXP-0078 (RTL) and EXP-0084 (XDC, single file)
-- but this is the first real confirmation that it can recur on ANY
MIG IP regeneration, wholesale, across the entire project, not just
once per file. Fixed via the same technique as before: remove_files +
add_files -norecurse to make each one a direct reference again
(/tmp/fix_all_stale_srcs.tcl for the 9 RTL files, /tmp/fix_stale_xdc2.tcl
for the XDC), verified via a real TCL query that zero non-IP-owned
*/imports/* paths remained in either fileset before re-running.
REAL RESULT (after the stale-source fix, real synth_design + opt_design
+ place_design + route_design, xc7a100tcsg324-2, in-context on
n2_system_ddr3_top): **WNS = +0.095707 ns, WHS = +0.036275 ns**, 0
failing endpoints out of 25172 (setup) / 25169 (hold) / 9505 (pulse
width). "All user specified timing constraints are met." The
clk_pll_i domain (155.039 MHz, 6.45ns period -- the exact domain that
failed at -0.618ns in EXP-0084's 2900ps attempt) closes at WNS=+0.096ns
across 24522 endpoints, confirming the EXP-0084 root-cause analysis:
the width change was never the problem, and reverting only the clock
period restores real margin on neural_processor_packed.v's own MAC
tree, matching EXP-0083's real 16-bit-era WNS (+0.073ns) closely (small
+0.023ns difference is normal P&R placement-seed variance, not a real
regression or improvement tied to the width change).
Real utilization (routed): 6382 LUTs (vs EXP-0083's 5644 -- +738,
+13%, expected: doubled DQ/DM/mask handling, 4-way tile-offset muxes in
act_tile_fetch.v, wider ctrl bus through ddr_prefetch_mgr.v), 7769
registers, 16 DSP48E1 (unchanged -- same core count), 119 Bonded IOB
used of 207 available (57.49%, real headroom remains). data_ready_n
(EXP-0085) confirmed placed at D14/LVCMOS33, sys_clk_p/n at N5/P5/
DIFF_SSTL15, clk_ref_p/n at T14/T15/LVDS_25 -- all real, routed,
verified via a direct open_checkpoint query on n2_system_ddr3_top_
routed.dcp, not assumed from the XDC alone.
DECISION: real, final signoff for the 32-bit DDR3 channel widening
(EXP-0083 DDRManager phase 1 through EXP-0086 this entry). This
REPLACES EXP-0083's 16-bit-era number as the project's current
trustworthy real P&R baseline. Bandwidth ceiling: real 32-bit width x
real closed 155.039MHz clk_pll_i domain = the full originally-targeted
~2.48GB/s (2x EXP-0083's 16-bit ~1.24GB/s), with real, closed timing,
not a projection.
next_action: (1) CLAUDE.md's stale-import lesson updated to note MIG
IP regeneration can re-trigger a wholesale project source rescan, not
just a single-file staleness risk -- check ALL filesets after ANY IP
regeneration, not just the files touched by that regeneration. (2)
Re-measure EXP-0083's DDRManager (ddr_prefetch_mgr.v) real benefit
against this now-closed wider channel, per the project's own established
sequencing ("re-measure once the wider channel's timing actually
closes"). (3) Build the result-writeback engine (ARCHITECTURE_ANALYSIS
§5.3, long-disclosed blocker for N>2 core scaling). (4) Real N=2/4/8/16
core-count scaling tests, each with its own real P&R signoff, per the
user's own standing directive ("senza illusioni ma analizzando la
situazione piu' performante").