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:
+72
-19
@@ -6,12 +6,19 @@
|
||||
Il design realizzato in FPGA \`e un acceleratore per reti neurali
|
||||
quantizzate INT8, organizzato come un insieme di \textbf{elementi di
|
||||
elaborazione} (Processing Element, PE) paralleli che condividono un
|
||||
unico canale DDR3 reale. La configurazione attualmente definitiva
|
||||
(Capitolo~\ref{chap:tests}) \`e \textbf{N=8}: 8 PE reali, organizzati
|
||||
in \textbf{2 gruppi da 4 PE ciascuno}, secondo un'architettura
|
||||
sistolica a \emph{broadcast dei pesi condiviso} (\emph{shared-weight
|
||||
broadcast}). Il modulo top-level reale \`e
|
||||
\texttt{hardware/v3/rtl/n8\_system\_ddr3\_top.v}.
|
||||
unico canale DDR3 reale, secondo un'architettura sistolica a
|
||||
\emph{broadcast dei pesi condiviso} (\emph{shared-weight broadcast}).
|
||||
|
||||
\textbf{Stato reale a due configurazioni (Capitolo~\ref{chap:tests})}:
|
||||
\textbf{N=8} (\texttt{n8\_system\_ddr3\_top.v}, 2 gruppi da 4 PE) \`e
|
||||
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
|
||||
\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,
|
||||
stessa struttura) dalla primissima sintesi reale del progetto fino
|
||||
alla configurazione N=8 attuale: \`e la parte pi\`u stabile ed efficiente
|
||||
del design, e non \`e mai stato il collo di bottiglia delle prestazioni
|
||||
(si veda \S\ref{sec:bottleneck}).
|
||||
alla configurazione N=8: \`e la parte pi\`u stabile ed efficiente
|
||||
del design. A N=16 (\S\ref{sec:mac-pipeline}) \`e per\`o diventato,
|
||||
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)}
|
||||
|
||||
@@ -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
|
||||
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},
|
||||
\`e stato realmente sintetizzato e verificato anche a:
|
||||
\`e stato realmente sintetizzato e verificato a pi\`u configurazioni:
|
||||
|
||||
\begin{itemize}
|
||||
\item \textbf{N=4} (1 gruppo, 4 PE, 32 DSP48E1) --- funzionante,
|
||||
margine di timing quasi nullo.
|
||||
\item \textbf{N=16} (4 gruppi, 16 PE, 128 DSP48E1) --- funzionalmente
|
||||
verificato su DDR3 reale, ma con temporizzazione non ancora chiusa
|
||||
(si veda \S~\ref{sec:pnr-history}) --- mantenuto come lavoro futuro
|
||||
documentato, non abbandonato.
|
||||
margine di timing quasi nullo (non ancora rifinito con la
|
||||
correzione di \S\ref{sec:mac-pipeline}).
|
||||
\item \textbf{N=8} (\texttt{n8\_system\_ddr3\_top.v}) --- \textbf{la
|
||||
configurazione fisicamente in fabbricazione sulla scheda reale
|
||||
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}
|
||||
|
||||
N=8 \`e stata scelta come configurazione reale definitiva perch\'e
|
||||
\`e la pi\`u grande che chiude realmente il timing con margine
|
||||
positivo (Capitolo~\ref{chap:tests}).
|
||||
N=8 resta, ad oggi, la configurazione realmente fabbricata. N=16 non
|
||||
\`e pi\`u un limite architetturale reale (come inizialmente sembrava),
|
||||
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
@@ -106,12 +106,17 @@ shared-weight-broadcast systolic architecture), reducing redundant
|
||||
DDR3 weight traffic without the complexity of a literal PE-to-PE
|
||||
systolic pipeline.
|
||||
|
||||
N8 is the current, definitive, real deployment configuration of the
|
||||
FPGA-Neural family: it is the largest core count in the family that
|
||||
closes real static timing on the target part with a real, verified
|
||||
margin. Smaller (N=2, N=4) and larger (N=16) configurations of the
|
||||
same RTL exist and are documented (see \S\ref{sec:variants}), but N8
|
||||
is the one recommended for real board fabrication.
|
||||
N8 is the configuration currently in real physical board fabrication.
|
||||
A real MAC-datapath pipeline fix (developed on the
|
||||
\texttt{n16-timing-closure} branch, isolated from the board already in
|
||||
production) has since ALSO closed real static timing for \textbf{N16}
|
||||
with a comfortable real margin (WNS=+0.269\,ns) and improved N8's own
|
||||
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
|
||||
|
||||
@@ -132,14 +137,14 @@ for reference.
|
||||
\toprule
|
||||
\textbf{Variant} & \textbf{PEs} & \textbf{DSP48E1} & \textbf{Real WNS} & \textbf{Status} & \textbf{Top-level file} \\
|
||||
\midrule
|
||||
N2 & 2 & 16 & +0.100\,ns & \textbf{Closed, deployable fallback} & \texttt{n2\_system\_ddr3\_top.v} \\
|
||||
N4 & 4 & 32 & $-0.005$\,ns & Nearly closed (2 failing endpoints) & \emph{(generic override only)} \\
|
||||
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), pre-fix & \emph{(generic override only)} \\
|
||||
\rowcolor{dslight}
|
||||
N8 & 8 & 64 & \textbf{0.000\,ns} & \textbf{RECOMMENDED --- closed} & \texttt{n8\_system\_ddr3\_top.v} \\
|
||||
N16 & 16 & 128 & $-0.338$\,ns & Functional, timing not closed & \texttt{n16\_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 & \textbf{+0.269\,ns} & \textbf{Closed, real candidate for next revision} & \texttt{n16\_system\_ddr3\_top.v} \\
|
||||
\bottomrule
|
||||
\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}
|
||||
|
||||
%======================================================================
|
||||
@@ -322,46 +327,51 @@ CFGBVS & P8 & & & \\
|
||||
\clearpage
|
||||
\section{Timing Characteristics}
|
||||
|
||||
Real, in-context Vivado place-and-route on XC7A100T-CSG324-2, N8
|
||||
configuration (\texttt{n8\_system\_ddr3\_top.v}), directive stack
|
||||
Real, in-context Vivado place-and-route on XC7A100T-CSG324-2, both
|
||||
with the real MAC-pipeline fix (\texttt{n16-timing-closure} branch),
|
||||
directive stack
|
||||
\texttt{Explore}/\texttt{ExtraNetDelay\_high}/\texttt{AggressiveExplore}:
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.2}
|
||||
\begin{tabular}{lll}
|
||||
\begin{tabular}{llll}
|
||||
\toprule
|
||||
\textbf{Parameter} & \textbf{Value} & \textbf{Condition} \\
|
||||
\textbf{Parameter} & \textbf{N8 (in production)} & \textbf{N16 (verified)} & \textbf{Condition} \\
|
||||
\midrule
|
||||
Setup slack (WNS) & \textbf{0.000\,ns} & \texttt{clk\_pll\_i}, 155.039\,MHz, 0 of 63212 failing \\
|
||||
Hold slack (WHS) & +0.017\,ns & 0 of 63209 failing \\
|
||||
Compute-domain clock period & 6.450\,ns & 155.039\,MHz \\
|
||||
DDR3 CAS latency (real, measured) & CL=5 (16.125\,ns) & matches MIG configuration \\
|
||||
Same-row read-to-read & 12.9\,ns & real JEDEC trace \\
|
||||
Row-switch (Activate$\to$Read) penalty & +25--130\% & vs.\ same-row access, real measured \\
|
||||
Setup slack (WNS) & +0.108\,ns & +0.269\,ns & \texttt{clk\_pll\_i}, 155.039\,MHz, 0 failing \\
|
||||
Hold slack (WHS) & +0.036\,ns & +0.026\,ns & 0 failing \\
|
||||
Compute-domain clock period & 6.450\,ns & 6.450\,ns & 155.039\,MHz \\
|
||||
DDR3 CAS latency (real, measured) & \multicolumn{2}{c}{CL=5 (16.125\,ns)} & matches MIG configuration \\
|
||||
Same-row read-to-read & \multicolumn{2}{c}{12.9\,ns} & real JEDEC trace \\
|
||||
Row-switch penalty & \multicolumn{2}{c}{+25--130\%} & vs.\ same-row access, real measured \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
\noindent\textbf{Margin notice:} the real WNS is exactly zero --- closed,
|
||||
but with no spare slack. Any RTL modification to this configuration
|
||||
requires a fresh real place-and-route run (same directive stack) before
|
||||
the design may be considered timing-clean again.
|
||||
\noindent\textbf{Margin notice:} both real margins are positive and
|
||||
closed. N8's own pre-fix signoff (\texttt{n8\_system\_ddr3\_top.v}
|
||||
without the MAC-pipeline fix, the version currently in physical
|
||||
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]
|
||||
\centering
|
||||
\renewcommand{\arraystretch}{1.2}
|
||||
\begin{tabular}{lrrr}
|
||||
\begin{tabular}{lrrrr}
|
||||
\toprule
|
||||
\textbf{Resource} & \textbf{Used} & \textbf{Available} & \textbf{Utilization} \\
|
||||
\textbf{Resource} & \textbf{N8 Used} & \textbf{N16 Used} & \textbf{Available} & \textbf{N8 / N16 Util.} \\
|
||||
\midrule
|
||||
Slice LUTs & 12535 & 63400 & 19.77\% \\
|
||||
Slice Registers & 19902 & 126800 & 15.70\% \\
|
||||
DSP48E1 & 64 & 240 & 26.7\% \\
|
||||
Block RAM & 0 & 135 & 0\% \\
|
||||
Slice LUTs & 12536 & 19903 & 63400 & 19.77\% / 31.39\% \\
|
||||
Slice Registers & 19910 & 35409 & 126800 & 15.70\% / 27.93\% \\
|
||||
DSP48E1 & 64 & 128 & 240 & 26.7\% / 53.33\% \\
|
||||
Block RAM & 0 & 0 & 135 & 0\% / 0\% \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
@@ -371,28 +381,29 @@ Block RAM & 0 & 135 & 0\% \\
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{ll}
|
||||
\begin{tabular}{lll}
|
||||
\toprule
|
||||
\textbf{Parameter} & \textbf{Value} \\
|
||||
\textbf{Parameter} & \textbf{N8} & \textbf{N16} \\
|
||||
\midrule
|
||||
MAC operations per DSP48E1 per cycle & 2 (packed INT8, lane A + lane B) \\
|
||||
DSP48E1 per processing element & 8 \\
|
||||
MAC/cycle per PE & 16 \\
|
||||
Real parallel PEs & 8 \\
|
||||
Aggregate MAC/cycle & 128 \\
|
||||
\textbf{Aggregate peak throughput} (calculated, 155.039\,MHz) & \textbf{$\sim$19.84\,GMAC/s} \\
|
||||
Real DDR3 physical bandwidth ceiling & $\sim$2.48\,GB/s (shared across all 8 PEs) \\
|
||||
MAC operations per DSP48E1 per cycle & \multicolumn{2}{c}{2 (packed INT8, lane A + lane B)} \\
|
||||
DSP48E1 per processing element & \multicolumn{2}{c}{8} \\
|
||||
MAC/cycle per PE & \multicolumn{2}{c}{16} \\
|
||||
Real parallel PEs & 8 & 16 \\
|
||||
Aggregate MAC/cycle & 128 & 256 \\
|
||||
\textbf{Aggregate peak throughput} (calc., 155.039\,MHz) & \textbf{$\sim$19.84\,GMAC/s} & \textbf{$\sim$39.69\,GMAC/s} \\
|
||||
Real DDR3 bandwidth ceiling (shared) & \multicolumn{2}{c}{$\sim$2.48\,GB/s} \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\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
|
||||
Fmax) --- not itself an independently benchmarked sustained-throughput
|
||||
number. Sustained throughput on a real workload is bounded by the real
|
||||
DDR3 bandwidth ceiling above, shared across all active PEs; a direct
|
||||
measurement of sustained aggregate throughput at N8 has not yet been
|
||||
performed (see \S\ref{sec:openitems}).
|
||||
Fmax) --- not themselves independently benchmarked sustained-throughput
|
||||
numbers. Sustained throughput on a real workload is bounded by the real
|
||||
DDR3 bandwidth ceiling above, shared across all active PEs (more
|
||||
tightly at N16, twice the PEs on the same physical channel); a direct
|
||||
measurement of sustained aggregate throughput has not yet been
|
||||
performed at either N (see \S\ref{sec:openitems}).
|
||||
|
||||
%======================================================================
|
||||
\section{Host Communication Protocol}
|
||||
@@ -470,8 +481,8 @@ Host MCU & ESP32-S3-WROOM-1-N16R8 & In stock, LCSC C2913202 \\
|
||||
\label{sec:openitems}
|
||||
|
||||
\begin{itemize}
|
||||
\item Physical board has not yet been fabricated; no real
|
||||
electrical/thermal measurement exists yet.
|
||||
\item Physical board fabrication is underway (N8 configuration,
|
||||
unmodified); no real electrical/thermal measurement exists yet.
|
||||
\item \texttt{sys\_clk} oscillator requires a custom-programmed order
|
||||
(no off-the-shelf SKU at 310.077\,MHz).
|
||||
\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,
|
||||
result-readback address translation) not yet written --- software
|
||||
work outside this document's scope.
|
||||
\item Real, direct sustained-throughput benchmark at N8 (vs.\ a
|
||||
real ESP32-S3 baseline) not yet performed --- see the project's
|
||||
Tests \& Timing chapter for the honest historical comparison
|
||||
context.
|
||||
\item Real, direct sustained-throughput benchmark (vs.\ a real
|
||||
ESP32-S3 baseline) not yet performed at either N8 or N16 --- see
|
||||
the project's Tests \& Timing chapter for the honest historical
|
||||
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}
|
||||
|
||||
%======================================================================
|
||||
@@ -497,6 +512,11 @@ Host MCU & ESP32-S3-WROOM-1-N16R8 & In stock, LCSC C2913202 \\
|
||||
\textbf{Rev.} & \textbf{Date} & \textbf{Description} \\
|
||||
\midrule
|
||||
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
|
||||
\end{tabular}
|
||||
\end{table}
|
||||
|
||||
+118
-37
@@ -75,12 +75,14 @@ di sintesi fuori contesto.
|
||||
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 \\
|
||||
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
|
||||
\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}
|
||||
|
||||
\subsection{Il segno definitivo: N=8}
|
||||
\subsection{Il segno in fabbricazione fisica: N=8}
|
||||
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
@@ -90,40 +92,72 @@ di sintesi fuori contesto.
|
||||
\midrule
|
||||
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 \\
|
||||
WNS (setup slack) & \textbf{0.000\,ns} --- chiuso, 0 endpoint falliti \\
|
||||
WHS (hold slack) & +0.017\,ns \\
|
||||
Endpoint falliti & 0 su 63212 (setup), 0 su 63209 (hold) \\
|
||||
LUT utilizzate & 12535 / 63400 (19.77\%) \\
|
||||
Registri utilizzati & 19902 / 126800 (15.70\%) \\
|
||||
WNS (setup slack) & \textbf{+0.108\,ns} --- chiuso, con la correzione pipeline MAC (EXP-0097) \\
|
||||
WHS (hold slack) & +0.036\,ns \\
|
||||
Endpoint falliti & 0 (setup e hold) \\
|
||||
LUT utilizzate & 12536 / 63400 (19.77\%) \\
|
||||
Registri utilizzati & 19910 / 126800 (15.70\%) \\
|
||||
DSP48E1 utilizzati & 64 / 240 (26.7\%) \\
|
||||
Parallelismo reale & 8 elementi di elaborazione paralleli \\
|
||||
\bottomrule
|
||||
\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}
|
||||
|
||||
\textbf{Nota importante, dichiarata onestamente}: il margine WNS=0.000\,ns
|
||||
\`e \emph{esattamente} zero --- reale e chiuso, ma senza alcuno slack di
|
||||
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 nuovo segno reale: N=16 ORA CHIUDE}
|
||||
\label{sec:n16-closed}
|
||||
|
||||
\subsection{Il collo di bottiglia reale trovato a N=16}
|
||||
|
||||
Il percorso critico che impedisce la chiusura del timing a N=16
|
||||
\`e stato tracciato realmente (non ipotizzato) fino all'interno del
|
||||
datapath MAC di \texttt{neural\_processor\_packed.v} --- lo stesso
|
||||
Il percorso critico che inizialmente impediva la chiusura del timing a
|
||||
N=16 \`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},
|
||||
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
|
||||
occupazione complessiva del die (31\% LUT) aumenta la congestione di
|
||||
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.
|
||||
occupazione complessiva del die (31\% LUT) aumentava la congestione di
|
||||
piazzamento a sufficienza da erodere quel margine gi\`a minimo.
|
||||
|
||||
\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}
|
||||
\label{sec:esp32-comparison}
|
||||
@@ -153,22 +187,69 @@ come attuale un dato ormai superato.
|
||||
|
||||
\textbf{Stato onesto attuale}: non esiste ancora una misura reale,
|
||||
diretta, di throughput aggregato (inferenze al secondo, o MAC/s
|
||||
sostenuti) della configurazione N=8 definitiva confrontata con un
|
||||
benchmark ESP32-S3 aggiornato. Il picco teorico calcolabile per N=8
|
||||
\`e:
|
||||
sostenuti) di nessuna configurazione (N=8 o N=16) confrontata con un
|
||||
benchmark ESP32-S3 aggiornato. Il picco teorico calcolabile,
|
||||
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
|
||||
vincolo reale di banda DDR3 (2.48\,GB/s fisici, condivisi tra tutti
|
||||
gli 8 PE), il throughput realmente sostenibile in un carico di lavoro
|
||||
vincolo reale di banda DDR3 (2.48\,GB/s fisici, condivisi tra tutti i
|
||||
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
|
||||
(\S~\ref{sec:bottleneck}) --- una misura reale e diretta di questo
|
||||
throughput sostenuto a N=8, e un nuovo confronto onesto con un
|
||||
benchmark ESP32-S3 aggiornato, restano lavoro futuro non ancora
|
||||
eseguito.
|
||||
(\S~\ref{sec:bottleneck}) --- e la condivisione dello stesso canale
|
||||
DDR3 tra il doppio dei PE a N=16 rende questo vincolo ANCORA PI\`U
|
||||
stringente rispetto a N=8, non meno.
|
||||
|
||||
\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}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user