docs: log real Vivado stale-source bug + final flash-bridge P&R signoff (EXP-0078)
Found and fixed a real Vivado project-management bug: two source files (n2_system_ddr3_top.v, spi_host_bridge_v3.v) had stale imported copies (plus a duplicate at a second path) that silently kept being used in synth+impl despite live edits, making the first "flash bridge included" P&R run silently synthesize the OLD design (STARTUPE2 Used=0/1 gave it away). Fixed by removing the stale/duplicate entries and re-adding both files as direct (non-copied) references. Final real P&R: STARTUPE2 Used=1/1 (confirms the flash bridge is genuinely placed/routed), timing still closes but margin is now thinner and real: WNS +0.013ns, WHS +0.032ns, 0 failing endpoints. 5213 LUTs, 16 DSP48E1. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MUG92aM9m68TRc4rG55BcC
This commit is contained in:
@@ -4868,3 +4868,68 @@ real, not yet done, disclosed as the immediate next_action.
|
|||||||
next_action: real in-context P&R re-verification (synth+impl) with
|
next_action: real in-context P&R re-verification (synth+impl) with
|
||||||
flash_spi_master.v + the new XDC pin/PERSIST constraints included --
|
flash_spi_master.v + the new XDC pin/PERSIST constraints included --
|
||||||
first real placement check for STARTUPE2 in this project.
|
first real placement check for STARTUPE2 in this project.
|
||||||
|
|
||||||
|
EXP-0078 -- real toolchain bug found+fixed: Vivado project had stale
|
||||||
|
imported source copies; final real P&R with the flash bridge
|
||||||
|
genuinely included (2026-09-19/20, same autonomous continuation)
|
||||||
|
|
||||||
|
CONTEXT: after EXP-0077's flash_spi_master.v + FLASH_XFER integration,
|
||||||
|
the first re-run of the real P&R (adding flash_spi_master.v to the
|
||||||
|
project and re-running synth+impl) produced IDENTICAL timing/
|
||||||
|
utilization numbers to EXP-0076's own run (same WNS, same LUT count),
|
||||||
|
and the utilization report showed STARTUPE2 Used=0/1 -- a red flag,
|
||||||
|
since flash_spi_master.v genuinely instantiates one.
|
||||||
|
|
||||||
|
ROOT CAUSE (a real Vivado project-management bug, not an RTL issue):
|
||||||
|
the Vivado project had IMPORTED (copied) n2_system_ddr3_top.v and
|
||||||
|
spi_host_bridge_v3.v into NeuralProcessor.srcs/sources_1/imports/ at
|
||||||
|
some earlier point in this session, and every subsequent `add_files`/
|
||||||
|
`update_compile_order` call silently kept using those STALE COPIES --
|
||||||
|
none of EXP-0077's edits (the flash bridge ports/instantiation) had
|
||||||
|
actually reached the compiled design at all. Worse: a SECOND, separate
|
||||||
|
duplicate copy of both files existed at a different imports/ path
|
||||||
|
(imports/rtl/... vs imports/hardware/v3/rtl/...), from an earlier
|
||||||
|
add_files call made from a different working directory -- real
|
||||||
|
evidence that this kind of stale-copy drift can silently accumulate
|
||||||
|
across a long session unless explicitly checked.
|
||||||
|
|
||||||
|
FIX: diffed every one of the project's own "imports/" file copies
|
||||||
|
against their live hardware/v3 (or v2) source on disk -- found exactly
|
||||||
|
these two stale/duplicated files (all others were already in sync).
|
||||||
|
Removed both duplicate/stale entries and re-added n2_system_ddr3_top.v
|
||||||
|
and spi_host_bridge_v3.v pointing DIRECTLY at their canonical live
|
||||||
|
path (matching flash_spi_master.v's own already-correct, non-copied
|
||||||
|
reference) -- self-updating going forward, no import step to go stale
|
||||||
|
again.
|
||||||
|
|
||||||
|
RESULT (the real, final, trustworthy P&R): route_design 100%, 0
|
||||||
|
errors. STARTUPE2 Used=1/1 (100%) -- confirms the flash bridge is
|
||||||
|
genuinely placed and routed this time, not silently dropped. Timing
|
||||||
|
still closes but with a real, measurably thinner margin now that the
|
||||||
|
actual flash-bridge logic (including its own CCLK routing through
|
||||||
|
STARTUPE2) is truly part of the design: WNS = +0.013ns (down from
|
||||||
|
EXP-0076's +0.040/+0.056ns line of results), WHS = +0.032ns, still
|
||||||
|
0/17473 failing setup endpoints and 0/17470 failing hold endpoints.
|
||||||
|
5213 LUTs (8.22%, +40 vs EXP-0076's 5173 for the flash bridge itself),
|
||||||
|
16 DSP48E1 (6.67%, unchanged), 0 Block RAM.
|
||||||
|
|
||||||
|
DECISION: this is the current, final, genuinely trustworthy timing/
|
||||||
|
resource signoff -- real DDR3, real pin constraints, real register
|
||||||
|
file, real flash-bridge with real STARTUPE2 placement, all verified
|
||||||
|
together. The margin is real but now quite thin (+0.013ns) -- any
|
||||||
|
FUTURE logic addition to this design should be re-verified with a
|
||||||
|
fresh real P&R before being trusted, not assumed to still close.
|
||||||
|
|
||||||
|
LESSON (general, not just for this project): in any long Vivado batch-
|
||||||
|
TCL session that repeatedly edits already-added RTL files, explicitly
|
||||||
|
diff every "imports/" copy against its live source before trusting a
|
||||||
|
P&R result -- `add_files`/`update_compile_order` alone do NOT
|
||||||
|
guarantee an already-imported file gets refreshed from a later edit,
|
||||||
|
and a stale copy produces no error, no warning, just silently wrong
|
||||||
|
(unchanged) synthesis results.
|
||||||
|
|
||||||
|
next_action: none blocking. This is a stable, real, verified
|
||||||
|
checkpoint. Remaining open work (scaling past N=2, a real activation-
|
||||||
|
fetch engine, PCB-specific pin constraints once the board layout is
|
||||||
|
underway, ESP32-side JTAG bootstrap firmware) is all disclosed and
|
||||||
|
outside this experiment's own scope.
|
||||||
|
|||||||
Reference in New Issue
Block a user