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:
+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