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
525 lines
21 KiB
TeX
525 lines
21 KiB
TeX
\documentclass[10pt,a4paper]{article}
|
|
|
|
\usepackage[utf8]{inputenc}
|
|
\usepackage[T1]{fontenc}
|
|
\usepackage[margin=1.8cm,top=2.2cm,bottom=2.2cm]{geometry}
|
|
\usepackage{booktabs}
|
|
\usepackage{longtable}
|
|
\usepackage{array}
|
|
\usepackage{multicol}
|
|
\usepackage{xcolor}
|
|
\usepackage{hyperref}
|
|
\usepackage{fancyhdr}
|
|
\usepackage{titlesec}
|
|
\usepackage{enumitem}
|
|
\usepackage{colortbl}
|
|
|
|
\definecolor{dsblue}{RGB}{20,40,90}
|
|
\definecolor{dsgray}{RGB}{90,90,90}
|
|
\definecolor{dslight}{RGB}{235,238,244}
|
|
|
|
\hypersetup{colorlinks=true,linkcolor=dsblue,urlcolor=dsblue}
|
|
|
|
\titleformat{\section}{\normalfont\large\bfseries\color{dsblue}}{\thesection}{0.6em}{}
|
|
\titleformat{\subsection}{\normalfont\bfseries\color{dsblue}}{\thesubsection}{0.6em}{}
|
|
\titlespacing*{\section}{0pt}{1.4em}{0.6em}
|
|
\titlespacing*{\subsection}{0pt}{1.0em}{0.4em}
|
|
|
|
\pagestyle{fancy}
|
|
\fancyhf{}
|
|
\renewcommand{\headrulewidth}{0.6pt}
|
|
\renewcommand{\footrulewidth}{0.4pt}
|
|
\fancyhead[L]{\small\bfseries FPGA-Neural N8}
|
|
\fancyhead[R]{\small PRELIMINARY DATASHEET}
|
|
\fancyfoot[L]{\small \copyright\ FPGA-Neural project}
|
|
\fancyfoot[C]{\small Rev.\ 1.0 --- 2026-09-21}
|
|
\fancyfoot[R]{\small\thepage}
|
|
|
|
\setlist[itemize]{leftmargin=1.4em,itemsep=0.15em,topsep=0.2em}
|
|
|
|
\newcommand{\prelim}{\textcolor{red!70!black}{\textbf{PRELIMINARY}}}
|
|
|
|
\begin{document}
|
|
|
|
%======================================================================
|
|
\begin{center}
|
|
{\Huge\bfseries\color{dsblue} FPGA-Neural N8}\\[0.3em]
|
|
{\Large 8-Channel INT8 Neural Network Inference Accelerator}\\[0.2em]
|
|
{\large Custom board module --- Xilinx Artix-7 XC7A100T + DDR3 + ESP32 host}\\[0.6em]
|
|
\prelim\ --- Rev.\ 1.0 --- 2026-09-21
|
|
\end{center}
|
|
|
|
\vspace{0.4em}
|
|
\noindent\rule{\textwidth}{1pt}
|
|
|
|
\vspace{0.6em}
|
|
\noindent\textbf{Note on document status:} this datasheet describes a
|
|
design that has completed real RTL verification and real, in-context
|
|
place-and-route timing closure on the actual target device
|
|
(XC7A100T-CSG324-2), but has \emph{not yet} been fabricated as a
|
|
physical board. Electrical and thermal characteristics not directly
|
|
measured on real hardware are explicitly marked \prelim\ or refer to
|
|
the underlying component datasheets. Every timing, resource-utilization,
|
|
and verification figure in this document is a real, measured result
|
|
from RTL simulation or Vivado place-and-route --- none is estimated or
|
|
projected, per the project's own engineering discipline.
|
|
|
|
\vspace{0.8em}
|
|
\section*{Features}
|
|
\begin{multicols}{2}
|
|
\begin{itemize}
|
|
\item 8 parallel INT8 MAC processing elements (PEs), 2 groups of 4,
|
|
shared-weight-broadcast systolic architecture
|
|
\item 64 DSP48E1 hardware multiply-accumulate slices (2 packed INT8
|
|
MACs per DSP), 26.7\% of device DSP budget
|
|
\item 128 MAC/cycle aggregate peak throughput at 155.039\,MHz
|
|
($\sim$19.84 GMAC/s theoretical peak)
|
|
\item Real, closed static timing signoff: WNS = 0.000\,ns
|
|
(0 failing setup endpoints), WHS = +0.017\,ns
|
|
\item 32-bit-wide real DDR3-1600 channel (2$\times$ DDR3 SDRAM),
|
|
$\sim$2.48\,GB/s physical bandwidth ceiling
|
|
\item Hierarchical 2-level DDR3 arbiter (11 real concurrent requesters)
|
|
\item Direct-into-DDR3 result writeback --- no per-core result pins
|
|
\item ESP32-S3 host over dedicated management SPI (FPGA is slave)
|
|
\item Independent config-flash relay SPI bus (FPGA is master),
|
|
zero direct host--flash connection
|
|
\item Dual boot path: autonomous Master-SPI boot + JTAG factory/recovery
|
|
\item Simple, unchanged host protocol across all core-count variants
|
|
(N=2/4/8/16) --- job submission format never changes
|
|
\item Register-file host interface (device ID, control, status,
|
|
slot count)
|
|
\item Active-low sticky interrupt output for interrupt-driven host
|
|
firmware
|
|
\end{itemize}
|
|
\end{multicols}
|
|
|
|
\vspace{0.3em}
|
|
\section*{General Description}
|
|
|
|
FPGA-Neural N8 is a hardware inference accelerator for INT8-quantized
|
|
neural networks, implemented on a bare Xilinx Artix-7 XC7A100T FPGA
|
|
(no development board) with a real 32-bit DDR3 memory channel and an
|
|
ESP32-S3 host processor. The device organizes its compute resources
|
|
as \textbf{8 real parallel processing elements}, grouped in pairs of
|
|
4 that share a single weight-fetch path per group (a real
|
|
shared-weight-broadcast systolic architecture), reducing redundant
|
|
DDR3 weight traffic without the complexity of a literal PE-to-PE
|
|
systolic pipeline.
|
|
|
|
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
|
|
|
|
%======================================================================
|
|
\section{Ordering / Configuration Information}
|
|
\label{sec:variants}
|
|
|
|
The same RTL family supports several real, synthesizable core-count
|
|
configurations via the top-level \texttt{N\_GROUPS} parameter. Only
|
|
N8 has a dedicated, permanent top-level file
|
|
(\texttt{n8\_system\_ddr3\_top.v}); other configurations are documented
|
|
for reference.
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\renewcommand{\arraystretch}{1.15}
|
|
\begin{tabular}{lccccl}
|
|
\toprule
|
|
\textbf{Variant} & \textbf{PEs} & \textbf{DSP48E1} & \textbf{Real WNS} & \textbf{Status} & \textbf{Top-level file} \\
|
|
\midrule
|
|
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.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, 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}
|
|
|
|
%======================================================================
|
|
\section{Functional Block Diagram}
|
|
|
|
\begin{center}
|
|
\renewcommand{\arraystretch}{1.3}
|
|
\begin{tabular}{|p{3.0cm}|p{3.0cm}|p{3.0cm}|p{3.0cm}|}
|
|
\hline
|
|
\multicolumn{4}{|c|}{\cellcolor{dslight}\textbf{ESP32-S3 Host (management SPI, slave)}} \\
|
|
\hline
|
|
\multicolumn{4}{|c|}{\cellcolor{dslight}\texttt{spi\_host\_bridge\_v3.v}} \\
|
|
\hline
|
|
\multicolumn{4}{|c|}{\texttt{neural\_director\_grouped.v} (job queue, octet dispatch)} \\
|
|
\hline
|
|
\multicolumn{2}{|c|}{\cellcolor{dslight}\textbf{Group 0} (\texttt{systolic\_group.v})} &
|
|
\multicolumn{2}{c|}{\cellcolor{dslight}\textbf{Group 1} (\texttt{systolic\_group.v})} \\
|
|
\hline
|
|
PE0 & PE1 / PE2 / PE3 & PE0 & PE1 / PE2 / PE3 \\
|
|
\hline
|
|
\multicolumn{4}{|c|}{\texttt{sdram\_arbiter\_hier.v} --- hierarchical 2-level arbiter (11 requesters)} \\
|
|
\hline
|
|
\multicolumn{4}{|c|}{\texttt{mig\_native\_adapter.v} $\to$ Xilinx MIG (\texttt{mig\_7series\_0})} \\
|
|
\hline
|
|
\multicolumn{4}{|c|}{\cellcolor{dslight}\textbf{32-bit real DDR3 channel} (2$\times$ MT41J128M16JT-125:K)} \\
|
|
\hline
|
|
\end{tabular}
|
|
\end{center}
|
|
\vspace{0.4em}
|
|
\noindent A parallel, independent path (\texttt{flash\_spi\_master.v},
|
|
FPGA master) connects to the config flash; the ESP32 reaches it only
|
|
by relaying bytes through the FPGA over the management SPI bus (no
|
|
direct electrical connection).
|
|
|
|
%======================================================================
|
|
\section{Absolute Maximum Ratings}
|
|
|
|
\begin{center}
|
|
\prelim\ --- not yet independently re-characterized on real hardware.
|
|
Refer to the underlying component datasheets, which this design's
|
|
supply-rail assignments are constrained by:
|
|
\end{center}
|
|
\begin{itemize}
|
|
\item FPGA: Xilinx XC7A100T-2, see Xilinx DS181 (7 Series FPGAs
|
|
Data Sheet: DC and Switching Characteristics).
|
|
\item DDR3 SDRAM: Micron MT41J128M16JT-125:K, see the Micron DDR3
|
|
SDRAM datasheet for absolute maximum voltage/temperature ratings.
|
|
\item Config flash: Winbond W25Q32JVSSIQ, see the Winbond W25Q32JV
|
|
datasheet.
|
|
\end{itemize}
|
|
|
|
%======================================================================
|
|
\section{Recommended Operating Conditions --- Clocking}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\renewcommand{\arraystretch}{1.2}
|
|
\begin{tabular}{llll}
|
|
\toprule
|
|
\textbf{Signal} & \textbf{Description} & \textbf{Value} & \textbf{I/O Standard} \\
|
|
\midrule
|
|
\texttt{sys\_clk\_p/n} & DDR3 PHY reference clock, differential & \textbf{310.078\,MHz} (3.225\,ns) & DIFF\_SSTL15, bank 34 \\
|
|
\texttt{clk\_ref\_p/n} & MIG IDELAY reference clock, differential & \textbf{200\,MHz} & LVDS\_25, bank 14 \\
|
|
\texttt{ui\_clk} (internal) & Compute/logic domain (PLL 2:1 from sys\_clk) & \textbf{155.039\,MHz} & --- (internal, not a pin) \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
|
|
\noindent These frequencies are not a free design choice: they are the
|
|
real, unique output of the Xilinx MIG JEDEC/PLL calculator for this
|
|
exact part, speed grade, and DDR3 channel width. Substituting a
|
|
different \texttt{sys\_clk} frequency requires re-running the real MIG
|
|
wizard; \texttt{TimePeriod} and \texttt{InputClkFreq} are tied together
|
|
and cannot be edited independently.
|
|
|
|
\subsection{Supply rails (per I/O bank, real XDC-derived)}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\renewcommand{\arraystretch}{1.2}
|
|
\begin{tabular}{llll}
|
|
\toprule
|
|
\textbf{Bank} & \textbf{VCCO} & \textbf{Standard} & \textbf{Used for} \\
|
|
\midrule
|
|
34 / 35 & 1.5\,V & SSTL15 / DIFF\_SSTL15 & DDR3 data/address/command, \texttt{sys\_clk} \\
|
|
14 & 2.5\,V & LVDS\_25 & \texttt{clk\_ref\_p/n} \\
|
|
15 & 3.3\,V (assumed) & LVCMOS33 & Management SPI, \texttt{sys\_rst}, \texttt{data\_ready\_n} \\
|
|
16 & 3.3\,V & LVCMOS33 & Config-flash SPI bus \\
|
|
0 & per UG470 & --- & Configuration control (PROGRAM\_B, INIT\_B, DONE, mode pins) \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
|
|
\clearpage
|
|
%======================================================================
|
|
\section{Pin Configuration}
|
|
|
|
\subsection{DDR3 interface (fixed by FPGA PHY hardware)}
|
|
|
|
Generated by the real Xilinx MIG wizard for this exact part; SSTL15/DIFF\_SSTL15, banks 34/35.
|
|
|
|
\begin{longtable}{lll}
|
|
\toprule
|
|
\textbf{Signal} & \textbf{Pin} & \textbf{Notes} \\
|
|
\midrule
|
|
\endhead
|
|
\texttt{ddr3\_dq[31:0]} & (32 pins) & split 16 bits/chip across 2 DDR3 devices \\
|
|
\texttt{ddr3\_dqs\_p/n[3:0]} & (8 pins, differential) & 4 DQS pairs \\
|
|
\texttt{ddr3\_dm[3:0]} & (4 pins) & \\
|
|
\texttt{ddr3\_addr[13:0]} & (14 pins) & shared, fanned out to both chips \\
|
|
\texttt{ddr3\_ba[2:0]} & V5 / V2 / U2 & \\
|
|
\texttt{ddr3\_ras\_n / cas\_n / we\_n} & V4 / R3 / T3 & \\
|
|
\texttt{ddr3\_cke[0]} & P2 & \\
|
|
\texttt{ddr3\_cs\_n[0]} & T5 & \\
|
|
\texttt{ddr3\_odt[0]} & R2 & \\
|
|
\texttt{ddr3\_ck\_p/n[0]} & N2 / N1 (diff.) & \\
|
|
\texttt{ddr3\_reset\_n} & D7 & LVCMOS15 \\
|
|
\texttt{sys\_clk\_p / sys\_clk\_n} & N5 / P5 & DIFF\_SSTL15, bank 34 \\
|
|
\texttt{clk\_ref\_p / clk\_ref\_n} & T14 / T15 & LVDS\_25, bank 14 \\
|
|
\bottomrule
|
|
\caption{DDR3 interface, real routed pin assignment. Full per-bit DQ/DQS/DM table in \texttt{docs/PINOUT.md}.}
|
|
\end{longtable}
|
|
|
|
\subsection{Management SPI (ESP32 $\leftrightarrow$ FPGA, FPGA is slave)}
|
|
|
|
Bank 15, LVCMOS33.
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Signal} & \textbf{Pin} & \textbf{Direction (FPGA)} \\
|
|
\midrule
|
|
\texttt{sclk} & A15 & Input \\
|
|
\texttt{mosi} & B16 & Input \\
|
|
\texttt{miso} & B17 & Output \\
|
|
\texttt{cs\_n} & A16 & Input \\
|
|
\texttt{sys\_rst} & G13 & Input (tentative, non-final board location) \\
|
|
\texttt{data\_ready\_n} & D14 & Output, active-low, sticky interrupt \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
|
|
\subsection{Config-flash SPI (FPGA $\leftrightarrow$ flash, FPGA is master)}
|
|
|
|
Bank 16, LVCMOS33.
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Signal} & \textbf{Pin} & \textbf{Direction (FPGA)} \\
|
|
\midrule
|
|
\texttt{flash\_mosi} & D9 & Output \\
|
|
\texttt{flash\_miso} & D10 & Input \\
|
|
\texttt{flash\_cs\_n} & C9 & Output \\
|
|
(CCLK) & E9 & Output (via \texttt{STARTUPE2}, not a plain top-level port) \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
|
|
\subsection{Configuration control (bank 0) and JTAG}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\begin{tabular}{llcll}
|
|
\toprule
|
|
\textbf{Signal} & \textbf{Pin} & & \textbf{Signal} & \textbf{Pin} \\
|
|
\midrule
|
|
PROGRAM\_B & P9 & & TCK & E10 \\
|
|
INIT\_B & P7 & & TDI & E11 \\
|
|
DONE & P10 & & TMS & E12 \\
|
|
M[2:0] & P11/P13/P12 & & TDO & E13 \\
|
|
CFGBVS & P8 & & & \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
|
|
%======================================================================
|
|
\clearpage
|
|
\section{Timing Characteristics}
|
|
|
|
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}{llll}
|
|
\toprule
|
|
\textbf{Parameter} & \textbf{N8 (in production)} & \textbf{N16 (verified)} & \textbf{Condition} \\
|
|
\midrule
|
|
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:} 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)}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\renewcommand{\arraystretch}{1.2}
|
|
\begin{tabular}{lrrrr}
|
|
\toprule
|
|
\textbf{Resource} & \textbf{N8 Used} & \textbf{N16 Used} & \textbf{Available} & \textbf{N8 / N16 Util.} \\
|
|
\midrule
|
|
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}
|
|
|
|
%======================================================================
|
|
\section{Compute Performance}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Parameter} & \textbf{N8} & \textbf{N16} \\
|
|
\midrule
|
|
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 figures are a real calculation from measured
|
|
building blocks (DSP count $\times$ packing factor $\times$ measured
|
|
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}
|
|
|
|
One opcode byte (MSB-first) per CS-low SPI transaction.
|
|
|
|
\begin{longtable}{lllp{5cm}}
|
|
\toprule
|
|
\textbf{Opcode} & \textbf{Name} & \textbf{Payload} & \textbf{Function} \\
|
|
\midrule
|
|
\endhead
|
|
0x00 & NOP & 0\,B & inert \\
|
|
0x0F & RESET & 0\,B & soft reset pulse \\
|
|
0x10 & WRITE\_JOB & 16\,B & submit one inference job (node\_id, x\_base, w\_base, n\_tiles, result\_addr) \\
|
|
0x20 & STATUS & 0$\to$1\,B & busy / last-job-accepted status bits \\
|
|
0x01 & WRITE\_MEM & 4+2$N$\,B & raw DDR3 word write ($N$ words) \\
|
|
0x02 & READ\_MEM & 6$\to$2$N$\,B & raw DDR3 word read ($N$ words) \\
|
|
0x30 & REG\_WRITE & 5\,B & write control register \\
|
|
0x31 & REG\_READ & 1$\to$4\,B & read status/ID register (0x00 DEVICE\_ID, 0x01 CONTROL, 0x02 STATUS, 0x03 N\_SLOTS) \\
|
|
0x40 & FLASH\_XFER & $N\to N{+}2$\,B & raw passthrough to config flash \\
|
|
\bottomrule
|
|
\caption{Management SPI opcode summary. Authoritative field layout in \texttt{spi\_host\_bridge\_v3.v}.}
|
|
\end{longtable}
|
|
|
|
\noindent\textbf{Real, deliberate compatibility guarantee:} this
|
|
protocol is byte-for-byte identical across the N2/N4/N8/N16 family
|
|
variants (\S\ref{sec:variants}) --- the host always submits one job
|
|
descriptor per \texttt{WRITE\_JOB} transaction; the internal Director
|
|
groups jobs into pairs (N2) or octets (N8/N16) transparently to the
|
|
host.
|
|
|
|
%======================================================================
|
|
\section{Verification Status}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\renewcommand{\arraystretch}{1.15}
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Test} & \textbf{Result} & \textbf{Method} \\
|
|
\midrule
|
|
\texttt{tb\_n8\_system\_ddr3.v} (full N8 system) & \textbf{16/16 PASS} & Real DDR3 model, Vivado xsim \\
|
|
\texttt{tb\_sdram\_arbiter\_hier.v} & 23/23 PASS & Icarus, worst-case contention incl.\ host \\
|
|
\texttt{tb\_systolic\_group.v} & 8/8 PASS & Icarus, isolated group, 2 consecutive jobs \\
|
|
\texttt{tb\_neural\_director\_grouped.v} & 4/4 PASS & Icarus, octet dispatch + stall correctness \\
|
|
\texttt{tb\_spi\_host\_bridge\_v3.v} & 49/49 PASS & Icarus, full management protocol \\
|
|
\texttt{tb\_packed\_slot.v} & 9/9 PASS & Real DDR3 read-after-write check \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\end{table}
|
|
|
|
%======================================================================
|
|
\section{Bill of Materials (Core Parts)}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\renewcommand{\arraystretch}{1.2}
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\textbf{Component} & \textbf{Part Number} & \textbf{Status} \\
|
|
\midrule
|
|
FPGA & XC7A100T-CSG324-2 & --- \\
|
|
DDR3 SDRAM ($\times$2) & Micron MT41J128M16JT-125:K & In stock, LCSC-verified \\
|
|
Config flash & Winbond W25Q32JVSSIQ & In stock, LCSC-verified \\
|
|
Host MCU & ESP32-S3-WROOM-1-N16R8 & In stock, LCSC C2913202 \\
|
|
\texttt{clk\_ref} oscillator & SiTime SiT9121AC-2CF-33E-200.00000 & In stock, LCSC C835051 \\
|
|
\texttt{sys\_clk} oscillator & SiTime SiT9122 family, 310.077\,MHz & \prelim\ --- needs custom-programmed order \\
|
|
\bottomrule
|
|
\end{tabular}
|
|
\caption{Core BOM. Power-tree components (VCCINT/VCCAUX/VTT regulators) are real candidate parts, not yet individually stock-confirmed --- see \texttt{docs/BOM.md}.}
|
|
\end{table}
|
|
|
|
%======================================================================
|
|
\section{Open Items}
|
|
\label{sec:openitems}
|
|
|
|
\begin{itemize}
|
|
\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
|
|
fully sourced/stock-confirmed.
|
|
\item \texttt{sys\_rst} pin location is tentative, pending final
|
|
board layout.
|
|
\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 (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}
|
|
|
|
%======================================================================
|
|
\section{Revision History}
|
|
|
|
\begin{table}[h]
|
|
\centering
|
|
\begin{tabular}{lll}
|
|
\toprule
|
|
\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}
|
|
|
|
\end{document}
|