docs: update LaTeX docs for N16 real timing closure + honest ESP32-S3 projection (EXP-0097)

architecture.tex: document the real MAC-pipeline fix (Stage 1a/1b
split) and its real result on both N8 (WNS 0.000ns -> +0.108ns) and
N16 (now closed, WNS=+0.269ns) -- N16 is a real, verified candidate
for a future board revision, N8 remains the configuration in current
physical fabrication.

tests_timing.tex: extended P&R history table, real N8/N16 signoff
tables (post-fix), the new N16 critical path (Director queue logic,
still route-dominated) and the negative result of a second directive
attempt (confirms current result is the best found). Added a new,
clearly-labeled PROJECTION (not a measurement) for N16 vs ESP32-S3 --
30-68x range, built from real measured scaling factors (same core
count as the original ECP5 comparison, real clock ratio, real 2x INT8
packing factor) -- more grounded than the old, superseded ~55-85x
figure, with the same DDR3-bandwidth-bound honest caveat carried
forward.

datasheet.tex: N8/N16 side-by-side timing/utilization/performance
tables, open items and revision history updated to reflect physical
fabrication status and the N16 candidate decision.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MUG92aM9m68TRc4rG55BcC
This commit is contained in:
2026-09-22 00:59:46 +02:00
co-authored by Claude Sonnet 5
parent 2ab2ff7769
commit cc6cfe168e
3 changed files with 263 additions and 109 deletions
+72 -19
View File
@@ -6,12 +6,19 @@
Il design realizzato in FPGA \`e un acceleratore per reti neurali Il design realizzato in FPGA \`e un acceleratore per reti neurali
quantizzate INT8, organizzato come un insieme di \textbf{elementi di quantizzate INT8, organizzato come un insieme di \textbf{elementi di
elaborazione} (Processing Element, PE) paralleli che condividono un elaborazione} (Processing Element, PE) paralleli che condividono un
unico canale DDR3 reale. La configurazione attualmente definitiva unico canale DDR3 reale, secondo un'architettura sistolica a
(Capitolo~\ref{chap:tests}) \`e \textbf{N=8}: 8 PE reali, organizzati \emph{broadcast dei pesi condiviso} (\emph{shared-weight broadcast}).
in \textbf{2 gruppi da 4 PE ciascuno}, secondo un'architettura
sistolica a \emph{broadcast dei pesi condiviso} (\emph{shared-weight \textbf{Stato reale a due configurazioni (Capitolo~\ref{chap:tests})}:
broadcast}). Il modulo top-level reale \`e \textbf{N=8} (\texttt{n8\_system\_ddr3\_top.v}, 2 gruppi da 4 PE) \`e
\texttt{hardware/v3/rtl/n8\_system\_ddr3\_top.v}. la configurazione attualmente in fabbricazione fisica sulla scheda
reale. \textbf{N=16} (\texttt{n16\_system\_ddr3\_top.v}, 4 gruppi da 4
PE) \`e ora, a seguito di una correzione reale del datapath MAC
(\S\ref{sec:mac-pipeline}), \textbf{funzionalmente verificata E con
timing reale chiuso} su un branch di sviluppo dedicato
(\texttt{n16-timing-closure}), non ancora promossa alla scheda fisica
in produzione --- una decisione hardware reale, non RTL, ancora da
prendere.
L'intero design gira in un unico dominio di clock reale a L'intero design gira in un unico dominio di clock reale a
\textbf{155.039\,MHz} (\texttt{ui\_clk}, derivato dal MIG DDR3, \textbf{155.039\,MHz} (\texttt{ui\_clk}, derivato dal MIG DDR3,
@@ -38,9 +45,45 @@ Al clock reale di 155.039\,MHz, il picco teorico per singolo PE \`e:
Questo nucleo \`e rimasto \emph{invariato} (stesso numero di DSP, Questo nucleo \`e rimasto \emph{invariato} (stesso numero di DSP,
stessa struttura) dalla primissima sintesi reale del progetto fino stessa struttura) dalla primissima sintesi reale del progetto fino
alla configurazione N=8 attuale: \`e la parte pi\`u stabile ed efficiente alla configurazione N=8: \`e la parte pi\`u stabile ed efficiente
del design, e non \`e mai stato il collo di bottiglia delle prestazioni del design. A N=16 (\S\ref{sec:mac-pipeline}) \`e per\`o diventato,
(si veda \S\ref{sec:bottleneck}). per la prima volta, il vero collo di bottiglia di temporizzazione ---
non del throughput di calcolo (\S\ref{sec:bottleneck}), ma della
temporizzazione fisica del place-and-route.
\subsection{Correzione reale: pipeline aggiuntiva nel datapath MAC (per N=16)}
\label{sec:mac-pipeline}
A N=16, il margine di temporizzazione reale --- gi\`a estremamente
sottile a N=2 (+0.0999962\,ns) --- \`e stato eroso oltre lo zero dalla
maggiore congestione fisica complessiva del die (WNS reale misurato:
$-0.338$\,ns, dopo un arbitro gerarchico e un tuning delle direttive
di place-and-route, Capitolo~\ref{chap:tests}). Il percorso critico
reale, tracciato (non ipotizzato) fino al livello del singolo
registro, va dall'uscita del moltiplicatore DSP48E1 (gi\`a
ri-temporizzata automaticamente da Vivado) attraverso la logica di
``spacchettamento'' dei due prodotti INT8 impacchettati (uno shift e
una somma di riporto condizionale, dominata da primitive CARRY4) fino
al registro che cattura il risultato --- tutto in un solo ciclo di
clock.
\textbf{Correzione reale applicata}: lo stadio originale \`e stato
spezzato in due stadi di pipeline reali distinti --- il primo registra
il prodotto grezzo del DSP48E1 senza alcuna logica intermedia; il
secondo esegue lo spacchettamento (matematica identica, invariata bit
per bit) a partire dal valore gi\`a registrato. Il costo reale: un solo
ciclo di clock aggiuntivo di latenza per operazione, senza alcun
impatto sul throughput (l'interfaccia a maniglia valid/ready non
assume mai una latenza fissa). Verificato bit-esatto in isolamento
(18/18 PASS contro 2 core reali di riferimento) e funzionalmente
sull'intero sistema N=16 su DDR3 reale (32/32 PASS).
\textbf{Risultato reale}: con questa sola correzione, il timing di
N=16 \textbf{chiude realmente} (WNS $=+0.269$\,ns, WHS $=+0.026$\,ns,
0 endpoint falliti) --- si veda il Capitolo~\ref{chap:tests} per i
numeri completi. La stessa correzione, applicata anche a N=8, migliora
pure il suo margine (da 0.000\,ns esatto a +0.108\,ns) senza alcuna
regressione funzionale in nessuna delle due configurazioni.
\section{L'architettura sistolica a gruppi (N=8)} \section{L'architettura sistolica a gruppi (N=8)}
@@ -180,20 +223,30 @@ margine di scalabilit\`a residuo del chip \`e ampio sul lato
computazionale, ma \`e vincolato dal canale di memoria condiviso, non computazionale, ma \`e vincolato dal canale di memoria condiviso, non
dalla logica di calcolo. dalla logica di calcolo.
\section{Configurazioni alternative esplorate} \section{Configurazioni esplorate e stato reale attuale}
Lo stesso RTL sistolico, tramite il parametro reale \texttt{N\_GROUPS}, Lo stesso RTL sistolico, tramite il parametro reale \texttt{N\_GROUPS},
\`e stato realmente sintetizzato e verificato anche a: \`e stato realmente sintetizzato e verificato a pi\`u configurazioni:
\begin{itemize} \begin{itemize}
\item \textbf{N=4} (1 gruppo, 4 PE, 32 DSP48E1) --- funzionante, \item \textbf{N=4} (1 gruppo, 4 PE, 32 DSP48E1) --- funzionante,
margine di timing quasi nullo. margine di timing quasi nullo (non ancora rifinito con la
\item \textbf{N=16} (4 gruppi, 16 PE, 128 DSP48E1) --- funzionalmente correzione di \S\ref{sec:mac-pipeline}).
verificato su DDR3 reale, ma con temporizzazione non ancora chiusa \item \textbf{N=8} (\texttt{n8\_system\_ddr3\_top.v}) --- \textbf{la
(si veda \S~\ref{sec:pnr-history}) --- mantenuto come lavoro futuro configurazione fisicamente in fabbricazione sulla scheda reale
documentato, non abbandonato. attuale.} Timing chiuso, WNS $=+0.108$\,ns con la correzione MAC.
\item \textbf{N=16} (\texttt{n16\_system\_ddr3\_top.v}) --- dopo la
correzione di \S\ref{sec:mac-pipeline}, \textbf{funzionalmente
verificato E con timing reale chiuso} (WNS $=+0.269$\,ns), su un
branch di sviluppo reale (\texttt{n16-timing-closure}) separato
dalla scheda in produzione. \`E ora un candidato reale, verificato,
per una futura revisione della scheda --- non ancora promosso alla
produzione fisica corrente, una decisione hardware reale ancora da
prendere con l'utente.
\end{itemize} \end{itemize}
N=8 \`e stata scelta come configurazione reale definitiva perch\'e N=8 resta, ad oggi, la configurazione realmente fabbricata. N=16 non
\`e la pi\`u grande che chiude realmente il timing con margine \`e pi\`u un limite architetturale reale (come inizialmente sembrava),
positivo (Capitolo~\ref{chap:tests}). ma una reale, verificata alternativa a parallelismo doppio, la cui
adozione fisica dipende ora da una scelta dell'utente, non da un
vincolo tecnico residuo.
+73 -53
View File
@@ -106,12 +106,17 @@ shared-weight-broadcast systolic architecture), reducing redundant
DDR3 weight traffic without the complexity of a literal PE-to-PE DDR3 weight traffic without the complexity of a literal PE-to-PE
systolic pipeline. systolic pipeline.
N8 is the current, definitive, real deployment configuration of the N8 is the configuration currently in real physical board fabrication.
FPGA-Neural family: it is the largest core count in the family that A real MAC-datapath pipeline fix (developed on the
closes real static timing on the target part with a real, verified \texttt{n16-timing-closure} branch, isolated from the board already in
margin. Smaller (N=2, N=4) and larger (N=16) configurations of the production) has since ALSO closed real static timing for \textbf{N16}
same RTL exist and are documented (see \S\ref{sec:variants}), but N8 with a comfortable real margin (WNS=+0.269\,ns) and improved N8's own
is the one recommended for real board fabrication. margin further (WNS=+0.108\,ns, up from the original exact-zero
0.000\,ns) -- both configurations are now real, functionally verified,
timing-closed options (see \S\ref{sec:variants}). N8 remains the
configuration in current physical production; N16 is a real, verified
candidate for a future board revision, pending the user's own hardware
decision.
\clearpage \clearpage
@@ -132,14 +137,14 @@ for reference.
\toprule \toprule
\textbf{Variant} & \textbf{PEs} & \textbf{DSP48E1} & \textbf{Real WNS} & \textbf{Status} & \textbf{Top-level file} \\ \textbf{Variant} & \textbf{PEs} & \textbf{DSP48E1} & \textbf{Real WNS} & \textbf{Status} & \textbf{Top-level file} \\
\midrule \midrule
N2 & 2 & 16 & +0.100\,ns & \textbf{Closed, deployable fallback} & \texttt{n2\_system\_ddr3\_top.v} \\ N2 & 2 & 16 & +0.100\,ns & Closed, deployable fallback & \texttt{n2\_system\_ddr3\_top.v} \\
N4 & 4 & 32 & $-0.005$\,ns & Nearly closed (2 failing endpoints) & \emph{(generic override only)} \\ N4 & 4 & 32 & $-0.005$\,ns & Nearly closed (2 failing endpoints), pre-fix & \emph{(generic override only)} \\
\rowcolor{dslight} \rowcolor{dslight}
N8 & 8 & 64 & \textbf{0.000\,ns} & \textbf{RECOMMENDED --- closed} & \texttt{n8\_system\_ddr3\_top.v} \\ N8 & 8 & 64 & \textbf{+0.108\,ns} & \textbf{IN PHYSICAL PRODUCTION --- closed} & \texttt{n8\_system\_ddr3\_top.v} \\
N16 & 16 & 128 & $-0.338$\,ns & Functional, timing not closed & \texttt{n16\_system\_ddr3\_top.v} \\ N16 & 16 & 128 & \textbf{+0.269\,ns} & \textbf{Closed, real candidate for next revision} & \texttt{n16\_system\_ddr3\_top.v} \\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\caption{Real family configurations. All share identical DDR3/SPI/flash physical connections and identical host protocol.} \caption{Real family configurations, post MAC-pipeline fix (\texttt{n16-timing-closure} branch) for N8/N16. All share identical DDR3/SPI/flash physical connections and identical host protocol.}
\end{table} \end{table}
%====================================================================== %======================================================================
@@ -322,46 +327,51 @@ CFGBVS & P8 & & & \\
\clearpage \clearpage
\section{Timing Characteristics} \section{Timing Characteristics}
Real, in-context Vivado place-and-route on XC7A100T-CSG324-2, N8 Real, in-context Vivado place-and-route on XC7A100T-CSG324-2, both
configuration (\texttt{n8\_system\_ddr3\_top.v}), directive stack with the real MAC-pipeline fix (\texttt{n16-timing-closure} branch),
directive stack
\texttt{Explore}/\texttt{ExtraNetDelay\_high}/\texttt{AggressiveExplore}: \texttt{Explore}/\texttt{ExtraNetDelay\_high}/\texttt{AggressiveExplore}:
\begin{table}[h] \begin{table}[h]
\centering \centering
\renewcommand{\arraystretch}{1.2} \renewcommand{\arraystretch}{1.2}
\begin{tabular}{lll} \begin{tabular}{llll}
\toprule \toprule
\textbf{Parameter} & \textbf{Value} & \textbf{Condition} \\ \textbf{Parameter} & \textbf{N8 (in production)} & \textbf{N16 (verified)} & \textbf{Condition} \\
\midrule \midrule
Setup slack (WNS) & \textbf{0.000\,ns} & \texttt{clk\_pll\_i}, 155.039\,MHz, 0 of 63212 failing \\ Setup slack (WNS) & +0.108\,ns & +0.269\,ns & \texttt{clk\_pll\_i}, 155.039\,MHz, 0 failing \\
Hold slack (WHS) & +0.017\,ns & 0 of 63209 failing \\ Hold slack (WHS) & +0.036\,ns & +0.026\,ns & 0 failing \\
Compute-domain clock period & 6.450\,ns & 155.039\,MHz \\ Compute-domain clock period & 6.450\,ns & 6.450\,ns & 155.039\,MHz \\
DDR3 CAS latency (real, measured) & CL=5 (16.125\,ns) & matches MIG configuration \\ DDR3 CAS latency (real, measured) & \multicolumn{2}{c}{CL=5 (16.125\,ns)} & matches MIG configuration \\
Same-row read-to-read & 12.9\,ns & real JEDEC trace \\ Same-row read-to-read & \multicolumn{2}{c}{12.9\,ns} & real JEDEC trace \\
Row-switch (Activate$\to$Read) penalty & +25--130\% & vs.\ same-row access, real measured \\ Row-switch penalty & \multicolumn{2}{c}{+25--130\%} & vs.\ same-row access, real measured \\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\end{table} \end{table}
\noindent\textbf{Margin notice:} the real WNS is exactly zero --- closed, \noindent\textbf{Margin notice:} both real margins are positive and
but with no spare slack. Any RTL modification to this configuration closed. N8's own pre-fix signoff (\texttt{n8\_system\_ddr3\_top.v}
requires a fresh real place-and-route run (same directive stack) before without the MAC-pipeline fix, the version currently in physical
the design may be considered timing-clean again. fabrication) closed at an exact-zero WNS=0.000\,ns, no spare slack ---
the improved +0.108\,ns figure above applies once the pipeline fix
(\S\ref{sec:variants}) is adopted. Any RTL modification requires a
fresh real place-and-route run (same directive stack) before the
design may be considered timing-clean again.
%====================================================================== %======================================================================
\section{Resource Utilization (XC7A100T-CSG324-2, N8)} \section{Resource Utilization (XC7A100T-CSG324-2)}
\begin{table}[h] \begin{table}[h]
\centering \centering
\renewcommand{\arraystretch}{1.2} \renewcommand{\arraystretch}{1.2}
\begin{tabular}{lrrr} \begin{tabular}{lrrrr}
\toprule \toprule
\textbf{Resource} & \textbf{Used} & \textbf{Available} & \textbf{Utilization} \\ \textbf{Resource} & \textbf{N8 Used} & \textbf{N16 Used} & \textbf{Available} & \textbf{N8 / N16 Util.} \\
\midrule \midrule
Slice LUTs & 12535 & 63400 & 19.77\% \\ Slice LUTs & 12536 & 19903 & 63400 & 19.77\% / 31.39\% \\
Slice Registers & 19902 & 126800 & 15.70\% \\ Slice Registers & 19910 & 35409 & 126800 & 15.70\% / 27.93\% \\
DSP48E1 & 64 & 240 & 26.7\% \\ DSP48E1 & 64 & 128 & 240 & 26.7\% / 53.33\% \\
Block RAM & 0 & 135 & 0\% \\ Block RAM & 0 & 0 & 135 & 0\% / 0\% \\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\end{table} \end{table}
@@ -371,28 +381,29 @@ Block RAM & 0 & 135 & 0\% \\
\begin{table}[h] \begin{table}[h]
\centering \centering
\begin{tabular}{ll} \begin{tabular}{lll}
\toprule \toprule
\textbf{Parameter} & \textbf{Value} \\ \textbf{Parameter} & \textbf{N8} & \textbf{N16} \\
\midrule \midrule
MAC operations per DSP48E1 per cycle & 2 (packed INT8, lane A + lane B) \\ MAC operations per DSP48E1 per cycle & \multicolumn{2}{c}{2 (packed INT8, lane A + lane B)} \\
DSP48E1 per processing element & 8 \\ DSP48E1 per processing element & \multicolumn{2}{c}{8} \\
MAC/cycle per PE & 16 \\ MAC/cycle per PE & \multicolumn{2}{c}{16} \\
Real parallel PEs & 8 \\ Real parallel PEs & 8 & 16 \\
Aggregate MAC/cycle & 128 \\ Aggregate MAC/cycle & 128 & 256 \\
\textbf{Aggregate peak throughput} (calculated, 155.039\,MHz) & \textbf{$\sim$19.84\,GMAC/s} \\ \textbf{Aggregate peak throughput} (calc., 155.039\,MHz) & \textbf{$\sim$19.84\,GMAC/s} & \textbf{$\sim$39.69\,GMAC/s} \\
Real DDR3 physical bandwidth ceiling & $\sim$2.48\,GB/s (shared across all 8 PEs) \\ Real DDR3 bandwidth ceiling (shared) & \multicolumn{2}{c}{$\sim$2.48\,GB/s} \\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\end{table} \end{table}
\noindent The peak MAC figure is a real calculation from measured \noindent The peak MAC figures are a real calculation from measured
building blocks (DSP count $\times$ packing factor $\times$ measured building blocks (DSP count $\times$ packing factor $\times$ measured
Fmax) --- not itself an independently benchmarked sustained-throughput Fmax) --- not themselves independently benchmarked sustained-throughput
number. Sustained throughput on a real workload is bounded by the real numbers. Sustained throughput on a real workload is bounded by the real
DDR3 bandwidth ceiling above, shared across all active PEs; a direct DDR3 bandwidth ceiling above, shared across all active PEs (more
measurement of sustained aggregate throughput at N8 has not yet been tightly at N16, twice the PEs on the same physical channel); a direct
performed (see \S\ref{sec:openitems}). measurement of sustained aggregate throughput has not yet been
performed at either N (see \S\ref{sec:openitems}).
%====================================================================== %======================================================================
\section{Host Communication Protocol} \section{Host Communication Protocol}
@@ -470,8 +481,8 @@ Host MCU & ESP32-S3-WROOM-1-N16R8 & In stock, LCSC C2913202 \\
\label{sec:openitems} \label{sec:openitems}
\begin{itemize} \begin{itemize}
\item Physical board has not yet been fabricated; no real \item Physical board fabrication is underway (N8 configuration,
electrical/thermal measurement exists yet. unmodified); no real electrical/thermal measurement exists yet.
\item \texttt{sys\_clk} oscillator requires a custom-programmed order \item \texttt{sys\_clk} oscillator requires a custom-programmed order
(no off-the-shelf SKU at 310.077\,MHz). (no off-the-shelf SKU at 310.077\,MHz).
\item Power-tree regulators (VCCINT, VCCAUX, VTT, per-bank VCCO) not \item Power-tree regulators (VCCINT, VCCAUX, VTT, per-bank VCCO) not
@@ -481,10 +492,14 @@ Host MCU & ESP32-S3-WROOM-1-N16R8 & In stock, LCSC C2913202 \\
\item ESP32-side firmware (JTAG bit-banging, SPI host driver, \item ESP32-side firmware (JTAG bit-banging, SPI host driver,
result-readback address translation) not yet written --- software result-readback address translation) not yet written --- software
work outside this document's scope. work outside this document's scope.
\item Real, direct sustained-throughput benchmark at N8 (vs.\ a \item Real, direct sustained-throughput benchmark (vs.\ a real
real ESP32-S3 baseline) not yet performed --- see the project's ESP32-S3 baseline) not yet performed at either N8 or N16 --- see
Tests \& Timing chapter for the honest historical comparison the project's Tests \& Timing chapter for the honest historical
context. comparison context and a real, clearly-labeled projection for N16.
\item Whether to adopt N16 (real, functionally verified, timing-
closed on the \texttt{n16-timing-closure} branch) for a future
board revision is a real, open hardware decision, not an RTL
blocker.
\end{itemize} \end{itemize}
%====================================================================== %======================================================================
@@ -497,6 +512,11 @@ Host MCU & ESP32-S3-WROOM-1-N16R8 & In stock, LCSC C2913202 \\
\textbf{Rev.} & \textbf{Date} & \textbf{Description} \\ \textbf{Rev.} & \textbf{Date} & \textbf{Description} \\
\midrule \midrule
1.0 & 2026-09-21 & Initial preliminary datasheet, N8 configuration \\ 1.0 & 2026-09-21 & Initial preliminary datasheet, N8 configuration \\
1.1 & 2026-09-22 & N8 re-verified with a real MAC-pipeline fix
(WNS improved 0.000\,ns $\to$ +0.108\,ns); N16 now also real,
functionally verified, and timing-closed (WNS=+0.269\,ns) on a
separate development branch, documented as a real candidate for a
future board revision \\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\end{table} \end{table}
+118 -37
View File
@@ -75,12 +75,14 @@ di sintesi fuori contesto.
0094 & + arbitro gerarchico a 2 livelli & 16 & $-0.646$ (ancora fallito) & 19936 & 128 \\ 0094 & + arbitro gerarchico a 2 livelli & 16 & $-0.646$ (ancora fallito) & 19936 & 128 \\
0094 & + tuning delle direttive P\&R & 16 & $-0.338$ (ancora fallito) & 19936 & 128 \\ 0094 & + tuning delle direttive P\&R & 16 & $-0.338$ (ancora fallito) & 19936 & 128 \\
0095 & curva N=4 (1 gruppo) & 4 & $-0.005$ (2 endpoint falliti) & 8794 & 32 \\ 0095 & curva N=4 (1 gruppo) & 4 & $-0.005$ (2 endpoint falliti) & 8794 & 32 \\
\textbf{0095/0096} & \textbf{\texttt{n8\_system\_ddr3\_top.v}, definitivo} & \textbf{8} & \textbf{0.000 (CHIUSO)} & \textbf{12535} & \textbf{64} \\ 0095/0096 & \texttt{n8\_system\_ddr3\_top.v}, in fabbricazione fisica & 8 & 0.000 (CHIUSO) & 12535 & 64 \\
0097 & + pipeline MAC aggiuntiva (branch \texttt{n16-timing-closure}) & 8 & +0.108 (CHIUSO, migliorato) & 12536 & 64 \\
\textbf{0097} & \textbf{+ pipeline MAC aggiuntiva} & \textbf{16} & \textbf{+0.269 (CHIUSO)} & \textbf{19903} & \textbf{128} \\
\bottomrule \bottomrule
\caption{Cronologia reale dei segni di place-and-route, dal primo P\&R in contesto fino al target definitivo N=8.} \caption{Cronologia reale dei segni di place-and-route, dal primo P\&R in contesto fino ai risultati pi\`u recenti su entrambe le configurazioni N=8 e N=16.}
\end{longtable} \end{longtable}
\subsection{Il segno definitivo: N=8} \subsection{Il segno in fabbricazione fisica: N=8}
\begin{table}[h] \begin{table}[h]
\centering \centering
@@ -90,40 +92,72 @@ di sintesi fuori contesto.
\midrule \midrule
Clock PHY DDR3 (sys\_clk\_p/n) & 310.078\,MHz (periodo 3.225\,ns) \\ Clock PHY DDR3 (sys\_clk\_p/n) & 310.078\,MHz (periodo 3.225\,ns) \\
Clock di calcolo (ui\_clk/clk\_pll\_i) & 155.039\,MHz \\ Clock di calcolo (ui\_clk/clk\_pll\_i) & 155.039\,MHz \\
WNS (setup slack) & \textbf{0.000\,ns} --- chiuso, 0 endpoint falliti \\ WNS (setup slack) & \textbf{+0.108\,ns} --- chiuso, con la correzione pipeline MAC (EXP-0097) \\
WHS (hold slack) & +0.017\,ns \\ WHS (hold slack) & +0.036\,ns \\
Endpoint falliti & 0 su 63212 (setup), 0 su 63209 (hold) \\ Endpoint falliti & 0 (setup e hold) \\
LUT utilizzate & 12535 / 63400 (19.77\%) \\ LUT utilizzate & 12536 / 63400 (19.77\%) \\
Registri utilizzati & 19902 / 126800 (15.70\%) \\ Registri utilizzati & 19910 / 126800 (15.70\%) \\
DSP48E1 utilizzati & 64 / 240 (26.7\%) \\ DSP48E1 utilizzati & 64 / 240 (26.7\%) \\
Parallelismo reale & 8 elementi di elaborazione paralleli \\ Parallelismo reale & 8 elementi di elaborazione paralleli \\
\bottomrule \bottomrule
\end{tabular} \end{tabular}
\caption{Segno di temporizzazione reale, definitivo, per \texttt{n8\_system\_ddr3\_top.v} (EXP-0095/0096).} \caption{Segno di temporizzazione reale per \texttt{n8\_system\_ddr3\_top.v} con la correzione pipeline MAC (EXP-0097) --- la configurazione fisicamente in fabbricazione. Il segno originale (pre-correzione, EXP-0095/0096) chiudeva a WNS=0.000\,ns esatto, senza margine di riserva; questa correzione lo migliora senza alcuna regressione funzionale.}
\end{table} \end{table}
\textbf{Nota importante, dichiarata onestamente}: il margine WNS=0.000\,ns \subsection{Il nuovo segno reale: N=16 ORA CHIUDE}
\`e \emph{esattamente} zero --- reale e chiuso, ma senza alcuno slack di \label{sec:n16-closed}
riserva. Qualunque futura modifica RTL a questo top-level o ai suoi
moduli dipendenti richiede un nuovo, vero place-and-route (con la
stessa sequenza di direttive: \texttt{opt\_design -directive Explore},
\texttt{place\_design -directive ExtraNetDelay\_high},
\texttt{phys\_opt\_design -directive AggressiveExplore},
\texttt{route\_design -directive AggressiveExplore}) prima di
fidarsi nuovamente della temporizzazione.
\subsection{Il collo di bottiglia reale trovato a N=16} Il percorso critico che inizialmente impediva la chiusura del timing a
N=16 \`e stato tracciato realmente (non ipotizzato) fino all'interno
Il percorso critico che impedisce la chiusura del timing a N=16 del datapath MAC di \texttt{neural\_processor\_packed.v} --- lo stesso
\`e stato tracciato realmente (non ipotizzato) fino all'interno del
datapath MAC di \texttt{neural\_processor\_packed.v} --- lo stesso
nucleo di calcolo descritto nel Capitolo~\ref{chap:architecture}, nucleo di calcolo descritto nel Capitolo~\ref{chap:architecture},
invariato dalla prima versione del progetto, che a N=2 chiudeva gi\`a invariato dalla prima versione del progetto, che a N=2 chiudeva gi\`a
con un margine estremamente sottile (+0.0999\,ns). A N=16 la maggiore con un margine estremamente sottile (+0.0999\,ns). A N=16 la maggiore
occupazione complessiva del die (31\% LUT) aumenta la congestione di occupazione complessiva del die (31\% LUT) aumentava la congestione di
piazzamento a sufficienza da erodere quel margine gi\`a minimo --- piazzamento a sufficienza da erodere quel margine gi\`a minimo.
un problema diffuso di congestione, non un singolo collo di bottiglia
strutturale come quello, gi\`a risolto, dell'arbitro. \textbf{Questo collo di bottiglia \`e stato risolto} (\S\ref{sec:mac-pipeline}
del Capitolo~\ref{chap:architecture}) aggiungendo un vero stadio di
pipeline nel datapath MAC. Risultato reale, su un branch di sviluppo
dedicato (\texttt{n16-timing-closure}), isolato dalla scheda fisica in
produzione:
\begin{table}[h]
\centering
\begin{tabular}{ll}
\toprule
\textbf{Metrica} & \textbf{Valore reale} \\
\midrule
WNS (setup slack) & \textbf{+0.269\,ns} --- \textbf{CHIUSO} \\
WHS (hold slack) & +0.026\,ns \\
Endpoint falliti & 0 su 106087 (setup), 0 su 106084 (hold) \\
LUT utilizzate & 19903 / 63400 (31.39\%) \\
Registri utilizzati & 35409 / 126800 (27.93\%) \\
DSP48E1 utilizzati & 128 / 240 (53.33\%) \\
Parallelismo reale & 16 elementi di elaborazione paralleli \\
Verifica funzionale & 32/32 PASS su DDR3 reale (\texttt{tb\_n16\_system\_ddr3.v}) \\
\bottomrule
\end{tabular}
\caption{Segno di temporizzazione reale per \texttt{n16\_system\_ddr3\_top.v} con la correzione pipeline MAC (EXP-0097). Margine reale migliore di quello storico originale di N=2 (+0.0999\,ns).}
\end{table}
Dopo questa correzione, il percorso critico si \`e spostato di nuovo
(prova reale che la correzione ha effettivamente risolto il proprio
problema specifico): ora si trova nella logica di aggiornamento della
coda del Director (\texttt{neural\_director\_grouped.v}), ancora
dominato dal routing fisico (73\%) pi\`u che dalla profondit\`a
logica. Un secondo tentativo reale con direttive di place-and-route
alternative ha dato un risultato \emph{peggiore} (+0.168\,ns), confermando
che il margine attuale (+0.269\,ns) \`e gi\`a il migliore risultato
reale ottenuto con il solo tuning delle direttive, senza ulteriori
modifiche RTL.
\textbf{Stato reale onesto}: N=16 non \`e pi\`u limitato da un vincolo
tecnico di temporizzazione. La sua adozione come scheda fisica \`e ora
una decisione dell'utente, non un problema RTL ancora aperto. La
scheda fisica attualmente in fabbricazione resta N=8 (fabbricazione
gi\`a avviata al momento di questa correzione); N=16 \`e un candidato
reale, verificato, per una futura revisione.
\section{Confronto con un riferimento reale: ESP32-S3} \section{Confronto con un riferimento reale: ESP32-S3}
\label{sec:esp32-comparison} \label{sec:esp32-comparison}
@@ -153,22 +187,69 @@ come attuale un dato ormai superato.
\textbf{Stato onesto attuale}: non esiste ancora una misura reale, \textbf{Stato onesto attuale}: non esiste ancora una misura reale,
diretta, di throughput aggregato (inferenze al secondo, o MAC/s diretta, di throughput aggregato (inferenze al secondo, o MAC/s
sostenuti) della configurazione N=8 definitiva confrontata con un sostenuti) di nessuna configurazione (N=8 o N=16) confrontata con un
benchmark ESP32-S3 aggiornato. Il picco teorico calcolabile per N=8 benchmark ESP32-S3 aggiornato. Il picco teorico calcolabile,
\`e: puramente computazionale, \`e:
\[ \[
8~\text{PE} \times 16~\text{MAC/ciclo} \times 155.039\times10^6~\text{cicli/s} = 19.84~\text{GMAC/s di picco teorico aggregato} 8~\text{PE} \times 16~\text{MAC/ciclo} \times 155.039\times10^6~\text{cicli/s} = 19.84~\text{GMAC/s di picco teorico aggregato (N=8)}
\]
\[
16~\text{PE} \times 16~\text{MAC/ciclo} \times 155.039\times10^6~\text{cicli/s} = 39.69~\text{GMAC/s di picco teorico aggregato (N=16)}
\] \]
ma questo \`e un limite superiore puramente computazionale: dato il ma questo \`e un limite superiore puramente computazionale: dato il
vincolo reale di banda DDR3 (2.48\,GB/s fisici, condivisi tra tutti vincolo reale di banda DDR3 (2.48\,GB/s fisici, condivisi tra tutti i
gli 8 PE), il throughput realmente sostenibile in un carico di lavoro PE attivi), il throughput realmente sostenibile in un carico di lavoro
reale sar\`a inferiore, nella stessa misura gi\`a documentata a N=1/2 reale sar\`a inferiore, nella stessa misura gi\`a documentata a N=1/2
(\S~\ref{sec:bottleneck}) --- una misura reale e diretta di questo (\S~\ref{sec:bottleneck}) --- e la condivisione dello stesso canale
throughput sostenuto a N=8, e un nuovo confronto onesto con un DDR3 tra il doppio dei PE a N=16 rende questo vincolo ANCORA PI\`U
benchmark ESP32-S3 aggiornato, restano lavoro futuro non ancora stringente rispetto a N=8, non meno.
eseguito.
\subsection{Una nuova stima onesta per N=16 (proiezione, non misura)}
Su richiesta esplicita, ecco una stima reale --- costruita da dati
reali gi\`a misurati, ma essa stessa \textbf{una proiezione, non una
nuova misura diretta} --- pi\`u solida della vecchia proiezione
$\sim$55--85$\times$ ormai superata (sopra), perch\'e confronta lo
\textbf{stesso numero di core} (16 vs 16) invece di ipotizzare 30 core
limitati solo dai DSP:
\begin{table}[h]
\centering
\begin{tabular}{lll}
\toprule
\textbf{Fattore di scala reale} & \textbf{Base} & \textbf{Valore} \\
\midrule
Numero di core & 16 (ECP5) vs 16 (Artix-7 N=16) & $1\times$ (confronto diretto) \\
Rapporto di clock & 155.039\,MHz vs 64--97\,MHz (reale, ECP5) & $1.60\times$--$2.42\times$ \\
Packing INT8 per DSP & 2 MAC/DSP (Artix-7) vs 1 MAC/DSP (ECP5, non impacchettato) & $2\times$ \\
\midrule
\textbf{Fattore di scala combinato} & & \textbf{$3.20\times$--$4.85\times$} \\
\bottomrule
\end{tabular}
\caption{Fattori di scala reali (misurati) tra l'architettura ECP5 (v2) e Artix-7 N=16 (v3), a parit\`a di numero di core.}
\end{table}
Applicando questo fattore di scala al dato reale, misurato,
$\sim$9.5--14$\times$ su ESP32-S3 (stesso workload MobileFaceNet-class):
\[
9.5\times3.20 \approx \mathbf{30\times} \qquad\qquad 14\times4.85 \approx \mathbf{68\times}
\]
\textbf{Stima onesta}: N=16, su un carico di lavoro simile a quello
del confronto originale, \`e plausibilmente nell'ordine di
\textbf{30--68$\times$ ESP32-S3} (punto centrale $\sim$45$\times$) ---
una proiezione di puro throughput di calcolo, costruita da fattori di
scala reali, \textbf{non una misura diretta}. Il dato esatto reale
richiede un vero benchmark end-to-end (stesso workload, hardware
reale o simulazione a livello di sistema completo) --- non ancora
eseguito. Come per N=8, il vincolo reale di banda DDR3
(\S~\ref{sec:bottleneck}) former\`a probabilmente un tetto reale
inferiore a questa proiezione puramente computazionale su un carico
di lavoro reale, specialmente a N=16 dove pi\`u PE condividono lo
stesso canale fisico.
\section{Lezioni reali dal processo di verifica} \section{Lezioni reali dal processo di verifica}