diff --git a/docs/latex/architecture.tex b/docs/latex/architecture.tex index 48d69f9..b42a04b 100644 --- a/docs/latex/architecture.tex +++ b/docs/latex/architecture.tex @@ -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. diff --git a/docs/latex/datasheet.tex b/docs/latex/datasheet.tex index 381e41d..e0e1a96 100644 --- a/docs/latex/datasheet.tex +++ b/docs/latex/datasheet.tex @@ -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} diff --git a/docs/latex/tests_timing.tex b/docs/latex/tests_timing.tex index 0101da8..0105272 100644 --- a/docs/latex/tests_timing.tex +++ b/docs/latex/tests_timing.tex @@ -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}