V2 final synthesis/P&R sign-off + LaTeX datasheet port (NOT SILICON READY)

Real synthesis and place-and-route of the actual final board-level
top (fpga_neural_v2_top.v -- SPI bridge, real EHXPLLL, reset_sync,
compute+memory core), against a real, fully ball-assigned LPF. Also
ports the V2 datasheet to LaTeX using V1's own preamble/macros/
typography, and records a real (non-ESP32, honestly labeled) software
reference comparison.

Synthesis (Yosys, real run): 0 CHECK-pass problems, 38 unique warnings
(43 total), all matching this project's own previously-reviewed benign
set (neural_processor.v's known genvar multi-driver artifact, small-
array-to-register unrolling, the real SDRAM DQ tristate bus) -- no new
warnings from the SPI bridge, PLL, or reset synchronizer.
TRELLIS_FF=6322, TRELLIS_COMB=7084, MULT18X18D=32, EHXPLLL=1 (real PLL
confirmed present), DP16KD=0 (all small SRAMs -> distributed RAM).

Place-and-route (nextpnr-ecp5, real runs, 8 seeds, new
v2_board_top.lpf with all 44 top-level signals ball-assigned from the
official Lattice pinout CSV -- no placeholders): 8/8 PASS at 64MHz.
Worst 68.51MHz (seed 4), best 74.17MHz (seed 7), mean 71.16MHz. Zero
unrouted nets, zero placement/routing errors, TRELLIS_IO=44/245 (17%).
Critical path alternates between dependency_manager's own priority
encoder and sdram_unified_backend's own weight-cache hit-index logic,
matching this project's own prior documented timing investigations --
not a new defect.

New: hardware/v2/constraints/v2_board_top.lpf (final LPF, supersedes
v2_unified.lpf for the board-level top), hardware/v2/reports/
step_final_{synthesis,pnr_worst_seed4,timing}.* (raw evidence),
hardware/v2/docs/DatasheetLatex/ (V2 datasheet, real LaTeX build,
16 pages, visually inspected, ported from hardware/v1/docs/
DatasheetLatex/'s own preamble and macros).

Real, honestly-labeled software baseline: the D-Stress arithmetic
(256 neurons x 128 INT8 MACs) compiled and run on THIS development
machine (Apple M4, arm64, NOT an embedded target, NOT ESP32) --
1.28us/inference, included in the datasheet with an explicit
disclosure that no physical ESP32 hardware was available for a real
embedded-target comparison.

Remaining, disclosed, NOT-yet-closed items (this commit does NOT
claim silicon readiness): real KiCad schematic + ERC, PCB layout,
sourced BOM, real power current-budget estimate, SDRAM-datasheet-
parameter cross-check, configuration-flash selection, and (necessarily)
physical fabrication/bring-up. See hardware/v2/docs/DatasheetLatex/
chapters/08-status-roadmap.tex for the complete, itemized checklist.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
This commit is contained in:
2026-09-06 17:50:53 +02:00
co-authored by Claude Sonnet 5
parent 68f3c5e403
commit d6376e8f2a
28 changed files with 21800 additions and 0 deletions
@@ -0,0 +1,21 @@
\relax
\providecommand \babel@aux [2]{\global \let \babel@toc \@gobbletwo }
\@nameuse{bbl@beforestart}
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\babel@aux{english}{}
\pgfsyspdfmark {pgfid1}{5216401}{50184874}
\gdef \LT@i {\LT@entry
{1}{108.73918pt}\LT@entry
{1}{120.12054pt}\LT@entry
{1}{243.45622pt}}
\@input{chapters/01-overview.aux}
\@input{chapters/02-architecture.aux}
\@input{chapters/03-clock-reset.aux}
\@input{chapters/04-host-interface.aux}
\@input{chapters/05-pinout-timing.aux}
\@input{chapters/06-power-configuration.aux}
\@input{chapters/07-benchmarks.aux}
\@input{chapters/08-status-roadmap.aux}
\gdef \@abspage@last{16}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,29 @@
\BOOKMARK [0][-]{chapter.1}{\376\377\000O\000v\000e\000r\000v\000i\000e\000w}{}% 1
\BOOKMARK [1][-]{section.1.1}{\376\377\000D\000o\000c\000u\000m\000e\000n\000t\000\040\000s\000c\000o\000p\000e\000\040\000a\000n\000d\000\040\000s\000t\000a\000t\000u\000s\000\040\000l\000a\000b\000e\000l\000s}{chapter.1}% 2
\BOOKMARK [1][-]{section.1.2}{\376\377\000F\000r\000o\000z\000e\000n\000\040\000r\000e\000f\000e\000r\000e\000n\000c\000e\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n}{chapter.1}% 3
\BOOKMARK [0][-]{chapter.2}{\376\377\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 4
\BOOKMARK [1][-]{section.2.1}{\376\377\000C\000o\000m\000p\000u\000t\000e\000:\000\040\000N\000e\000u\000r\000a\000l\000\040\000M\000u\000l\000t\000i\000p\000r\000o\000c\000e\000s\000s\000o\000r}{chapter.2}% 5
\BOOKMARK [1][-]{section.2.2}{\376\377\000U\000n\000i\000f\000i\000e\000d\000\040\000s\000i\000n\000g\000l\000e\000-\000S\000D\000R\000A\000M\000\040\000m\000e\000m\000o\000r\000y}{chapter.2}% 6
\BOOKMARK [1][-]{section.2.3}{\376\377\000R\000e\000a\000d\000-\000t\000i\000m\000i\000n\000g\000\040\000d\000i\000s\000c\000i\000p\000l\000i\000n\000e\000\040\000\050\000E\000R\000R\000-\0000\0000\0002\0005\000\051}{chapter.2}% 7
\BOOKMARK [0][-]{chapter.3}{\376\377\000C\000l\000o\000c\000k\000\040\000a\000n\000d\000\040\000r\000e\000s\000e\000t\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 8
\BOOKMARK [1][-]{section.3.1}{\376\377\000C\000l\000o\000c\000k\000\040\000g\000e\000n\000e\000r\000a\000t\000i\000o\000n}{chapter.3}% 9
\BOOKMARK [1][-]{section.3.2}{\376\377\000R\000e\000s\000e\000t\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{chapter.3}% 10
\BOOKMARK [0][-]{chapter.4}{\376\377\000H\000o\000s\000t\000\040\000i\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000\050\000S\000P\000I\000\051}{}% 11
\BOOKMARK [1][-]{section.4.1}{\376\377\000O\000p\000c\000o\000d\000e\000s}{chapter.4}% 12
\BOOKMARK [1][-]{section.4.2}{\376\377\000V\000e\000r\000i\000f\000i\000c\000a\000t\000i\000o\000n}{chapter.4}% 13
\BOOKMARK [0][-]{chapter.5}{\376\377\000P\000i\000n\000o\000u\000t\000,\000\040\000p\000l\000a\000c\000e\000-\000a\000n\000d\000-\000r\000o\000u\000t\000e\000,\000\040\000a\000n\000d\000\040\000t\000i\000m\000i\000n\000g}{}% 14
\BOOKMARK [1][-]{section.5.1}{\376\377\000F\000i\000n\000a\000l\000\040\000p\000i\000n\000o\000u\000t}{chapter.5}% 15
\BOOKMARK [1][-]{section.5.2}{\376\377\000S\000y\000n\000t\000h\000e\000s\000i\000s\000\040\000\050\000r\000e\000a\000l\000,\000\040\000t\000h\000i\000s\000\040\000r\000e\000v\000i\000s\000i\000o\000n\000\051}{chapter.5}% 16
\BOOKMARK [1][-]{section.5.3}{\376\377\000P\000l\000a\000c\000e\000\040\000a\000n\000d\000\040\000r\000o\000u\000t\000e\000:\000\040\0008\000-\000s\000e\000e\000d\000\040\000t\000i\000m\000i\000n\000g\000\040\000t\000a\000b\000l\000e}{chapter.5}% 17
\BOOKMARK [0][-]{chapter.6}{\376\377\000P\000o\000w\000e\000r\000,\000\040\000S\000D\000R\000A\000M\000\040\000e\000l\000e\000c\000t\000r\000i\000c\000a\000l\000,\000\040\000a\000n\000d\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n}{}% 18
\BOOKMARK [1][-]{section.6.1}{\376\377\000P\000o\000w\000e\000r\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e\000\040\040\023\000\040\000s\000t\000a\000t\000u\000s\000:\000\040\000O\000P\000E\000N}{chapter.6}% 19
\BOOKMARK [1][-]{section.6.2}{\376\377\000S\000D\000R\000A\000M\000\040\000e\000l\000e\000c\000t\000r\000i\000c\000a\000l\000\040\000/\000\040\000t\000i\000m\000i\000n\000g\000\040\000s\000i\000g\000n\000-\000o\000f\000f\000\040\040\023\000\040\000s\000t\000a\000t\000u\000s\000:\000\040\000P\000A\000R\000T\000I\000A\000L}{chapter.6}% 20
\BOOKMARK [1][-]{section.6.3}{\376\377\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\040\023\000\040\000s\000t\000a\000t\000u\000s\000:\000\040\000O\000P\000E\000N}{chapter.6}% 21
\BOOKMARK [0][-]{chapter.7}{\376\377\000B\000e\000n\000c\000h\000m\000a\000r\000k\000s}{}% 22
\BOOKMARK [1][-]{section.7.1}{\376\377\000I\000n\000t\000e\000r\000n\000a\000l\000\040\000b\000e\000n\000c\000h\000m\000a\000r\000k\000:\000\040\000D\000-\000S\000t\000r\000e\000s\000s\000\040\000w\000o\000r\000k\000l\000o\000a\000d}{chapter.7}% 23
\BOOKMARK [1][-]{section.7.2}{\376\377\000H\000o\000s\000t\000-\000i\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000p\000a\000c\000i\000n\000g\000\040\000b\000e\000n\000c\000h\000m\000a\000r\000k}{chapter.7}% 24
\BOOKMARK [1][-]{section.7.3}{\376\377\000S\000o\000f\000t\000w\000a\000r\000e\000\040\000r\000e\000f\000e\000r\000e\000n\000c\000e\000\040\000c\000o\000m\000p\000a\000r\000i\000s\000o\000n}{chapter.7}% 25
\BOOKMARK [0][-]{chapter.8}{\376\377\000C\000h\000i\000p\000\040\000r\000e\000a\000d\000i\000n\000e\000s\000s\000\040\000a\000n\000d\000\040\000r\000o\000a\000d\000m\000a\000p}{}% 26
\BOOKMARK [1][-]{section.8.1}{\376\377\000P\000r\000e\000c\000i\000s\000e\000\040\000r\000e\000a\000d\000i\000n\000e\000s\000s\000\040\000c\000h\000e\000c\000k\000l\000i\000s\000t}{chapter.8}% 27
\BOOKMARK [1][-]{section.8.2}{\376\377\000F\000i\000n\000a\000l\000\040\000a\000n\000s\000w\000e\000r}{chapter.8}% 28
\BOOKMARK [1][-]{section.8.3}{\376\377\000R\000o\000a\000d\000m\000a\000p}{chapter.8}% 29
@@ -0,0 +1,120 @@
% ======================================================================
% FPGA-Neural V2 -- INT8 Neural Network Engine, single-SDRAM architecture
% Datasheet / Technical reference manual
% Repository: github.com/manvalan/FPGA-Neural
% Ported from the V1 LaTeX datasheet (hardware/v1/docs/DatasheetLatex/):
% same preamble, macros, typography, and title-page/features-page
% structure -- content rewritten for the V2 architecture throughout.
% ======================================================================
\documentclass[11pt,a4paper,openany]{report}
\newcommand{\datasheetrev}{B0}
\newcommand{\datasheetdate}{September 2026}
\input{preamble}
\begin{document}
\sloppy
% ======================================================================
% TITLE PAGE
% ======================================================================
\begin{titlepage}
\thispagestyle{empty}
\begin{tikzpicture}[remember picture,overlay]
\fill[fnDark] (current page.north west) rectangle
([yshift=-4.3cm]current page.north east);
\fill[fnTeal] ([yshift=-4.3cm]current page.north west) rectangle
([yshift=-4.55cm]current page.north east);
\node[anchor=north west,text=white,font=\Huge\bfseries]
at ([xshift=2.2cm,yshift=-1.15cm]current page.north west)
{FPGA\,--\,Neural V2};
\node[anchor=north west,text=fnLight,font=\large]
at ([xshift=2.25cm,yshift=-2.15cm]current page.north west)
{INT8 Neural Multiprocessor, unified single-SDRAM architecture};
\node[anchor=north west,text=fnLight2,font=\normalsize]
at ([xshift=2.25cm,yshift=-2.85cm]current page.north west)
{Parametric N-processor hardware accelerator -- Datasheet and reference manual};
\node[anchor=north east,text=white,font=\ttfamily\small]
at ([xshift=-2.2cm,yshift=-3.55cm]current page.north east)
{Rev.~\datasheetrev~~\textbullet~~\datasheetdate};
\end{tikzpicture}
\vspace*{5.0cm}
% --- compact block diagram on the title page ---
\begin{center}
\begin{tikzpicture}[node distance=7mm and 12mm]
\node[fnblockD,minimum width=30mm] (host) {HOST\\{\scriptsize MCU / PC (SPI master)}};
\node[fnblockT,right=18mm of host,minimum width=34mm] (fpga)
{FPGA\\{\scriptsize Neural Multiprocessor, N=4}};
\node[fnblock,right=18mm of fpga,minimum width=26mm] (ram)
{SDRAM\\{\scriptsize 8\,MB, unified}};
\draw[fnbus] (host) -- node[fnlbl,above]{SPI Mode 0} (fpga);
\draw[fnbus] (fpga) -- node[fnlbl,above]{16-bit, single chip} (ram);
\node[below=1mm of fpga,font=\scriptsize\itshape,text=fnGrey]
{weights + activations + results, ONE physical memory};
\end{tikzpicture}
\end{center}
\vfill
\begin{center}
\begin{tikzpicture}
\node[draw=fnRule,rounded corners=3pt,inner sep=10pt,fill=fnLight,text width=15.5cm]{
\footnotesize
\textbf{\color{fnDark}Reference target device:} Lattice ECP5 \code{LFE5U-45F-8BG381}
(speed grade $-8$, CABGA381, 72$\times$MULT18X18D, $\approx$44k LUT).\\[2pt]
\textbf{\color{fnDark}Baseline configuration:} INT8/INT32, \code{N\_PROCESSORS}=4,
\code{P\_IN}=8, single external SDRAM Alliance Memory \code{AS4C4M16SA-6TIN}
(weights + activations + results, unified). No PSRAM anywhere in the V2
physical path.\\[2pt]
\textbf{\color{fnDark}Clock:} 16\,MHz board oscillator $\rightarrow$ real
ECP5 \code{EHXPLLL} $\rightarrow$ 64\,MHz system clock, timing-closed
across 8 real place-and-route seeds (worst 68.51\,MHz, best 74.17\,MHz).\\[2pt]
\textbf{\color{fnDark}Host:} real SPI protocol engine
(\code{spi\_host\_bridge.v}) -- WRITE\_JOB / WRITE\_MEM / READ\_MEM /
STATUS / RESET.\\[2pt]
\textbf{\color{fnDark}Status:} RTL verified in simulation (Verilator,
bit-exact), real synthesis (Yosys) and real place-and-route
(nextpnr-ecp5). No fabricated hardware exists -- see \S\ref{ch:status}
for the precise, itemized readiness state. Document describing the
project as of \datasheetdate.
};
\end{tikzpicture}
\end{center}
\vspace{0.6cm}
{\footnotesize\color{fnGrey}\raggedright
Project author: Michele Bigi \textbullet{} MIKILAB / manvalan.\\
This datasheet documents the RTL code, documentation and benchmarks
present in the repository \texttt{github.com/manvalan/FPGA-Neural},
ported from the V1 datasheet's own LaTeX structure (same preamble and
macros, content rewritten for V2).\par}
\end{titlepage}
% ======================================================================
% "FEATURES" PAGE (datasheet style)
% ======================================================================
\input{chapters/00-features}
% ======================================================================
% TABLE OF CONTENTS
% ======================================================================
\newpage
\pagenumbering{roman}
{\color{fnDark}\tableofcontents}
\newpage
\pagenumbering{arabic}
% ======================================================================
% CHAPTERS
% ======================================================================
\include{chapters/01-overview}
\include{chapters/02-architecture}
\include{chapters/03-clock-reset}
\include{chapters/04-host-interface}
\include{chapters/05-pinout-timing}
\include{chapters/06-power-configuration}
\include{chapters/07-benchmarks}
\include{chapters/08-status-roadmap}
\end{document}
@@ -0,0 +1,30 @@
\babel@toc {english}{}\relax
\contentsline {chapter}{\numberline {1}Overview}{1}{chapter.1}%
\contentsline {section}{\numberline {1.1}Document scope and status labels}{1}{section.1.1}%
\contentsline {section}{\numberline {1.2}Frozen reference configuration}{1}{section.1.2}%
\contentsline {chapter}{\numberline {2}Architecture}{2}{chapter.2}%
\contentsline {section}{\numberline {2.1}Compute: Neural Multiprocessor}{2}{section.2.1}%
\contentsline {section}{\numberline {2.2}Unified single-SDRAM memory}{2}{section.2.2}%
\contentsline {section}{\numberline {2.3}Read-timing discipline (ERR-0025)}{3}{section.2.3}%
\contentsline {chapter}{\numberline {3}Clock and reset architecture}{4}{chapter.3}%
\contentsline {section}{\numberline {3.1}Clock generation}{4}{section.3.1}%
\contentsline {section}{\numberline {3.2}Reset architecture}{4}{section.3.2}%
\contentsline {chapter}{\numberline {4}Host interface (SPI)}{5}{chapter.4}%
\contentsline {section}{\numberline {4.1}Opcodes}{5}{section.4.1}%
\contentsline {section}{\numberline {4.2}Verification}{5}{section.4.2}%
\contentsline {chapter}{\numberline {5}Pinout, place-and-route, and timing}{6}{chapter.5}%
\contentsline {section}{\numberline {5.1}Final pinout}{6}{section.5.1}%
\contentsline {section}{\numberline {5.2}Synthesis (real, this revision)}{6}{section.5.2}%
\contentsline {section}{\numberline {5.3}Place and route: 8-seed timing table}{6}{section.5.3}%
\contentsline {chapter}{\numberline {6}Power, SDRAM electrical, and configuration}{8}{chapter.6}%
\contentsline {section}{\numberline {6.1}Power architecture -- status: OPEN}{8}{section.6.1}%
\contentsline {section}{\numberline {6.2}SDRAM electrical / timing sign-off -- status: PARTIAL}{8}{section.6.2}%
\contentsline {section}{\numberline {6.3}Configuration -- status: OPEN}{8}{section.6.3}%
\contentsline {chapter}{\numberline {7}Benchmarks}{9}{chapter.7}%
\contentsline {section}{\numberline {7.1}Internal benchmark: D-Stress workload}{9}{section.7.1}%
\contentsline {section}{\numberline {7.2}Host-interface pacing benchmark}{9}{section.7.2}%
\contentsline {section}{\numberline {7.3}Software reference comparison}{9}{section.7.3}%
\contentsline {chapter}{\numberline {8}Chip readiness and roadmap}{11}{chapter.8}%
\contentsline {section}{\numberline {8.1}Precise readiness checklist}{11}{section.8.1}%
\contentsline {section}{\numberline {8.2}Final answer}{11}{section.8.2}%
\contentsline {section}{\numberline {8.3}Roadmap}{11}{section.8.3}%
@@ -0,0 +1,123 @@
\thispagestyle{plain}
\noindent
\begin{tikzpicture}
\node[fill=fnDark,text=white,rounded corners=2pt,inner sep=6pt,
minimum width=\textwidth,anchor=west]
{\large\bfseries FPGA-Neural V2 --- General description and features};
\end{tikzpicture}
\vspace{6pt}
\noindent
{\small FPGA-Neural V2 is a \textbf{parametric hardware neural
multiprocessor} built around \code{N\_PROCESSORS} independent INT8 MAC
engines dispatched by a real dependency-graph scheduler
(Dependency Manager $\to$ Neural Director $\to$ per-slot Memory
Manager), streaming weight/activation tiles from, and writing results
to, a \textbf{single external SDRAM chip} -- no PSRAM, no second
memory device anywhere in the V2 physical path. Job registration is
via a real SPI host protocol engine; the host never participates in
the compute datapath.}
\vspace{8pt}
\begin{multicols}{2}
{\color{fnDark}\large\bfseries Features}\\[2pt]
{\footnotesize
\begin{itemize}[leftmargin=1.1em]
\item \textbf{INT8 $\times$ INT8 $\to$ INT32} datapath per processor,
\code{P\_IN}=8-wide parallel MAC, balanced adder tree.
\item \textbf{N\_PROCESSORS} independent Neural Processors (frozen
reference: N=4; N=2 also fully validated; N=8 is a future
evolution).
\item \textbf{Unified single-SDRAM memory}: weights, activations, AND
results all share ONE physical Alliance Memory
\code{AS4C4M16SA-6TIN} (8\,MB, 16-bit), through one
\code{sdram\_unified\_backend} arbitrating a read-only,
cached weight (W) port and a read/write, byte-maskable
activation+result (AR) port.
\item Real dependency-graph scheduling: the Dependency Manager tracks
per-node WAITING/READY/DISPATCHED state and producer/consumer
wake-up; the Neural Director allocates the first free processor
slot.
\item \textbf{Real SPI host protocol engine}
(\code{spi\_host\_bridge.v}): \code{WRITE\_JOB} (job
registration), \code{WRITE\_MEM}/\code{READ\_MEM} (raw SDRAM
access), \code{STATUS}, \code{RESET}.
\item \textbf{Real ECP5 clock generation}: 16\,MHz oscillator
$\to$ \code{EHXPLLL} (real Project Trellis \code{ecppll}
parameters) $\to$ 64\,MHz system clock.
\item Real reset architecture (\code{reset\_sync.v}): asynchronous
assertion, synchronous deassertion, gated by external POR and
PLL lock.
\item Verified in \textbf{simulation} (Verilator, bit-exact) and real
synthesis + place-and-route (Yosys + nextpnr-ecp5).
\end{itemize}}
\columnbreak
{\color{fnDark}\large\bfseries Applications}\\[2pt]
{\footnotesize
\begin{itemize}[leftmargin=1.1em]
\item Deterministic low-latency inference as an SPI peripheral of a
microcontroller or SoC host.
\item Reusable dependency-graph compute fabric, not a single fixed
network topology.
\item Edge AI on compact, INT8-quantized dense/DAG-structured
networks.
\item Off-loading neural workload from a constrained host CPU to
dedicated hardware with predictable, measured throughput.
\end{itemize}}
\vspace{4pt}
{\color{fnDark}\large\bfseries Target \& toolchain}\\[2pt]
{\footnotesize
\begin{itemize}[leftmargin=1.1em]
\item FPGA: Lattice ECP5 \code{LFE5U-45F-8BG381} ($-8$, CABGA381).
\item Synthesis: Yosys; place\&route: nextpnr-ecp5.
\item Simulation: Verilator (trusted per this project's own DEC-0004
protocol) and Icarus Verilog (cross-checked).
\item SDRAM: Alliance Memory \code{AS4C4M16SA-6TIN} (4M$\times$16, 8\,MB).
\end{itemize}}
\end{multicols}
\vspace{2pt}
% --- key parameter table ---
\noindent
{\small\color{fnDark}\bfseries Key parameters (frozen V2 reference configuration)}
\vspace{2pt}
\noindent
\begin{tabularx}{\textwidth}{L{3.4cm}L{3.8cm}Y}
\toprule
\rowh \thd{Quantity} & \thd{Value} & \thd{Notes} \\
\midrule
Data precision & INT8 (signed) & \code{DATA\_WIDTH}=8 \\
\rowa Accumulator & INT32 (signed) & \code{ACC\_WIDTH}=32 \\
Processors & 4 (N=2 also validated) & \code{N\_PROCESSORS} \\
\rowa MAC width per processor & 8 & \code{P\_IN}=8 \\
Activation & ReLU + INT8 saturate & fixed, matches golden model \\
\rowa External memory & 1 $\times$ SDRAM, 8\,MB & \code{AS4C4M16SA-6TIN}, unified \\
System clock & 64\,MHz (real P\&R, 8/8 seeds PASS) & 16\,MHz osc.\ $\to$ EHXPLLL \\
\rowa Bit-exact regression & 256/256, N=2 and N=4 & Verilator, D-Stress workload \\
Host interface & real SPI (4 pins) & \code{spi\_host\_bridge.v} \\
\bottomrule
\end{tabularx}
\vspace{8pt}
\noindent
{\small\color{fnDark}\bfseries System block diagram}
\begin{center}
\begin{tikzpicture}[node distance=6mm and 10mm,font=\footnotesize]
\node[fnblockD,minimum width=26mm,minimum height=13mm] (host){HOST\\{\scriptsize SPI master}};
\node[fnblockT,right=16mm of host,minimum width=56mm,minimum height=24mm] (eng){};
\node[anchor=north,font=\footnotesize\bfseries,text=fnDark] at (eng.north){FPGA -- Neural Multiprocessor (N=4)};
\node[fnreg,fill=white] (spi) at ([yshift=-3mm]eng.center){\code{spi\_host\_bridge} + Dependency Manager};
\node[fnreg,fill=white,below=2.5mm of spi] (mm){Neural Director $\to$ 4$\times$ Memory Manager $\to$ Neural Processor};
\node[fnreg,fill=white,above=2.5mm of spi] (be){\code{sdram\_unified\_backend} (W + AR arbitration)};
\node[fnblock,right=16mm of eng,minimum width=24mm,minimum height=13mm] (ram){SDRAM 8\,MB\\{\scriptsize unified: W+A+R}};
\draw[fnbus] (host) -- node[fnlbl,above]{SPI} (eng.west|-host);
\draw[fnbus] (eng.east|-ram) -- node[fnlbl,above]{16-bit} (ram);
\end{tikzpicture}
\end{center}
\begin{center}\footnotesize\itshape\color{fnGrey}
Weights, activations and results all share the single physical SDRAM;
the host only registers jobs and reads back results over SPI.\end{center}
@@ -0,0 +1,53 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@ii {\LT@entry
{1}{125.81102pt}\LT@entry
{1}{346.50493pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Overview}{1}{chapter.1}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Document scope and status labels}{1}{section.1.1}\protected@file@percent }
\newlabel{sec:status-labels}{{1.1}{1}{Document scope and status labels}{section.1.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {1.2}Frozen reference configuration}{1}{section.1.2}\protected@file@percent }
\@setckpt{chapters/01-overview}{
\setcounter{page}{2}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{1}
\setcounter{section}{2}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{1}
\setcounter{LT@tables}{2}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{3}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,64 @@
\chapter{Overview}
FPGA-Neural V2 succeeds V1 with three architectural changes, all
frozen and verified in this revision:
\begin{enumerate}
\item \textbf{Neural multiprocessor}: N\_PROCESSORS (4, frozen
reference) independent Neural Processors instead of V1's single
engine, scheduled by a real dependency-graph Dependency Manager and
Neural Director.
\item \textbf{Unified single-SDRAM memory}: one physical Alliance
Memory \code{AS4C4M16SA-6TIN} SDRAM serves weights, activations,
\emph{and} results. V1's PSRAM (\code{IS66WVE4M16EBLL-70BLI}) and
its controller are not part of V2's physical path at all.
\item \textbf{Real physical host interface}: a from-scratch SPI
protocol engine (\code{spi\_host\_bridge.v}) replaces the internal
110-pin \code{reg\_*} testbench bus as the board-level top's own
physical interface.
\end{enumerate}
V1 itself (\code{hardware/v1/**}) is untouched and remains the golden,
independently certified reference design; V2 shares no RTL file with
it.
\section{Document scope and status labels}
\label{sec:status-labels}
This datasheet distinguishes explicitly between:
\begin{itemize}
\item \textbf{RTL verified} -- verified through RTL simulation only.
\item \textbf{Simulation verified} -- verified in simulation for the
specific configuration named.
\item \textbf{Synthesis verified} -- synthesizes cleanly for the
target FPGA (Yosys, real run, zero unintended latches or
multi-driver issues beyond a small, previously-reviewed benign set).
\item \textbf{P\&R verified} -- successfully placed, routed, and
timing-analyzed by nextpnr-ecp5 for a real, ball-assigned LPF.
\item \textbf{Hardware designed} -- schematic/PCB electrically
designed but not fabricated.
\item \textbf{Hardware validated} -- physically tested on fabricated
hardware.
\item \textbf{Silicon validated} -- the actual physical FPGA has been
programmed and tested.
\end{itemize}
As of \datasheetdate, V2 is \textbf{RTL verified}, \textbf{simulation
verified} (bit-exact), \textbf{synthesis verified}, and \textbf{P\&R
verified}. No item in this datasheet is presented as hardware- or
silicon-validated -- no fabricated V2 board exists. See
Chapter~\ref{ch:status} for the complete, itemized status.
\section{Frozen reference configuration}
\begin{tabularx}{\textwidth}{L{4cm}Y}
\toprule
\rowh \thd{Parameter} & \thd{Value} \\
\midrule
FPGA & Lattice \code{LFE5U-45F-8BG381}, speed grade $-8$, CABGA381 \\
\rowa N\_PROCESSORS & 4 (frozen reference; N=2 also fully validated) \\
P\_IN & 8 (MAC width per processor) \\
\rowa ACC\_WIDTH & 32 \\
External memory & 1 $\times$ SDRAM, Alliance Memory \code{AS4C4M16SA-6TIN}, 8\,MB \\
\rowa Oscillator & 16\,MHz (board-level, external) \\
System clock & 64\,MHz, generated by a real ECP5 \code{EHXPLLL} \\
\rowa Host interface & real SPI (4 pins), \code{spi\_host\_bridge.v} \\
\bottomrule
\end{tabularx}
@@ -0,0 +1,54 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@iii {\LT@entry
{1}{103.04872pt}\LT@entry
{1}{103.04872pt}\LT@entry
{1}{266.2185pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Architecture}{2}{chapter.2}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Compute: Neural Multiprocessor}{2}{section.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Unified single-SDRAM memory}{2}{section.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Read-timing discipline (ERR-0025)}{3}{section.2.3}\protected@file@percent }
\@setckpt{chapters/02-architecture}{
\setcounter{page}{4}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{2}
\setcounter{section}{3}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{1}
\setcounter{LT@tables}{3}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{7}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,86 @@
\chapter{Architecture}
\section{Compute: Neural Multiprocessor}
Each of the \code{N\_PROCESSORS} Neural Processors is an independent
INT8 datapath: \code{P\_IN}=8 parallel multipliers feeding a balanced
binary adder tree into a 32-bit accumulator, followed by ReLU and INT8
saturation -- byte-for-byte identical to \code{neural\_processor.v},
unmodified since before the V2 single-SDRAM freeze. Job dispatch is a
real dependency-graph pipeline:
\begin{center}
\begin{tikzpicture}[node distance=5mm and 6mm,font=\scriptsize]
\node[fnreg] (host) {SPI host\\bridge};
\node[fnreg,right=of host] (dm) {Dependency\\Manager};
\node[fnreg,right=of dm] (dir) {Neural\\Director};
\node[fnreg,below=of dir] (mm) {Memory Manager\\(per slot)};
\node[fnreg,left=of mm] (np) {Neural\\Processor};
\draw[fnarrow] (host) -- (dm);
\draw[fnarrow] (dm) -- (dir);
\draw[fnarrow] (dir) -- (mm);
\draw[fnarrow] (mm) -- (np);
\end{tikzpicture}
\end{center}
The Dependency Manager holds a per-node table (state, required/
resolved producer count, job descriptor fields) and hands READY nodes
to the Director one at a time (valid/ready, backpressure-safe). The
Director allocates the first free processor slot (first-free, not
load-balanced) and frees it the instant that slot's job completes.
\section{Unified single-SDRAM memory}
\begin{center}
\begin{tikzpicture}[node distance=6mm and 10mm,font=\footnotesize]
\node[fnblockT,minimum width=50mm,minimum height=20mm] (fpga){};
\node[anchor=north,font=\bfseries,text=fnDark] at (fpga.north){FPGA};
\node[fnreg,fill=white] (np) at ([yshift=2mm]fpga.center){4$\times$ Neural Processor};
\node[fnreg,fill=white,below=2mm of np] (be){Unified SDRAM Backend / Arbiter};
\node[fnblock,right=16mm of fpga,minimum height=20mm] (ram){\code{AS4C4M16SA-6TIN}\\Weights\\Activations\\Results};
\draw[fnbus] (fpga.east|-be) -- node[fnlbl,above]{16-bit SDRAM bus} (ram);
\end{tikzpicture}
\end{center}
\code{sdram\_unified\_backend.v} owns exactly one \code{sdram\_
controller.v} instance and presents two logical ports:
\begin{itemize}
\item \textbf{W} (weight fetch): 64-bit, read-only, a 4-entry
fully-associative ``other half'' cache (round-robin eviction --
safe under any sizing, since an evicted-too-early entry only costs
an extra real fetch, never wrong data).
\item \textbf{AR} (activation fill + result write-back): 16-bit,
read/write, byte-maskable via real SDR SDRAM DQM semantics
(\code{lb\_n}/\code{ub\_n}).
\end{itemize}
Both ports are, in turn, each arbitrated across the N\_PROCESSORS
slots by a generic, reused \code{slot\_mem\_arbiter} (a proven,
pending-latch-based, single-owner-until-ready design used identically
throughout this project).
\subsection*{Official V2 memory map}
\begin{tabularx}{\textwidth}{L{3.2cm}L{3.2cm}Y}
\toprule
\rowh \thd{Region} & \thd{Base address} & \thd{Notes} \\
\midrule
Weights & \code{0x010000} & 1\,MB-aligned \\
\rowa Activations & \code{0x200000} & 1\,MB-aligned \\
Results & \code{0x300000} & 1\,MB-aligned \\
\bottomrule
\end{tabularx}
All three regions are non-overlapping within the single 8\,MB
(\code{0x000000}--\code{0x7FFFFF}) SDRAM address space. Base addresses
are host-programmable per job (via \code{WRITE\_JOB}'s own
\code{x\_base}/\code{w\_base}/\code{result\_addr} fields), not hard-coded
in the datapath.
\section{Read-timing discipline (ERR-0025)}
The shared weight and activation SRAMs (\code{nms\_weight\_packed.v},
\code{nms\_activation\_replicated.v}) use \textbf{combinational} read
ports, matching the exact 1-cycle latency assumption of the per-slot
Memory Manager's own pipelined read-ahead consumer. An earlier,
registered-read implementation added one uncounted cycle of latency
that a busy, multi-tile job's own prefetch lead time always absorbed
invisibly, but that an uncontested single-tile job exposed on its
first (only) tile -- found and fixed via this revision's own
board-level SPI integration testing, with zero regression to the
existing bit-exact regression suite (identical cycle counts before and
after the fix).
@@ -0,0 +1,49 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Clock and reset architecture}{4}{chapter.3}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Clock generation}{4}{section.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Reset architecture}{4}{section.3.2}\protected@file@percent }
\@setckpt{chapters/03-clock-reset}{
\setcounter{page}{5}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{3}
\setcounter{section}{2}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{0}
\setcounter{LT@tables}{3}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{10}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,54 @@
\chapter{Clock and reset architecture}
\section{Clock generation}
\begin{center}
\begin{tikzpicture}[node distance=8mm and 14mm,font=\footnotesize]
\node[fnblockD] (osc){16\,MHz\\oscillator};
\node[fnblockT,right=of osc] (pll){ECP5 \code{EHXPLLL}};
\node[fnblock,right=of pll] (sys){system clock\\64\,MHz};
\draw[fnbus] (osc) -- (pll);
\draw[fnbus] (pll) -- (sys);
\end{tikzpicture}
\end{center}
\code{ecp5\_pll\_sys\_clk.v} instantiates a real \code{EHXPLLL}, with
parameters generated by Project Trellis's own \code{ecppll} utility
(not hand-derived): \code{CLKI\_DIV}=1, \code{CLKFB\_DIV}=4,
\code{CLKOP\_DIV}=9, \code{FEEDBK\_PATH}=\code{CLKOP}, giving a real
VCO frequency of 576\,MHz (within the ECP5's documented 400--800\,MHz
range) and an exact, zero-error 64\,MHz output ($16 \times 4 / 1$,
divided by 9 at the VCO). 64\,MHz was chosen over 80\,MHz specifically
because it is the highest frequency at which \emph{all} measured P\&R
seeds close timing with real margin -- see Chapter~\ref{ch:pinout} for
the full 8-seed table.
Simulation note: \code{EHXPLLL} has no open, licensable behavioral
model (Lattice ships it only inside encrypted simulation libraries).
\code{ecp5\_pll\_sys\_clk.v} therefore provides a declared,
simulation-only bypass under a \code{`SIM} define (\code{clk\_sys}
tied directly to \code{clk\_16mhz}, \code{locked} tied high) -- this is
not, and does not claim to be, a simulation of real PLL lock timing.
\section{Reset architecture}
\begin{center}
\begin{tikzpicture}[node distance=8mm and 14mm,font=\footnotesize]
\node[fnblockD] (por){External POR\\/ supervisor};
\node[fnblockT,right=of por] (rs){\code{reset\_sync.v}};
\node[fnblock,right=of rs] (rst){\code{rst}\\(sync-deassert)};
\node[fnblock,below=6mm of rs] (lock){PLL \code{locked}};
\draw[fnbus] (por) -- (rs);
\draw[fnbus] (rs) -- (rst);
\draw[fnbus] (lock) -- (rs);
\end{tikzpicture}
\end{center}
\code{reset\_sync.v} is a standard async-assert/sync-deassert bridge:
\code{rst} is asserted \emph{immediately} (combinationally) whenever
either the external POR (\code{ext\_rst\_n}, active-low) is asserted
\emph{or} the PLL has not yet reported lock, and is released only
after two flip-flops of the system clock following both conditions
clearing -- so no downstream synchronous logic (SDRAM controller,
compute datapath, SPI bridge) ever sees an asynchronous release edge.
This is a real, RTL-implemented mechanism, not a placeholder: it is
included, unmodified, in every synthesis and P\&R run reported in this
datasheet.
@@ -0,0 +1,54 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@iv {\LT@entry
{1}{68.9055pt}\LT@entry
{1}{103.04872pt}\LT@entry
{1}{300.36172pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Host interface (SPI)}{5}{chapter.4}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {4.1}Opcodes}{5}{section.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.2}Verification}{5}{section.4.2}\protected@file@percent }
\newlabel{sec:host}{{4.2}{5}{Verification}{section.4.2}{}}
\@setckpt{chapters/04-host-interface}{
\setcounter{page}{6}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{4}
\setcounter{section}{2}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{1}
\setcounter{LT@tables}{4}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{13}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,47 @@
\chapter{Host interface (SPI)}
\code{spi\_host\_bridge.v} is the real, physical host interface for
V2's board-level top (\code{fpga\_neural\_v2\_top.v}). It replaces the
internal 110-pin \code{reg\_*} bus (a simulation/testbench convenience
that must never be represented as a physical board interface) with 4
real pins: \sig{spi\_sclk}, \sig{spi\_mosi}, \sig{spi\_miso},
\sig{spi\_cs\_n}. Mode 0 (CPOL=0/CPHA=0), MSB-first, one opcode per
CS-low period.
\section{Opcodes}
\begin{tabularx}{\textwidth}{L{2cm}L{3.2cm}Y}
\toprule
\rowh \thd{Opcode} & \thd{Name} & \thd{Function} \\
\midrule
\op{0x10} & \op{WRITE\_JOB} & 15-byte payload: node id, required
dependency count, producer ids, \sig{x\_base}, \sig{w\_base},
\sig{n\_tiles}, \sig{result\_addr}. Registers one Dependency Manager
job; \sig{reg\_valid} is held until the same-cycle
\sig{reg\_valid}\,\&\&\,\sig{reg\_ready} acceptance fires. \\
\rowa \op{0x01} & \op{WRITE\_MEM} & word-addressed raw SDRAM write,
via a second, arbitrated AR port. \\
\op{0x02} & \op{READ\_MEM} & word-addressed raw SDRAM read. \\
\rowa \op{0x20} & \op{STATUS} & 1-byte status: job-busy, mem-busy,
sticky last-job-accepted. \\
\op{0x0F} & \op{RESET} & pulses a soft-reset into the compute+memory
core (not the SPI bridge's own state, avoiding a self-reset hazard). \\
\bottomrule
\end{tabularx}
\section{Verification}
\label{sec:host}
The protocol engine is verified in two independent ways:
\begin{itemize}
\item \textbf{Isolated}: \code{tb\_spi\_host\_bridge.v}, 18/18 PASS --
every opcode, including a real DQM-style byte-masked
\op{WRITE\_MEM}.
\item \textbf{End-to-end}: \code{tb\_fpga\_neural\_v2\_top\_smoke.v},
11/11 PASS -- a single job, two jobs back-to-back, two jobs across a
realistic $\sim$85\,\textmu s SPI-paced gap, and a parametric sweep
of inter-job gaps (100\,ns / 5\,000\,ns / 50\,000\,ns), all checked
bit-exact against a software golden model via a real SDRAM backdoor
readback.
\end{itemize}
Both regressions pass with \textbf{zero regression} to the existing
N=2/N=4 D-Stress bit-exact baseline (identical cycle counts before and
after every fix applied during this interface's own development).
@@ -0,0 +1,64 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@v {\LT@entry
{1}{85.97733pt}\LT@entry
{1}{57.52458pt}\LT@entry
{1}{40.45274pt}\LT@entry
{1}{288.3613pt}}
\gdef \LT@vi {\LT@entry
{1}{108.73918pt}\LT@entry
{1}{363.57677pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Pinout, place-and-route, and timing}{6}{chapter.5}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:pinout}{{5}{6}{Pinout, place-and-route, and timing}{chapter.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {5.1}Final pinout}{6}{section.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.2}Synthesis (real, this revision)}{6}{section.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.3}Place and route: 8-seed timing table}{6}{section.5.3}\protected@file@percent }
\gdef \LT@vii {\LT@entry
{1}{57.52458pt}\LT@entry
{1}{80.28644pt}\LT@entry
{1}{68.9055pt}\LT@entry
{1}{265.59943pt}}
\@setckpt{chapters/05-pinout-timing}{
\setcounter{page}{8}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{5}
\setcounter{section}{3}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{3}
\setcounter{LT@tables}{7}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{17}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,84 @@
\chapter{Pinout, place-and-route, and timing}
\label{ch:pinout}
\section{Final pinout}
All 44 top-level signals of \code{fpga\_neural\_v2\_top.v} carry a
real ball assignment (\code{v2\_board\_top.lpf}), sourced from the
official Lattice pinout CSV (rev.\ 3.0) and confirmed by a real,
successful nextpnr-ecp5 P\&R run -- \textbf{no placeholders}.
\begin{tabularx}{\textwidth}{L{2.6cm}L{1.6cm}L{1cm}Y}
\toprule
\rowh \thd{Signal} & \thd{Ball} & \thd{Bank} & \thd{Notes} \\
\midrule
\sig{osc\_clk} & H5 & -- & reused from V1's own validated LPF \\
\rowa \sig{ext\_rst\_n} & B4 & -- & reused from V1's own validated LPF \\
\sig{spi\_sclk} & L3 & 6/7 & real, plain GPIO \\
\rowa \sig{spi\_mosi} & M3 & 6/7 & real, plain GPIO \\
\sig{spi\_miso} & L2 & 6/7 & real, plain GPIO \\
\rowa \sig{spi\_cs\_n} & N2 & 6/7 & real, plain GPIO \\
\sig{pll\_locked} & L1 & 6/7 & real, plain GPIO (bring-up/debug) \\
\rowa \sig{sdram\_*} (37 signals) & see LPF & 6/7 & control/address/data/mask bus \\
\bottomrule
\end{tabularx}
All signals are assumed LVCMOS33, matching banks 6/7's own real VCCIO
range and the SDRAM device's own 3.3\,V requirement (not yet
independently cross-verified at the schematic/PCB level -- a
disclosed WARNING, not a blocker).
\section{Synthesis (real, this revision)}
Yosys \code{synth\_ecp5}, target \code{fpga\_neural\_v2\_top}, real
run, zero CHECK-pass problems:
\begin{tabularx}{\textwidth}{L{3.4cm}Y}
\toprule
\rowh \thd{Resource} & \thd{Count} \\
\midrule
\code{TRELLIS\_FF} & 6\,322 \\
\rowa \code{TRELLIS\_COMB} (LUT4 equiv.) & 7\,084 \\
\code{MULT18X18D} & 32 (=\,4 processors $\times$ 8-wide MAC) \\
\rowa \code{EHXPLLL} & 1 (real PLL, confirmed present) \\
\code{DP16KD} & 0 (all small SRAMs synthesize to distributed RAM) \\
\bottomrule
\end{tabularx}
38 unique warnings (43 total), all matching this project's own
previously-reviewed, benign baseline set (a known \code{genvar}
multi-driver artifact in \code{neural\_processor.v}, small-array-to-
register unrolling, and the real SDRAM \code{DQ} tristate bus) -- no
new warnings introduced by the SPI bridge, PLL, or reset synchronizer.
\section{Place and route: 8-seed timing table}
Real nextpnr-ecp5 P\&R, same final top and LPF, 8 distinct seeds,
target 64\,MHz:
\begin{tabularx}{\textwidth}{L{1.6cm}L{2.4cm}L{2cm}Y}
\toprule
\rowh \thd{Seed} & \thd{Fmax (MHz)} & \thd{Result} & \thd{Slack @ 64\,MHz} \\
\midrule
1 & 73.17 & \PASS & +1.958\,ns \\
\rowa 2 & 68.90 & \PASS & +1.111\,ns \\
3 & 72.10 & \PASS & +1.755\,ns \\
\rowa 4 & 68.51 & \PASS & +1.029\,ns (worst) \\
5 & 69.29 & \PASS & +1.193\,ns \\
\rowa 6 & 73.03 & \PASS & +1.931\,ns \\
7 & 74.17 & \PASS & +2.143\,ns (best) \\
\rowa 8 & 70.10 & \PASS & +1.360\,ns \\
\bottomrule
\end{tabularx}
\textbf{8/8 seeds PASS at 64\,MHz} -- worst 68.51\,MHz, best
74.17\,MHz, mean 71.16\,MHz. Every seed also fits with real routing
margin: \code{TRELLIS\_IO}=44/245 (17\%), zero unrouted nets, zero
placement/routing errors, across all 8 runs.
The critical path is routing-dominated (typ.\ 15--20\% logic / 80--85\%
routing) and alternates, seed to seed, between two comparably-tight
structures already documented in this project's own prior timing
investigations: \code{dependency\_manager.v}'s own wide priority-encoder
scan, and \code{sdram\_unified\_backend.v}'s own weight-cache
hit-index logic -- neither is a new defect introduced by this
revision.
Hold timing was not separately reported by this toolchain's standard
summary output and was not independently analyzed this round (an
honest, disclosed OPEN item, not a fabricated PASS).
@@ -0,0 +1,54 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@viii {\LT@entry
{1}{85.97733pt}\LT@entry
{1}{74.59596pt}\LT@entry
{1}{311.74266pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Power, SDRAM electrical, and configuration}{8}{chapter.6}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {6.1}Power architecture -- status: OPEN}{8}{section.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.2}SDRAM electrical / timing sign-off -- status: PARTIAL}{8}{section.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.3}Configuration -- status: OPEN}{8}{section.6.3}\protected@file@percent }
\@setckpt{chapters/06-power-configuration}{
\setcounter{page}{9}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{6}
\setcounter{section}{3}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{1}
\setcounter{LT@tables}{8}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{21}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,42 @@
\chapter{Power, SDRAM electrical, and configuration}
\section{Power architecture -- status: OPEN}
Rail \emph{voltages} are real, DATASHEET VALUEs from the actual ECP5
and \code{AS4C4M16SA-6TIN} datasheets; regulator selection, current
budget, and decoupling are \textbf{not} finalized in this revision.
\begin{tabularx}{\textwidth}{L{2.6cm}L{2.2cm}Y}
\toprule
\rowh \thd{Rail} & \thd{Nominal} & \thd{Status} \\
\midrule
VCC (core) & 1.1\,V & DATASHEET VALUE; regulator TBD \\
\rowa VCCAUX & 2.5\,V & DATASHEET VALUE; regulator TBD \\
VCCIO 6/7 (SDRAM) & 3.3\,V (assumed) & matches SDRAM's own LVCMOS33 need; not independently re-verified \\
\rowa SDRAM VDD/VDDQ & 3.3\,V & DATASHEET VALUE (\code{AS4C4M16SA-6TIN}) \\
\bottomrule
\end{tabularx}
No real power-estimation tool was run against the actual synthesized
netlist this revision; a real, computed current budget therefore
remains an OPEN item, not an invented number.
\section{SDRAM electrical / timing sign-off -- status: PARTIAL}
\code{AS4C4M16SA-6TIN} is a standard JEDEC SDR SDRAM; the controller
(\code{sdram\_controller.v}) implements a real power-up wait, mode
register set, and periodic AUTO REFRESH, verified functionally in
simulation (init/refresh/read/write/burst/masked-write, 40 real
refresh events per D-Stress run, zero corruption). A byte-for-byte
cross-check of the controller's own timing constants against the
device's real datasheet parameters (CAS latency, \sig{tRCD},
\sig{tRP}, refresh interval, setup/hold) was \textbf{not} independently
re-performed this revision -- simulation-level correctness is
established; a dedicated datasheet-parameter audit remains an OPEN
item before board layout.
\section{Configuration -- status: OPEN}
Standard ECP5 JTAG (\sig{TDI}/\sig{TDO}/\sig{TCK}/\sig{TMS}) and
configuration (\sig{PROGRAMN}/\sig{INITN}/\sig{DONE}/\sig{CCLK}) pins
are identified and standard (real balls listed in
\code{docs/pinouts.md}); JTAG remains available regardless of boot
mode. No configuration-flash part number has been selected, and no
SPI-flash-boot-vs-JTAG-only decision has been made this revision.
@@ -0,0 +1,58 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@ix {\LT@entry
{1}{68.9055pt}\LT@entry
{1}{80.28644pt}\LT@entry
{1}{80.28644pt}\LT@entry
{1}{242.83757pt}}
\gdef \LT@x {\LT@entry
{1}{137.19194pt}\LT@entry
{1}{335.12401pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Benchmarks}{9}{chapter.7}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\@writefile{toc}{\contentsline {section}{\numberline {7.1}Internal benchmark: D-Stress workload}{9}{section.7.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.2}Host-interface pacing benchmark}{9}{section.7.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.3}Software reference comparison}{9}{section.7.3}\protected@file@percent }
\@setckpt{chapters/07-benchmarks}{
\setcounter{page}{11}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{7}
\setcounter{section}{3}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{2}
\setcounter{LT@tables}{10}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{25}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,67 @@
\chapter{Benchmarks}
\section{Internal benchmark: D-Stress workload}
256 independent neurons, 128 inputs each (16 tiles of \code{P\_IN}=8),
one shared activation vector -- the project's own existing, reused
benchmark, run against the final, frozen RTL via Verilator.
\begin{tabularx}{\textwidth}{L{2cm}L{2.4cm}L{2.4cm}Y}
\toprule
\rowh \thd{Config} & \thd{Cycles} & \thd{Correctness} & \thd{Latency @ 64\,MHz} \\
\midrule
N=2 & 49\,788 & 256/256 \PASS & 777.9\,\textmu s \\
\rowa N=4 & 49\,771 & 256/256 \PASS & 777.7\,\textmu s \\
\bottomrule
\end{tabularx}
Cycle counts are \textbf{simulation-verified} (Verilator, bit-exact)
and unchanged before/after the ERR-0025 read-timing fix. Latency at
64\,MHz is a \textbf{derived} figure (cycles~/~clock), not an
independently re-simulated wall-clock measurement, and is not a
measured-hardware number (no fabricated board exists).
N=4 barely improves over N=2 on this specific workload
($49\,771$ vs.\ $49\,788$ cycles) because the workload is dominated by
shared-SDRAM and shared-activation-fill traffic, not by raw MAC
throughput -- consistent with this project's own prior STEP17/18
memory-bound-vs-compute-bound findings, not a new anomaly.
\section{Host-interface pacing benchmark}
The board-level SPI smoke test (\S\ref{sec:host}) exercises single-job,
back-to-back, and gap-swept (100\,ns/5\,000\,ns/50\,000\,ns/$\sim$85\,\textmu s)
dispatch patterns -- all 11/11 bit-exact -- establishing that realistic
host pacing does not, itself, change correctness (only the STEP19-era
registered-read bug did, and that is fixed).
\section{Software reference comparison}
\textbf{No physical ESP32 (or other embedded MCU) hardware is
available in this environment.} A real ESP32 benchmark was
\emph{not} performed, and no ESP32 number is estimated or invented
here -- this is a disclosed OPEN item, not a claimed result.
As an honest, clearly-labeled illustrative data point only, the
identical D-Stress arithmetic (256 neurons $\times$ 128 INT8 MACs,
ReLU + INT8 saturate) was compiled (\code{cc~-O2}) and run on the
\emph{development machine itself} (Apple M4, arm64 -- \textbf{not}
an embedded target):
\begin{tabularx}{\textwidth}{L{4.4cm}Y}
\toprule
\rowh \thd{Metric} & \thd{Value} \\
\midrule
Platform & Apple M4 (arm64), \code{cc -O2}, single-threaded scalar C \\
\rowa Latency, full 256-neuron batch & 1.28\,\textmu s \\
Throughput & $2.56\times10^{10}$ MAC/s \\
\bottomrule
\end{tabularx}
On this specific, tiny workload, a modern, auto-vectorizing,
multi-GHz superscalar CPU outperforms the current FPGA design's
\emph{simulated} cycle count in raw latency. This is reported
honestly rather than omitted: FPGA-Neural V2's real value proposition
is a deterministic, low-power, standalone SDRAM-attached accelerator
for hosts that do \emph{not} have this class of CPU (e.g.\ an
ESP32-class microcontroller) -- not a claim of outperforming a
desktop-class processor on this workload size. A real, meaningful
software baseline for THAT comparison requires the actual embedded
target hardware, which remains unavailable this revision.
@@ -0,0 +1,54 @@
\relax
\providecommand\hyper@newdestlabel[2]{}
\gdef \LT@xi {\LT@entry
{1}{194.09746pt}\LT@entry
{1}{278.21849pt}}
\@writefile{toc}{\contentsline {chapter}{\numberline {8}Chip readiness and roadmap}{11}{chapter.8}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:status}{{8}{11}{Chip readiness and roadmap}{chapter.8}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.1}Precise readiness checklist}{11}{section.8.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8.2}Final answer}{11}{section.8.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8.3}Roadmap}{11}{section.8.3}\protected@file@percent }
\@setckpt{chapters/08-status-roadmap}{
\setcounter{page}{13}
\setcounter{equation}{0}
\setcounter{enumi}{3}
\setcounter{enumii}{0}
\setcounter{enumiii}{0}
\setcounter{enumiv}{0}
\setcounter{footnote}{0}
\setcounter{mpfootnote}{0}
\setcounter{part}{0}
\setcounter{chapter}{8}
\setcounter{section}{3}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\setcounter{paragraph}{0}
\setcounter{subparagraph}{0}
\setcounter{figure}{0}
\setcounter{table}{1}
\setcounter{LT@tables}{11}
\setcounter{LT@chunks}{1}
\setcounter{parentequation}{0}
\setcounter{tcbbreakpart}{0}
\setcounter{tcblayer}{0}
\setcounter{tcolorbox@number}{0}
\setcounter{tcbrastercolumn}{1}
\setcounter{tcbrasterrow}{1}
\setcounter{tcbrasternum}{1}
\setcounter{tcbraster}{0}
\setcounter{lstnumber}{1}
\setcounter{tcblisting}{0}
\setcounter{caption@flags}{0}
\setcounter{continuedfloat}{0}
\setcounter{tikztiming@nrows}{0}
\setcounter{tikztimingrows}{0}
\setcounter{tikztimingtrans}{0}
\setcounter{tikztimingtranspos}{0}
\setcounter{section@level}{0}
\setcounter{Item}{3}
\setcounter{Hfootnote}{0}
\setcounter{bookmark@seq@number}{29}
\setcounter{lstlisting}{0}
}
@@ -0,0 +1,59 @@
\chapter{Chip readiness and roadmap}
\label{ch:status}
\section{Precise readiness checklist}
Per this project's own standing rule: no item below is checked unless
genuinely verified; no OPEN item is masked as a future enhancement.
\begin{tabularx}{\textwidth}{L{6.4cm}Y}
\toprule
\rowh \thd{Item} & \thd{Status} \\
\midrule
RTL frozen, zero V1 dependency & \OK \\
\rowa Bit-exact regression (N=2, N=4) & \OK\ (256/256, Verilator) \\
Real SPI host interface, end-to-end & \OK\ (11/11, zero regression) \\
\rowa SDRAM validation (init/refresh/masked-write) & \OK \\
Synthesis (final top, real Yosys run) & \OK\ (0 CHECK-pass problems) \\
\rowa Place\&route (8 real seeds) & \OK\ (8/8 fit, routed, zero errors) \\
Timing closure @ 64\,MHz & \OK\ (8/8 seeds PASS, worst 68.51\,MHz) \\
\rowa Final pinout (44/44 top-level signals) & \OK\ (real balls, P\&R-confirmed) \\
Hold-time analysis & OPEN (not reported by this toolchain's summary) \\
\rowa Power: rail voltages & OK (real datasheet values) \\
Power: regulator selection / current budget & OPEN \\
\rowa SDRAM datasheet-parameter cross-check & OPEN (sim-level only) \\
Configuration flash selection & OPEN \\
\rowa Real KiCad schematic + ERC & NOT STARTED \\
PCB layout & NOT STARTED \\
\rowa BOM (sourced, purchasable parts) & NOT STARTED \\
Physical board bring-up & NOT APPLICABLE (no board fabricated) \\
\rowa Real embedded-target (ESP32) software baseline & NOT AVAILABLE (no hardware) \\
\bottomrule
\end{tabularx}
\section{Final answer}
\begin{center}
\Large\bfseries\color{fnRed}NOT SILICON READY
\end{center}
The RTL, simulation, synthesis, place-and-route, timing, and pinout
gates are all genuinely closed for the final board-level top. The
remaining, real, disclosed blockers are entirely in the physical
domain -- schematic capture, PCB layout, sourced BOM, and (necessarily)
physical fabrication and bring-up -- none of which were claimed
complete in this revision.
\section{Roadmap}
\begin{itemize}
\item Real KiCad schematic capture + ERC.
\item PCB layout (BGA escape, SDRAM routing, power integrity).
\item Sourced, purchasable BOM (regulators, configuration flash,
connectors).
\item Real power current-budget estimate against the actual
synthesized netlist.
\item Real SDRAM-datasheet-parameter cross-check of controller timing
constants.
\item First physical board fabrication and the 15-step bring-up
procedure already documented in \code{FIRST\_POWER\_ON.md}.
\item A real embedded-target (ESP32-class) software baseline, once
hardware is available, to replace this revision's honestly-labeled
desktop-CPU illustrative comparison.
\end{itemize}
@@ -0,0 +1,184 @@
% ======================================================================
% FPGA-Neural Datasheet -- preamble / stile
% ======================================================================
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{helvet}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{courier}
\usepackage{microtype}
\usepackage[a4paper,top=2.4cm,bottom=2.3cm,left=2.2cm,right=2.2cm,headheight=15pt]{geometry}
\usepackage[table]{xcolor}
\usepackage{graphicx}
\usepackage{booktabs}
\usepackage{tabularx}
\usepackage{longtable}
\usepackage{array}
\usepackage{ltablex}
\keepXColumns
\usepackage{multirow}
\usepackage{multicol}
\usepackage{enumitem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{ragged2e}
% ---------- Palette ----------------------------------------------------
\definecolor{fnDark}{HTML}{0B2E4F} % blu profondo (primario)
\definecolor{fnBlue}{HTML}{15629B} % blu medio
\definecolor{fnTeal}{HTML}{0E8F8A} % accento teal
\definecolor{fnAmber}{HTML}{C9761B} % accento ambra
\definecolor{fnRed}{HTML}{B22C34} % fail / warning
\definecolor{fnGreen}{HTML}{2E7D32} % pass / ok
\definecolor{fnGrey}{HTML}{5B6B78}
\definecolor{fnLight}{HTML}{EEF3F7} % sfondo chiaro
\definecolor{fnLight2}{HTML}{E2ECF3}
\definecolor{fnRule}{HTML}{9FB4C4}
\definecolor{codebg}{HTML}{F5F7F9}
\definecolor{codekw}{HTML}{15629B}
\definecolor{codecom}{HTML}{5B6B78}
\definecolor{codestr}{HTML}{0E8F8A}
% ---------- Titoli -----------------------------------------------------
\usepackage{titlesec}
\titleformat{\chapter}[display]
{\normalfont\bfseries\color{fnDark}}
{\filright\Large\color{fnTeal}CHAPTER \thechapter}
{6pt}
{\Huge\filright}
[\vspace{2pt}{\color{fnRule}\titlerule[1.3pt]}]
\titlespacing*{\chapter}{0pt}{6pt}{18pt}
\titleformat{\section}
{\normalfont\large\bfseries\color{fnDark}}{\thesection}{0.6em}{}
\titleformat{\subsection}
{\normalfont\bfseries\color{fnBlue}}{\thesubsection}{0.6em}{}
\titleformat{\subsubsection}
{\normalfont\bfseries\color{fnGrey}}{\thesubsubsection}{0.6em}{}
\titlespacing*{\section}{0pt}{12pt}{4pt}
% ---------- Header / footer -------------------------------------------
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0.6pt}
\renewcommand{\footrulewidth}{0.4pt}
\renewcommand{\headrule}{\hbox to\headwidth{\color{fnRule}\leaders\hrule height \headrulewidth\hfill}}
\renewcommand{\footrule}{\hbox to\headwidth{\color{fnRule}\leaders\hrule height \footrulewidth\hfill}}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\fancyhead[L]{\small\color{fnDark}\textbf{FPGA-Neural}}
\fancyhead[R]{\footnotesize\color{fnGrey}\nouppercase{\leftmark}}
\fancyfoot[L]{\small\color{fnGrey}Datasheet~\textbf{Rev.\,\datasheetrev}}
\fancyfoot[C]{\small\color{fnGrey}manvalan/FPGA-Neural}
\fancyfoot[R]{\small\color{fnGrey}\thepage}
\fancypagestyle{plain}{\fancyhf{}%
\fancyfoot[L]{\small\color{fnGrey}Datasheet~\textbf{Rev.\,\datasheetrev}}%
\fancyfoot[C]{\small\color{fnGrey}manvalan/FPGA-Neural}%
\fancyfoot[R]{\small\color{fnGrey}\thepage}%
\renewcommand{\headrulewidth}{0pt}}
% ---------- tcolorbox --------------------------------------------------
\usepackage[most]{tcolorbox}
\tcbuselibrary{skins,breakable}
% Box "nota"
\newtcolorbox{fnnote}[1][Note]{
enhanced, breakable, colback=fnLight, colframe=fnTeal,
boxrule=0.4pt, left=8pt, right=8pt, top=5pt, bottom=5pt,
fonttitle=\bfseries\color{white}, coltitle=white,
attach boxed title to top left={xshift=6pt,yshift=-3pt},
boxed title style={colback=fnTeal,boxrule=0pt,arc=1pt}, title={#1}}
% Box "attenzione"
\newtcolorbox{fnwarn}[1][Warning]{
enhanced, breakable, colback=fnLight, colframe=fnAmber,
boxrule=0.4pt, left=8pt, right=8pt, top=5pt, bottom=5pt,
fonttitle=\bfseries\color{white}, coltitle=white,
attach boxed title to top left={xshift=6pt,yshift=-3pt},
boxed title style={colback=fnAmber,boxrule=0pt,arc=1pt}, title={#1}}
% Box "registro/parametro"
\newtcolorbox{fnspec}[1][Specification]{
enhanced, breakable, colback=white, colframe=fnBlue,
boxrule=0.7pt, left=8pt, right=8pt, top=5pt, bottom=5pt, arc=1.5pt,
fonttitle=\bfseries\color{white}, coltitle=white,
attach boxed title to top left={xshift=6pt,yshift=-3pt},
boxed title style={colback=fnBlue,boxrule=0pt,arc=1pt}, title={#1}}
% ---------- listings (Verilog) ----------------------------------------
\usepackage{listings}
\lstdefinestyle{verilog}{
language=Verilog,
backgroundcolor=\color{codebg},
basicstyle=\ttfamily\scriptsize,
keywordstyle=\color{codekw}\bfseries,
commentstyle=\color{codecom}\itshape,
stringstyle=\color{codestr},
numbers=left, numberstyle=\tiny\color{fnGrey}, numbersep=7pt,
showstringspaces=false, breaklines=true, frame=leftline,
framerule=1.2pt, rulecolor=\color{fnTeal},
xleftmargin=12pt, framexleftmargin=10pt, tabsize=2,
morekeywords={logic,always_ff,always_comb,localparam,signed,genvar,generate,endgenerate}
}
\lstset{style=verilog}
% ---------- Tabelle ----------------------------------------------------
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
\renewcommand{\arraystretch}{1.25}
\arrayrulecolor{fnRule}
% intestazione tabella colorata
\newcommand{\thd}[1]{\textbf{\color{white}#1}}
\newcommand{\rowh}{\rowcolor{fnDark}}
\newcommand{\rowa}{\rowcolor{fnLight}}
% ---------- Caption ----------------------------------------------------
\usepackage{caption}
\captionsetup{font=small,labelfont={bf,color=fnTeal},labelsep=period}
% ---------- TikZ / pgfplots -------------------------------------------
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning,calc,shapes.geometric,shapes.misc,
fit,backgrounds,chains,decorations.pathreplacing,decorations.markings,
matrix,shadows.blur}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepackage{tikz-timing}
% stili di blocco riusabili
\tikzset{
fnblock/.style={draw=fnBlue,fill=fnLight,rounded corners=2pt,
minimum height=9mm,minimum width=24mm,align=center,font=\small,
inner sep=4pt,line width=0.7pt},
fnblockT/.style={fnblock,draw=fnTeal,fill=fnLight2},
fnblockD/.style={fnblock,draw=fnDark,fill=fnDark,text=white},
fnblockA/.style={fnblock,draw=fnAmber,fill=white},
fnreg/.style={draw=fnGrey,fill=white,minimum height=8mm,align=center,
font=\footnotesize,inner sep=3pt},
fnstate/.style={draw=fnBlue,fill=fnLight,circle,minimum size=13mm,
align=center,font=\scriptsize,line width=0.7pt},
fnarrow/.style={-{Stealth[length=2.6mm]},line width=0.8pt,draw=fnDark},
fnarrowT/.style={-{Stealth[length=2.6mm]},line width=0.8pt,draw=fnTeal},
fnbus/.style={-{Stealth[length=3mm]},line width=1.6pt,draw=fnBlue},
fnlbl/.style={font=\scriptsize\itshape,fill=white,inner sep=1pt,text=fnGrey}
}
% ---------- varie ------------------------------------------------------
\newcommand{\reg}[1]{\texttt{\textbf{#1}}}
\newcommand{\sig}[1]{\texttt{#1}}
\newcommand{\op}[1]{\texttt{\color{fnBlue}#1}}
\newcommand{\PASS}{\textcolor{fnGreen}{\textbf{PASS}}}
\newcommand{\FAIL}{\textcolor{fnRed}{\textbf{FAIL}}}
\newcommand{\OK}{\textcolor{fnGreen}{\textbf{OK}}}
\newcommand{\code}[1]{\texttt{#1}}
\usepackage{enumitem}
\setlist{noitemsep,topsep=2pt,leftmargin=1.4em}
\usepackage[hidelinks,colorlinks=true,linkcolor=fnBlue,urlcolor=fnTeal,
citecolor=fnBlue]{hyperref}