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
|
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
@@ -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
@@ -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}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user