neural_multiprocessor.v wraps dataflow_core.v (M7, unmodified) around the real, unmodified V1 PSRAM backend chain (int8_memory_access -> memory_interface -> psram_controller), funneling N_SLOTS independent Memory Backend Interface ports through a new generic N-port arbiter (slot_mem_arbiter.v) inspired by (not copied from) V1's own mem_arbiter.v. Real concurrent-slot simulation immediately surfaced a genuine bug (ERR-0008): memory_manager/prefetch_engine's byte-level backend protocol is fire-and-forget (a single-cycle mem_req pulse with no accept handshake) - correct for M4's direct 1:1 connection, but a naive arbiter silently drops a pulse arriving while the shared bus is owned by another slot, hanging that slot forever. Fixed with a per-port pending-request latch, the same "queue, don't drop" idiom already used by memory_manager's own pf_pending register (ERR-0006). Verified (Verilator): 4/4 PASS with 2 slots genuinely contending for one real PSRAM port (444 cycles). No regression on M4's own testbench. Real synthesis + nextpnr-ecp5 P&R (no harness needed - real PSRAM pins keep the top-level at 157 pins): 0 problems, Fmax 142.45 MHz, PASS at 80MHz. Arbitration policy is fixed lowest-index priority, not fairness- balanced (DEC-0010) - consistent with every other "simplest correct policy first" scheduling choice in this roadmap, revisited only if M9's real measurement shows starvation matters. Logged: simulation/synthesis/timing/benchmark/decisions (DEC-0010)/ experiments (EXP-0009)/errors (ERR-0008)/development.log, ROADMAP.md updated. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
73 lines
3.8 KiB
Plaintext
73 lines
3.8 KiB
Plaintext
# V2 timing log -- solo append, mai troncato/sovrascritto (vedi README.md)
|
|
# Nessuna entry ancora -- popolato incrementalmente man mano che avanza lo sviluppo V2.
|
|
|
|
[2026-09-05] EXP-0001 -- neural_processor (P_IN=8, ACC_WIDTH=32)
|
|
nextpnr-ecp5 --45k --package CABGA381 --speed 8 --freq 80
|
|
--lpf-allow-unconstrained
|
|
Fmax: 183.12 MHz -- PASS at 80 MHz (real place&route measurement)
|
|
Critical path: job_ready -> TRELLIS_IO output pad (i.e. the design's
|
|
own logic is NOT the bottleneck at this Fmax -- an unconstrained
|
|
output pin dominates; a real system-level Fmax will differ once
|
|
this signal is consumed on-chip instead of driven to a pad in
|
|
isolation). Log: hardware/v2/synthesis/neural_processor_p8/nextpnr.log
|
|
WNS/TNS: not reported by this nextpnr version in this invocation.
|
|
|
|
[2026-09-05] EXP-0002 -- neural_processor (P_IN=8, ACC_WIDTH=24)
|
|
Same command as above, ACC_WIDTH=24 build.
|
|
Fmax: 176.21 MHz -- PASS at 80 MHz (real place&route measurement)
|
|
Delta vs ACC_WIDTH=32: -6.91 MHz (-3.8%) despite FEWER resources --
|
|
attributed to placement noise, not a real architectural effect
|
|
(no seed sweep run to confirm either way -- see experiments.log
|
|
EXP-0002 and benchmark.log). Log: hardware/v2/synthesis/
|
|
neural_processor_p8_acc24/nextpnr.log
|
|
|
|
[2026-09-05] EXP-0003 -- N_PROCESSORS sweep (P_IN=8), real nextpnr-ecp5
|
|
--45k --package CABGA381 --speed 8 --freq 80 --lpf-allow-unconstrained
|
|
N=1: Fmax=159.11 MHz PASS MULT18X18D 8/72 (11%)
|
|
N=2: Fmax=149.59 MHz PASS MULT18X18D 16/72 (22%)
|
|
N=4: Fmax=151.01 MHz PASS MULT18X18D 32/72 (44%)
|
|
N=8: Fmax=134.70 MHz PASS MULT18X18D 64/72 (88%)
|
|
TRELLIS_IO stays at 18/245 (7%) throughout (harness has only
|
|
clk/rst/seed/checksum as real pins, by design -- see ERR-0005).
|
|
See decisions.log DEC-0005: DSP, not Fmax or LUT/FF, is the resource
|
|
that will first prevent scaling N_PROCESSORS further at P_IN=8.
|
|
|
|
[2026-09-05] EXP-0004 -- default-depth buffer configs, real nextpnr-ecp5
|
|
activation_buffer (D=4096): Fmax=325.20 MHz PASS
|
|
weight_buffer (D=512): Fmax=339.67 MHz PASS
|
|
result_buffer (D=4096): Fmax=325.20 MHz PASS
|
|
All far above the 80MHz target -- buffers are not a timing concern in
|
|
isolation at these depths.
|
|
|
|
[2026-09-05] EXP-0005 -- memory_manager + prefetch_engine (via
|
|
harness_memory_manager.v, see errors.log ERR-0005 for why a harness
|
|
was needed), real nextpnr-ecp5 --45k --package CABGA381 --speed 8
|
|
--freq 80 --lpf-allow-unconstrained
|
|
Fmax: 165.86 MHz -- PASS at 80MHz (real place&route measurement)
|
|
|
|
[2026-09-05] EXP-0006 -- neural_director (via harness_neural_director.v,
|
|
see errors.log ERR-0005 for why), real nextpnr-ecp5 --45k --package
|
|
CABGA381 --speed 8 --freq 80 --lpf-allow-unconstrained
|
|
Fmax: 250.50 MHz -- PASS at 80MHz (real place&route measurement)
|
|
|
|
[2026-09-05] EXP-0007 -- dependency_manager (N_NODES=16, standalone,
|
|
no harness needed), real nextpnr-ecp5 --45k --package CABGA381
|
|
--speed 8 --freq 80 --lpf-allow-unconstrained
|
|
Fmax: 155.30 MHz -- PASS at 80MHz (real place&route measurement)
|
|
|
|
[2026-09-05] EXP-0008 -- dataflow_core (via harness_dataflow_core.v,
|
|
see errors.log ERR-0005 for why a harness was needed), real
|
|
nextpnr-ecp5 --45k --package CABGA381 --speed 8 --freq 80
|
|
--lpf-allow-unconstrained
|
|
N_SLOTS=2: Fmax = 165.15 MHz -- PASS at 80MHz (real place&route)
|
|
N_SLOTS=4: Fmax = 133.19 MHz -- PASS at 80MHz (real place&route)
|
|
Fmax drops as N_SLOTS grows (more concurrent memory_manager+
|
|
neural_processor instances competing for the same routing fabric
|
|
around the shared neural_director/dependency_manager hub) -- both
|
|
configs still clear the 80MHz target with real margin.
|
|
|
|
[2026-09-05] EXP-0009 -- neural_multiprocessor (M8, N_SLOTS=2, real
|
|
standalone synthesis, no harness needed), real nextpnr-ecp5 --45k
|
|
--package CABGA381 --speed 8 --freq 80 --lpf-allow-unconstrained
|
|
Fmax: 142.45 MHz -- PASS at 80MHz (real place&route measurement)
|