From 18bf038ed50d5471039a5c67e1327e11c6b25897 Mon Sep 17 00:00:00 2001 From: Michele Bigi Date: Sun, 6 Sep 2026 15:02:25 +0200 Subject: [PATCH] v1 datasheet latex source --- .../FPGA-Neural-Datasheet-EN.aux | 34 + .../FPGA-Neural-Datasheet-EN.log | 2580 +++++++++++++++++ .../FPGA-Neural-Datasheet-EN.out | 121 + .../FPGA-Neural-Datasheet-EN.pdf | Bin 0 -> 453580 bytes .../FPGA-Neural-Datasheet-EN.tex | 119 + .../FPGA-Neural-Datasheet-EN.toc | 122 + .../DatasheetLatex/chapters/00-features.tex | 120 + .../DatasheetLatex/chapters/00b-pinout.tex | 103 + .../DatasheetLatex/chapters/01-overview.aux | 53 + .../DatasheetLatex/chapters/01-overview.tex | 93 + .../chapters/02-architettura.aux | 54 + .../chapters/02-architettura.tex | 80 + .../DatasheetLatex/chapters/03-datapath.aux | 63 + .../DatasheetLatex/chapters/03-datapath.tex | 166 ++ .../DatasheetLatex/chapters/04-parametri.aux | 66 + .../DatasheetLatex/chapters/04-parametri.tex | 88 + .../DatasheetLatex/chapters/05-memoria.aux | 68 + .../DatasheetLatex/chapters/05-memoria.tex | 187 ++ .../DatasheetLatex/chapters/06-sequencer.aux | 57 + .../DatasheetLatex/chapters/06-sequencer.tex | 111 + .../DatasheetLatex/chapters/06b-grafo.aux | 75 + .../DatasheetLatex/chapters/06b-grafo.tex | 190 ++ .../docs/DatasheetLatex/chapters/07-spi.aux | 82 + .../docs/DatasheetLatex/chapters/07-spi.tex | 290 ++ .../chapters/07b-programmazione.aux | 78 + .../chapters/07b-programmazione.tex | 232 ++ .../DatasheetLatex/chapters/08-toplevel.aux | 54 + .../DatasheetLatex/chapters/08-toplevel.tex | 78 + .../chapters/09-implementazione.aux | 76 + .../chapters/09-implementazione.tex | 169 ++ .../DatasheetLatex/chapters/10-hardware.aux | 102 + .../DatasheetLatex/chapters/10-hardware.tex | 326 +++ .../DatasheetLatex/chapters/11-registri.aux | 58 + .../DatasheetLatex/chapters/11-registri.tex | 80 + .../DatasheetLatex/chapters/12-roadmap.aux | 60 + .../DatasheetLatex/chapters/12-roadmap.tex | 64 + .../docs/DatasheetLatex/chapters/A-moduli.aux | 65 + .../docs/DatasheetLatex/chapters/A-moduli.tex | 96 + hardware/v1/docs/DatasheetLatex/preamble.tex | 184 ++ 39 files changed, 6644 insertions(+) create mode 100644 hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.aux create mode 100644 hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.log create mode 100644 hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.out create mode 100644 hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.pdf create mode 100644 hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.tex create mode 100644 hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.toc create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/00-features.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/00b-pinout.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/01-overview.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/01-overview.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/02-architettura.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/02-architettura.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/03-datapath.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/03-datapath.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/04-parametri.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/04-parametri.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/05-memoria.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/05-memoria.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/07-spi.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/07-spi.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/08-toplevel.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/08-toplevel.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/10-hardware.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/10-hardware.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/11-registri.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/11-registri.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.tex create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/A-moduli.aux create mode 100644 hardware/v1/docs/DatasheetLatex/chapters/A-moduli.tex create mode 100644 hardware/v1/docs/DatasheetLatex/preamble.tex diff --git a/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.aux b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.aux new file mode 100644 index 0000000..1f50d6c --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.aux @@ -0,0 +1,34 @@ +\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}{103.04872pt}\LT@entry + {1}{114.43008pt}\LT@entry + {1}{254.83714pt}} +\gdef \LT@ii {\LT@entry + {1}{88.82234pt}\LT@entry + {1}{40.45274pt}\LT@entry + {1}{40.45274pt}\LT@entry + {1}{37.6073pt}\LT@entry + {1}{264.98082pt}} +\@input{chapters/01-overview.aux} +\@input{chapters/02-architettura.aux} +\@input{chapters/03-datapath.aux} +\@input{chapters/04-parametri.aux} +\@input{chapters/05-memoria.aux} +\@input{chapters/06-sequencer.aux} +\@input{chapters/06b-grafo.aux} +\@input{chapters/07-spi.aux} +\@input{chapters/07b-programmazione.aux} +\@input{chapters/08-toplevel.aux} +\@input{chapters/09-implementazione.aux} +\@input{chapters/10-hardware.aux} +\@input{chapters/11-registri.aux} +\@input{chapters/12-roadmap.aux} +\@input{chapters/A-moduli.aux} +\gdef \@abspage@last{56} diff --git a/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.log b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.log new file mode 100644 index 0000000..25cc0d1 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.log @@ -0,0 +1,2580 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.27 (TeX Live 2025) (preloaded format=pdflatex 2025.11.21) 6 SEP 2026 01:14 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**FPGA-Neural-Datasheet-EN.tex +(./FPGA-Neural-Datasheet-EN.tex +LaTeX2e <2024-11-01> patch level 2 +L3 programming layer <2025-01-18> +(/usr/local/texlive/2025/texmf-dist/tex/latex/base/report.cls +Document Class: report 2024/06/29 v1.4n Standard LaTeX document class +(/usr/local/texlive/2025/texmf-dist/tex/latex/base/size11.clo +File: size11.clo 2024/06/29 v1.4n Standard LaTeX file (size option) +) +\c@part=\count196 +\c@chapter=\count197 +\c@section=\count198 +\c@subsection=\count199 +\c@subsubsection=\count266 +\c@paragraph=\count267 +\c@subparagraph=\count268 +\c@figure=\count269 +\c@table=\count270 +\abovecaptionskip=\skip49 +\belowcaptionskip=\skip50 +\bibindent=\dimen141 +) (./preamble.tex (/usr/local/texlive/2025/texmf-dist/tex/latex/base/fontenc.st +y +Package: fontenc 2021/04/29 v2.0v Standard LaTeX package +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2024/02/08 v1.3d Input encoding file +\inpenc@prehook=\toks17 +\inpenc@posthook=\toks18 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2025/02/14 v25.4 The multilingual framework for pdfLaTeX, LuaLaT +eX and XeLaTeX +\babel@savecnt=\count271 +\U@D=\dimen142 +\l@unhyphenated=\language90 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/babel/txtbabel.def) +\bbl@readstream=\read2 +\bbl@dirlevel=\count272 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/babel-english/english.ldf +Language: english 2017/06/06 v3.3r English support from the babel system +Package babel Info: Hyphen rules for 'canadian' set to \l@english +(babel) (\language0). Reported on input line 102. +Package babel Info: Hyphen rules for 'australian' set to \l@ukenglish +(babel) (\language22). Reported on input line 105. +Package babel Info: Hyphen rules for 'newzealand' set to \l@ukenglish +(babel) (\language22). Reported on input line 108. +)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/babel/locale/en/babel-english.t +ex +Package babel Info: Importing font and identification data for english +(babel) from babel-en.ini. Reported on input line 11. +) (/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2020/03/25 PSNFSS-v9.3 (WaS) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2022/05/29 v1.15 key=value parser (DPC) +\KV@toks@=\toks19 +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/courier.sty +Package: courier 2020/03/25 PSNFSS-v9.3 (WaS) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/microtype/microtype.sty +Package: microtype 2025/02/11 v3.2a Micro-typographical refinements (RS) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2025/02/11 v2.5l e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count273 +) +\MT@toks=\toks20 +\MT@tempbox=\box52 +\MT@count=\count274 +LaTeX Info: Redefining \noprotrusionifhmode on input line 1087. +LaTeX Info: Redefining \leftprotrusion on input line 1088. +\MT@prot@toks=\toks21 +LaTeX Info: Redefining \rightprotrusion on input line 1107. +LaTeX Info: Redefining \textls on input line 1449. +\MT@outer@kern=\dimen143 +LaTeX Info: Redefining \microtypecontext on input line 2053. +LaTeX Info: Redefining \textmicrotypecontext on input line 2070. +\MT@listname@count=\count275 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/microtype/microtype-pdftex.def +File: microtype-pdftex.def 2025/02/11 v3.2a Definitions specific to pdftex (RS) + +LaTeX Info: Redefining \lsstyle on input line 944. +LaTeX Info: Redefining \lslig on input line 944. +\MT@outer@space=\skip51 +) +Package microtype Info: Loading configuration file microtype.cfg. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/microtype/microtype.cfg +File: microtype.cfg 2025/02/11 v3.2a microtype main configuration file (RS) +) +LaTeX Info: Redefining \microtypesetup on input line 3065. +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/local/texlive/2025/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. + +(/usr/local/texlive/2025/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2024/12/12 v1.0g TeX engine tests +)) +\Gm@cnth=\count276 +\Gm@cntv=\count277 +\c@Gm@tempcnt=\count278 +\Gm@bindingoffset=\dimen144 +\Gm@wd@mp=\dimen145 +\Gm@odd@mp=\dimen146 +\Gm@even@mp=\dimen147 +\Gm@layoutwidth=\dimen148 +\Gm@layoutheight=\dimen149 +\Gm@layouthoffset=\dimen150 +\Gm@layoutvoffset=\dimen151 +\Gm@dimlist=\toks22 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2024/09/29 v3.02 LaTeX color extensions (UK) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 274. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2024/04/13 v1.2c Graphics/color driver for pdftex +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/mathcolor.ltx) +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1349. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1353. +Package xcolor Info: Model `RGB' extended on input line 1365. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1367. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1370. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1371. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1372. +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/colortbl/colortbl.sty +Package: colortbl 2024/07/06 v1.0i Color table columns (DPC) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/tools/array.sty +Package: array 2024/10/17 v2.6g Tabular extension package (FMi) +\col@sep=\dimen152 +\ar@mcellbox=\box53 +\extrarowheight=\dimen153 +\NC@list=\toks23 +\extratabsurround=\skip52 +\backup@length=\skip53 +\ar@cellbox=\box54 +) +\everycr=\toks24 +\minrowclearance=\skip54 +\rownum=\count279 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2024/08/06 v1.4g Standard LaTeX Graphics (DPC,SPQR) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2023/12/02 v1.11 sin cos tan (DPC) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 106. +) +\Gin@req@height=\dimen154 +\Gin@req@width=\dimen155 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/booktabs/booktabs.sty +Package: booktabs 2020/01/12 v1.61803398 Publication quality tables +\heavyrulewidth=\dimen156 +\lightrulewidth=\dimen157 +\cmidrulewidth=\dimen158 +\belowrulesep=\dimen159 +\belowbottomsep=\dimen160 +\aboverulesep=\dimen161 +\abovetopsep=\dimen162 +\cmidrulesep=\dimen163 +\cmidrulekern=\dimen164 +\defaultaddspace=\dimen165 +\@cmidla=\count280 +\@cmidlb=\count281 +\@aboverulesep=\dimen166 +\@belowrulesep=\dimen167 +\@thisruleclass=\count282 +\@lastruleclass=\count283 +\@thisrulewidth=\dimen168 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tools/tabularx.sty +Package: tabularx 2023/12/11 v2.12a `tabularx' package (DPC) +\TX@col@width=\dimen169 +\TX@old@table=\dimen170 +\TX@old@col=\dimen171 +\TX@target=\dimen172 +\TX@delta=\dimen173 +\TX@cols=\count284 +\TX@ftn=\toks25 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2024-10-27 v4.22 Multi-page Table package (DPC) +\LTleft=\skip55 +\LTright=\skip56 +\LTpre=\skip57 +\LTpost=\skip58 +\LTchunksize=\count285 +\LTcapwidth=\dimen174 +\LT@head=\box55 +\LT@firsthead=\box56 +\LT@foot=\box57 +\LT@lastfoot=\box58 +\LT@gbox=\box59 +\LT@cols=\count286 +\LT@rows=\count287 +\c@LT@tables=\count288 +\c@LT@chunks=\count289 +\LT@p@ftn=\toks26 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/ltablex/ltablex.sty +Package: ltablex 2014/08/13 v1.1 Modified tabularx +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/multirow/multirow.sty +Package: multirow 2024/11/12 v2.9 Span multiple rows of a table +\multirow@colwidth=\skip59 +\multirow@cntb=\count290 +\multirow@dima=\skip60 +\bigstrutjot=\dimen175 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tools/multicol.sty +Package: multicol 2024/09/14 v1.9i multicolumn formatting (FMi) +\c@tracingmulticols=\count291 +\mult@box=\box60 +\multicol@leftmargin=\dimen176 +\c@unbalance=\count292 +\c@collectmore=\count293 +\doublecol@number=\count294 +\multicoltolerance=\count295 +\multicolpretolerance=\count296 +\full@width=\dimen177 +\page@free=\dimen178 +\premulticols=\dimen179 +\postmulticols=\dimen180 +\multicolsep=\skip61 +\multicolbaselineskip=\skip62 +\partial@page=\box61 +\last@line=\box62 +\mc@boxedresult=\box63 +\maxbalancingoverflow=\dimen181 +\mult@rightbox=\box64 +\mult@grightbox=\box65 +\mult@firstbox=\box66 +\mult@gfirstbox=\box67 +\@tempa=\box68 +\@tempa=\box69 +\@tempa=\box70 +\@tempa=\box71 +\@tempa=\box72 +\@tempa=\box73 +\@tempa=\box74 +\@tempa=\box75 +\@tempa=\box76 +\@tempa=\box77 +\@tempa=\box78 +\@tempa=\box79 +\@tempa=\box80 +\@tempa=\box81 +\@tempa=\box82 +\@tempa=\box83 +\@tempa=\box84 +\@tempa=\box85 +\@tempa=\box86 +\@tempa=\box87 +\@tempa=\box88 +\@tempa=\box89 +\@tempa=\box90 +\@tempa=\box91 +\@tempa=\box92 +\@tempa=\box93 +\@tempa=\box94 +\@tempa=\box95 +\@tempa=\box96 +\@tempa=\box97 +\@tempa=\box98 +\@tempa=\box99 +\@tempa=\box100 +\@tempa=\box101 +\@tempa=\box102 +\@tempa=\box103 +\c@minrows=\count297 +\c@columnbadness=\count298 +\c@finalcolumnbadness=\count299 +\last@try=\dimen182 +\multicolovershoot=\dimen183 +\multicolundershoot=\dimen184 +\mult@nat@firstbox=\box104 +\colbreak@box=\box105 +\mc@col@check@num=\count300 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2025/02/06 v3.11 Customized lists +\labelindent=\skip63 +\enit@outerparindent=\dimen185 +\enit@toks=\toks27 +\enit@inbox=\box106 +\enit@count@id=\count301 +\enitdp@description=\count302 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2024/11/05 v2.17t AMS math features +\@mathmargin=\skip64 + +For additional information on amsmath, use the `?' option. +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2021/08/26 v2.01 AMS text + +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks28 +\ex@=\dimen186 +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen187 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2022/04/08 v2.04 operator names +) +\inf@bad=\count303 +LaTeX Info: Redefining \frac on input line 233. +\uproot@=\count304 +\leftroot@=\count305 +LaTeX Info: Redefining \overline on input line 398. +LaTeX Info: Redefining \colon on input line 409. +\classnum@=\count306 +\DOTSCASE@=\count307 +LaTeX Info: Redefining \ldots on input line 495. +LaTeX Info: Redefining \dots on input line 498. +LaTeX Info: Redefining \cdots on input line 619. +\Mathstrutbox@=\box107 +\strutbox@=\box108 +LaTeX Info: Redefining \big on input line 721. +LaTeX Info: Redefining \Big on input line 722. +LaTeX Info: Redefining \bigg on input line 723. +LaTeX Info: Redefining \Bigg on input line 724. +\big@size=\dimen188 +LaTeX Font Info: Redeclaring font encoding OML on input line 742. +LaTeX Font Info: Redeclaring font encoding OMS on input line 743. +\macc@depth=\count308 +LaTeX Info: Redefining \bmod on input line 904. +LaTeX Info: Redefining \pmod on input line 909. +LaTeX Info: Redefining \smash on input line 939. +LaTeX Info: Redefining \relbar on input line 969. +LaTeX Info: Redefining \Relbar on input line 970. +\c@MaxMatrixCols=\count309 +\dotsspace@=\muskip17 +\c@parentequation=\count310 +\dspbrk@lvl=\count311 +\tag@help=\toks29 +\row@=\count312 +\column@=\count313 +\maxfields@=\count314 +\andhelp@=\toks30 +\eqnshift@=\dimen189 +\alignsep@=\dimen190 +\tagshift@=\dimen191 +\tagwidth@=\dimen192 +\totwidth@=\dimen193 +\lineht@=\dimen194 +\@envbody=\toks31 +\multlinegap=\skip65 +\multlinetaggap=\skip66 +\mathdisplay@stack=\toks32 +LaTeX Info: Redefining \[ on input line 2953. +LaTeX Info: Redefining \] on input line 2954. +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/ragged2e/ragged2e.sty +Package: ragged2e 2023/06/22 v3.6 ragged2e Package +\CenteringLeftskip=\skip67 +\RaggedLeftLeftskip=\skip68 +\RaggedRightLeftskip=\skip69 +\CenteringRightskip=\skip70 +\RaggedLeftRightskip=\skip71 +\RaggedRightRightskip=\skip72 +\CenteringParfillskip=\skip73 +\RaggedLeftParfillskip=\skip74 +\RaggedRightParfillskip=\skip75 +\JustifyingParfillskip=\skip76 +\CenteringParindent=\skip77 +\RaggedLeftParindent=\skip78 +\RaggedRightParindent=\skip79 +\JustifyingParindent=\skip80 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/titlesec/titlesec.sty +Package: titlesec 2025/01/04 v2.17 Sectioning titles +\ttl@box=\box109 +\beforetitleunit=\skip81 +\aftertitleunit=\skip82 +\ttl@plus=\dimen195 +\ttl@minus=\dimen196 +\ttl@toksa=\toks33 +\titlewidth=\dimen197 +\titlewidthlast=\dimen198 +\titlewidthfirst=\dimen199 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/fancyhdr/fancyhdr.sty +Package: fancyhdr 2025/02/07 v5.2 Extensive control of page headers and footers + +\f@nch@headwidth=\skip83 +\f@nch@offset@elh=\skip84 +\f@nch@offset@erh=\skip85 +\f@nch@offset@olh=\skip86 +\f@nch@offset@orh=\skip87 +\f@nch@offset@elf=\skip88 +\f@nch@offset@erf=\skip89 +\f@nch@offset@olf=\skip90 +\f@nch@offset@orf=\skip91 +\f@nch@height=\skip92 +\f@nch@footalignment=\skip93 +\f@nch@widthL=\skip94 +\f@nch@widthC=\skip95 +\f@nch@widthR=\skip96 +\@temptokenb=\toks34 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcolorbox.sty +Package: tcolorbox 2024/10/22 version 6.4.1 text color boxes + +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.te +x +\pgfutil@everybye=\toks35 +\pgfutil@tempdima=\dimen256 +\pgfutil@tempdimb=\dimen257 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box110 +) (/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2023-01-15 v3.1.10 (3.1.10) +)) +Package: pgf 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2023-01-15 v3.1.10 (3.1.10) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks36 +\pgfkeys@temptoks=\toks37 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfil +tered.code.tex +\pgfkeys@tmptoks=\toks38 +)) +\pgf@x=\dimen258 +\pgf@y=\dimen259 +\pgf@xa=\dimen260 +\pgf@ya=\dimen261 +\pgf@xb=\dimen262 +\pgf@yb=\dimen263 +\pgf@xc=\dimen264 +\pgf@yc=\dimen265 +\pgf@xd=\dimen266 +\pgf@yd=\dimen267 +\w@pgf@writea=\write3 +\r@pgf@reada=\read3 +\c@pgf@counta=\count315 +\c@pgf@countb=\count316 +\c@pgf@countc=\count317 +\c@pgf@countd=\count318 +\t@pgf@toka=\toks39 +\t@pgf@tokb=\toks40 +\t@pgf@tokc=\toks41 +\pgf@sys@id@count=\count319 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2023-01-15 v3.1.10 (3.1.10) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.d +ef +File: pgfsys-pdftex.def 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-p +df.def +File: pgfsys-common-pdf.def 2023-01-15 v3.1.10 (3.1.10) +))) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath. +code.tex +File: pgfsyssoftpath.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfsyssoftpath@smallbuffer@items=\count320 +\pgfsyssoftpath@bigbuffer@items=\count321 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol. +code.tex +File: pgfsysprotocol.code.tex 2023-01-15 v3.1.10 (3.1.10) +)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2023-01-15 v3.1.10 (3.1.10) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen268 +\pgfmath@count=\count322 +\pgfmath@box=\box111 +\pgfmath@toks=\toks42 +\pgfmath@stack@operand=\toks43 +\pgfmath@stack@operation=\toks44 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code. +tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic +.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigo +nometric.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.rando +m.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.compa +rison.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base. +code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round +.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc. +code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integ +erarithmetics.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count323 +)) (/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.co +de.tex +File: pgfcorepoints.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@picminx=\dimen269 +\pgf@picmaxx=\dimen270 +\pgf@picminy=\dimen271 +\pgf@picmaxy=\dimen272 +\pgf@pathminx=\dimen273 +\pgf@pathmaxx=\dimen274 +\pgf@pathminy=\dimen275 +\pgf@pathmaxy=\dimen276 +\pgf@xx=\dimen277 +\pgf@xy=\dimen278 +\pgf@yx=\dimen279 +\pgf@yy=\dimen280 +\pgf@zx=\dimen281 +\pgf@zy=\dimen282 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconst +ruct.code.tex +File: pgfcorepathconstruct.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@path@lastx=\dimen283 +\pgf@path@lasty=\dimen284 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage +.code.tex +File: pgfcorepathusage.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@shorten@end@additional=\dimen285 +\pgf@shorten@start@additional=\dimen286 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.co +de.tex +File: pgfcorescopes.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfpic=\box112 +\pgf@hbox=\box113 +\pgf@layerbox@main=\box114 +\pgf@picture@serial@count=\count324 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicst +ate.code.tex +File: pgfcoregraphicstate.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgflinewidth=\dimen287 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransform +ations.code.tex +File: pgfcoretransformations.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@pt@x=\dimen288 +\pgf@pt@y=\dimen289 +\pgf@pt@temp=\dimen290 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.cod +e.tex +File: pgfcorequick.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.c +ode.tex +File: pgfcoreobjects.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathproce +ssing.code.tex +File: pgfcorepathprocessing.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.co +de.tex +File: pgfcorearrows.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfarrowsep=\dimen291 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.cod +e.tex +File: pgfcoreshade.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@max=\dimen292 +\pgf@sys@shading@range@num=\count325 +\pgf@shadingcount=\count326 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.cod +e.tex +File: pgfcoreimage.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal. +code.tex +File: pgfcoreexternal.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfexternal@startupbox=\box115 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.co +de.tex +File: pgfcorelayers.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretranspare +ncy.code.tex +File: pgfcoretransparency.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns. +code.tex +File: pgfcorepatterns.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code. +tex +File: pgfcorerdf.code.tex 2023-01-15 v3.1.10 (3.1.10) +))) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.cod +e.tex +File: pgfmoduleshapes.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfnodeparttextbox=\box116 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code. +tex +File: pgfmoduleplot.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version +-0-65.sty +Package: pgfcomp-version-0-65 2023-01-15 v3.1.10 (3.1.10) +\pgf@nodesepstart=\dimen293 +\pgf@nodesepend=\dimen294 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version +-1-18.sty +Package: pgfcomp-version-1-18 2023-01-15 v3.1.10 (3.1.10) +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex) +) (/usr/local/texlive/2025/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2023-01-15 v3.1.10 (3.1.10) +\pgffor@iter=\dimen295 +\pgffor@skip=\dimen296 +\pgffor@stack=\toks45 +\pgffor@toks=\toks46 +)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.cod +e.tex +Package: tikz 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothan +dlers.code.tex +File: pgflibraryplothandlers.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@plot@mark@count=\count327 +\pgfplotmarksize=\dimen297 +) +\tikz@lastx=\dimen298 +\tikz@lasty=\dimen299 +\tikz@lastxsaved=\dimen300 +\tikz@lastysaved=\dimen301 +\tikz@lastmovetox=\dimen302 +\tikz@lastmovetoy=\dimen303 +\tikzleveldistance=\dimen304 +\tikzsiblingdistance=\dimen305 +\tikz@figbox=\box117 +\tikz@figbox@bg=\box118 +\tikz@tempbox=\box119 +\tikz@tempbox@bg=\box120 +\tikztreelevel=\count328 +\tikznumberofchildren=\count329 +\tikznumberofcurrentchild=\count330 +\tikz@fig@count=\count331 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.cod +e.tex +File: pgfmodulematrix.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfmatrixcurrentrow=\count332 +\pgfmatrixcurrentcolumn=\count333 +\pgf@matrix@numberofcolumns=\count334 +) +\tikz@expandcount=\count335 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2023-01-15 v3.1.10 (3.1.10) +))) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tools/verbatim.sty +Package: verbatim 2024-01-22 v1.5x LaTeX2e package for verbatim enhancements +\every@verbatim=\toks47 +\verbatim@line=\toks48 +\verbatim@in@stream=\read4 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/local/texlive/2025/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +)) +\tcb@titlebox=\box121 +\tcb@upperbox=\box122 +\tcb@lowerbox=\box123 +\tcb@phantombox=\box124 +\c@tcbbreakpart=\count336 +\c@tcblayer=\count337 +\c@tcolorbox@number=\count338 +\l__tcobox_tmpa_box=\box125 +\l__tcobox_tmpa_dim=\dimen306 +\tcb@temp=\box126 +\tcb@temp=\box127 +\tcb@temp=\box128 +\tcb@temp=\box129 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbraster.code.tex +Library (tcolorbox): 'tcbraster.code.tex' version '6.4.1' +\c@tcbrastercolumn=\count339 +\c@tcbrasterrow=\count340 +\c@tcbrasternum=\count341 +\c@tcbraster=\count342 +) (/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbskins.code.tex +Library (tcolorbox): 'tcbskins.code.tex' version '6.4.1' +(/usr/local/texlive/2025/texmf-dist/tex/latex/tikzfill/tikzfill.image.sty +Package: tikzfill.image 2023/08/08 v1.0.1 Image filling library for TikZ + +(/usr/local/texlive/2025/texmf-dist/tex/latex/tikzfill/tikzfill-common.sty +Package: tikzfill-common 2023/08/08 v1.0.1 Auxiliary code for tikzfill +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tikzfill/tikzlibraryfill.image.co +de.tex +File: tikzlibraryfill.image.code.tex 2023/08/08 v1.0.1 Image filling library +\l__tikzfill_img_box=\box130 +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbskinsjigsaw.code.tex +Library (tcolorbox): 'tcbskinsjigsaw.code.tex' version '6.4.1' +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbbreakable.code.tex +Library (tcolorbox): 'tcbbreakable.code.tex' version '6.4.1' +(/usr/local/texlive/2025/texmf-dist/tex/latex/pdfcol/pdfcol.sty +Package: pdfcol 2022-09-21 v1.7 Handle new color stacks for pdfTeX (HO) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2023-12-04 v1.26 LaTeX kernel commands for general use (HO) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +)) +Package pdfcol Info: New color stack `tcb@breakable' = 1 on input line 23. +\tcb@testbox=\box131 +\tcb@totalupperbox=\box132 +\tcb@totallowerbox=\box133 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbhooks.code.tex +Library (tcolorbox): 'tcbhooks.code.tex' version '6.4.1' +) (/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbtheorems.code.tex +Library (tcolorbox): 'tcbtheorems.code.tex' version '6.4.1' +) (/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbfitting.code.tex +Library (tcolorbox): 'tcbfitting.code.tex' version '6.4.1' +\tcbfitdim=\dimen307 +\tcb@lowerfitdim=\dimen308 +\tcb@upperfitdim=\dimen309 +\tcb@cur@hbadness=\count343 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcblistingsutf8.code.te +x +Library (tcolorbox): 'tcblistingsutf8.code.tex' version '6.4.1' +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcblistings.code.tex +Library (tcolorbox): 'tcblistings.code.tex' version '6.4.1' +(/usr/local/texlive/2025/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count344 +\lst@gtempboxa=\box134 +\lst@token=\toks49 +\lst@length=\count345 +\lst@currlwidth=\dimen310 +\lst@column=\count346 +\lst@pos=\count347 +\lst@lostspace=\dimen311 +\lst@width=\dimen312 +\lst@newlines=\count348 +\lst@lineno=\count349 +\lst@maxwidth=\dimen313 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/listings/lstpatch.sty +File: lstpatch.sty 2024/09/23 1.10c (Carsten Heinz) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2024/09/23 1.10c (Carsten Heinz) +\c@lstnumber=\count350 +\lst@skipnumbers=\count351 +\lst@framebox=\box135 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2024/09/23 1.10c listings configuration +)) +Package: listings 2024/09/23 1.10c (Carsten Heinz) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcblistingscore.code.te +x +Library (tcolorbox): 'tcblistingscore.code.tex' version '6.4.1' +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbprocessing.code.tex +Library (tcolorbox): 'tcbprocessing.code.tex' version '6.4.1' +) +\c@tcblisting=\count352 +)) (/usr/local/texlive/2025/texmf-dist/tex/latex/listingsutf8/listingsutf8.sty +Package: listingsutf8 2019-12-10 v1.5 Allow UTF-8 in listings input (HO) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/stringenc/stringenc.sty +Package: stringenc 2019/11/29 v1.12 Convert strings between diff. encodings (HO +) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +)))) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbexternal.code.tex +Library (tcolorbox): 'tcbexternal.code.tex' version '6.4.1' +) (/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbmagazine.code.tex +Library (tcolorbox): 'tcbmagazine.code.tex' version '6.4.1' +) (/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbvignette.code.tex +Library (tcolorbox): 'tcbvignette.code.tex' version '6.4.1' + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibraryfadings.code.tex +File: tikzlibraryfadings.code.tex 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryfadings +.code.tex +File: pgflibraryfadings.code.tex 2023-01-15 v3.1.10 (3.1.10) +))) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tcolorbox/tcbposter.code.tex +Library (tcolorbox): 'tcbposter.code.tex' version '6.4.1' +)) (/usr/local/texlive/2025/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2024/09/23 1.10c listings language file +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/listings/lstlang2.sty +File: lstlang2.sty 2024/09/23 1.10c listings language file +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/listings/lstlang3.sty +File: lstlang3.sty 2024/09/23 1.10c listings language file +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2023/08/05 v3.6o Customizing captions (AR) + +(/usr/local/texlive/2025/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2023/07/31 v2.4d caption3 kernel (AR) +\caption@tempdima=\dimen314 +\captionmargin=\dimen315 +\caption@leftmargin=\dimen316 +\caption@rightmargin=\dimen317 +\caption@width=\dimen318 +\caption@indent=\dimen319 +\caption@parindent=\dimen320 +\caption@hangindent=\dimen321 +Package caption Info: Standard document class detected. +) +\c@caption@flags=\count353 +\c@continuedfloat=\count354 +Package caption Info: listings package is loaded. +Package caption Info: longtable package is loaded. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2021/01/08 v1.4c longtable captions (AR) +)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryarrows. +meta.code.tex +File: pgflibraryarrows.meta.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgfarrowinset=\dimen322 +\pgfarrowlength=\dimen323 +\pgfarrowwidth=\dimen324 +\pgfarrowlinewidth=\dimen325 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarypositioning.code.tex +File: tikzlibrarypositioning.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarycalc.code.tex +File: tikzlibrarycalc.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibraryshapes.geometric.code.tex +File: tikzlibraryshapes.geometric.code.tex 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibrary +shapes.geometric.code.tex +File: pgflibraryshapes.geometric.code.tex 2023-01-15 v3.1.10 (3.1.10) +)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibraryshapes.misc.code.tex +File: tikzlibraryshapes.misc.code.tex 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/shapes/pgflibrary +shapes.misc.code.tex +File: pgflibraryshapes.misc.code.tex 2023-01-15 v3.1.10 (3.1.10) +)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibraryfit.code.tex +File: tikzlibraryfit.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarybackgrounds.code.tex +File: tikzlibrarybackgrounds.code.tex 2023-01-15 v3.1.10 (3.1.10) +\pgf@layerbox@background=\box136 +\pgf@layerboxsaved@background=\box137 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarychains.code.tex +File: tikzlibrarychains.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarydecorations.pathreplacing.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarydecorations.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/modules/pgfmoduledecoration +s.code.tex +\pgfdecoratedcompleteddistance=\dimen326 +\pgfdecoratedremainingdistance=\dimen327 +\pgfdecoratedinputsegmentcompleteddistance=\dimen328 +\pgfdecoratedinputsegmentremainingdistance=\dimen329 +\pgf@decorate@distancetomove=\dimen330 +\pgf@decorate@repeatstate=\count355 +\pgfdecorationsegmentamplitude=\dimen331 +\pgfdecorationsegmentlength=\dimen332 +) +\tikz@lib@dec@box=\box138 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/decorations/pgfli +brarydecorations.pathreplacing.code.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarydecorations.markings.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/decorations/pgfli +brarydecorations.markings.code.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarymatrix.code.tex +File: tikzlibrarymatrix.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgf-blur/tikzlibraryshadows.blur. +code.tex v1.02, 2012/12/09 +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibraryshadows.code.tex +File: tikzlibraryshadows.code.tex 2023-01-15 v3.1.10 (3.1.10) +) +\pgfbs@fading@count=\count356 +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/pgfplots/pgfplots.sty +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplots.revision.tex) +Package: pgfplots 2021/05/15 v1.18.1 Data Visualization (1.18.1) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplots.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotscore.code.tex +\t@pgfplots@toka=\toks50 +\t@pgfplots@tokb=\toks51 +\t@pgfplots@tokc=\toks52 +\pgfplots@tmpa=\dimen333 +\c@pgfplots@coordindex=\count357 +\c@pgfplots@scanlineindex=\count358 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/sys/pgfplotssysgeneric +.code.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/libs/pgfplotslibrary.c +ode.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplot +soldpgfsupp_loader.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryfpu.cod +e.tex) +Package pgfplots: loading complementary utilities for your pgf version... +\t@pgf@toka=\toks53 +\t@pgf@tokb=\toks54 +\t@pgf@tokc=\toks55 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/oldpgfcompatib/pgfplot +soldpgfsupp_pgfutil-common-lists.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.code +.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/liststructure/pgfplots +liststructure.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/liststructure/pgfplots +liststructureext.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/liststructure/pgfplots +array.code.tex +\c@pgfplotsarray@tmp=\count359 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/liststructure/pgfplots +matrix.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/numtable/pgfplotstable +shared.code.tex +\c@pgfplotstable@counta=\count360 +\t@pgfplotstable@a=\toks56 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/liststructure/pgfplots +deque.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.co +de.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/util/pgfplotsbinary.da +ta.code.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/util/pgfplotsutil.verb +.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/libs/pgflibrarypgfplot +s.surfshading.code.tex +\c@pgfplotslibrarysurf@no=\count361 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/sys/pgflibrarypgfplots +.surfshading.pgfsys-pdftex.def))) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/util/pgfplotscolormap. +code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/util/pgfplotscolor.cod +e.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotsstackedplots.c +ode.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotsplothandlers.c +ode.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplothandle +r.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotsmeshplotimage. +code.tex))) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplots.scaling.code. +tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotscoordprocessin +g.code.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplots.errorbars.cod +e.tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplots.markers.code. +tex) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplotsticks.code.tex +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/pgfplots.paths.code.te +x) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibrarydecorations.pathmorphing.code.tex +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/decorations/pgfli +brarydecorations.pathmorphing.code.tex)) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgfplots/libs/tikzlibrarypgfplo +ts.contourlua.code.tex) +\pgfplots@numplots=\count362 +\pgfplots@xmin@reg=\dimen334 +\pgfplots@xmax@reg=\dimen335 +\pgfplots@ymin@reg=\dimen336 +\pgfplots@ymax@reg=\dimen337 +\pgfplots@zmin@reg=\dimen338 +\pgfplots@zmax@reg=\dimen339 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/frontendlayer/tikz/librarie +s/tikzlibraryplotmarks.code.tex +File: tikzlibraryplotmarks.code.tex 2023-01-15 v3.1.10 (3.1.10) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/pgf/libraries/pgflibraryplotmar +ks.code.tex +File: pgflibraryplotmarks.code.tex 2023-01-15 v3.1.10 (3.1.10) +))) +(/usr/local/texlive/2025/texmf-dist/tex/latex/tikz-timing/tikz-timing.sty +Package: tikz-timing 2017/12/20 v0.7f Digital Timing Diagrams using TikZ +\tikztiming@numint=\count363 +\tikztiming@numfrac=\count364 +\tikztiming@xunit=\skip97 +\tikztiming@yunit=\skip98 +\tikztiming@debug=\count365 +\c@tikztiming@nrows=\count366 +\c@tikztimingrows=\count367 +\c@tikztimingtrans=\count368 +\c@tikztimingtranspos=\count369 +)) +(/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2024-11-05 v7.01l Hypertext links for LaTeX + +(/usr/local/texlive/2025/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2022-10-05 v1.19 Key value parser (HO) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2023-11-26 v2.56 Cross-referencing by name of section + +(/usr/local/texlive/2025/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/gettitlestring/gettitlestring.s +ty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) + (/usr/local/texlive/2025/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO) +)) +\c@section@level=\count370 +) +\@linkdim=\dimen340 +\Hy@linkcounter=\count371 +\Hy@pagecounter=\count372 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2024-11-05 v7.01l Hyperref: PDFDocEncoding definition (HO) +Now handling font encoding PD1 ... +... no UTF-8 mapping file for font encoding PD1 +) +(/usr/local/texlive/2025/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +\Hy@SavedSpaceFactor=\count373 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2024-11-05 v7.01l Hyperref: PDF Unicode definition (HO) +Now handling font encoding PU ... +... no UTF-8 mapping file for font encoding PU +) +Package hyperref Info: Option `colorlinks' set `true' on input line 4040. +Package hyperref Info: Hyper figures OFF on input line 4157. +Package hyperref Info: Link nesting OFF on input line 4162. +Package hyperref Info: Hyper index ON on input line 4165. +Package hyperref Info: Plain pages OFF on input line 4172. +Package hyperref Info: Backreferencing OFF on input line 4177. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4424. +\c@Hy@tempcnt=\count374 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip18 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 4763. +\XeTeXLinkMargin=\dimen341 + +(/usr/local/texlive/2025/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO +) +)) +\Fld@menulength=\count375 +\Field@Width=\dimen342 +\Fld@charsize=\dimen343 +Package hyperref Info: Hyper figures OFF on input line 6042. +Package hyperref Info: Link nesting OFF on input line 6047. +Package hyperref Info: Hyper index ON on input line 6050. +Package hyperref Info: backreferencing OFF on input line 6057. +Package hyperref Info: Link coloring ON on input line 6060. +Package hyperref Info: Link coloring with OCG OFF on input line 6067. +Package hyperref Info: PDF/A mode OFF on input line 6072. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi +package with kernel methods +) +\Hy@abspage=\count376 +\c@Item=\count377 +\c@Hfootnote=\count378 +) +Package hyperref Info: Driver (autodetected): hpdftex. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2024-11-05 v7.01l Hyperref driver for pdfTeX + +(/usr/local/texlive/2025/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend pac +kage +with kernel methods +) +\Fld@listcount=\count379 +\c@bookmark@seq@number=\count380 + +(/usr/local/texlive/2025/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO) + +(/usr/local/texlive/2025/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +85. +) +\Hy@SectionHShift=\skip99 +) +LaTeX Font Info: Trying to load font information for T1+phv on input line 13 +. + (/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/t1phv.fd +File: t1phv.fd 2020/03/25 scalable font definitions for T1/phv. +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def +File: l3backend-pdftex.def 2024-05-08 L3 backend support: PDF output (pdfTeX) +\l__color_backend_stack_int=\count381 +\l__pdf_internal_box=\box139 +) +(./FPGA-Neural-Datasheet-EN.aux (./chapters/01-overview.aux) +(./chapters/02-architettura.aux) (./chapters/03-datapath.aux) +(./chapters/04-parametri.aux) (./chapters/05-memoria.aux) +(./chapters/06-sequencer.aux) (./chapters/06b-grafo.aux) (./chapters/07-spi.aux +) (./chapters/07b-programmazione.aux) (./chapters/08-toplevel.aux) +(./chapters/09-implementazione.aux) (./chapters/10-hardware.aux) +(./chapters/11-registri.aux) (./chapters/12-roadmap.aux) +(./chapters/A-moduli.aux)) +\openout1 = `FPGA-Neural-Datasheet-EN.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 13. +LaTeX Font Info: ... okay on input line 13. +LaTeX Info: Redefining \microtypecontext on input line 13. +Package microtype Info: Applying patch `item' on input line 13. +Package microtype Info: Applying patch `toc' on input line 13. +Package microtype Info: Applying patch `eqnum' on input line 13. +Package microtype Info: Applying patch `footnote' on input line 13. +Package microtype Info: Applying patch `verbatim' on input line 13. +LaTeX Info: Redefining \microtypesetup on input line 13. +Package microtype Info: Generating PDF output. +Package microtype Info: Character protrusion enabled (level 2). +Package microtype Info: Using default protrusion set `alltext'. +Package microtype Info: Automatic font expansion enabled (level 2), +(microtype) stretch: 20, shrink: 20, step: 1, non-selected. +Package microtype Info: Using default expansion set `alltext-nott'. +LaTeX Info: Redefining \showhyphens on input line 13. +Package microtype Info: No adjustment of tracking. +Package microtype Info: No adjustment of interword spacing. +Package microtype Info: No adjustment of character kerning. +Package microtype Info: Loading generic protrusion settings for font family +(microtype) `phv' (encoding: T1). +(microtype) For optimal results, create family-specific settings. +(microtype) See the microtype manual for details. + +*geometry* driver: auto-detecting +*geometry* detected driver: pdftex +*geometry* verbose mode - [ preamble ] result: +* driver: pdftex +* paper: a4paper +* layout: +* layoutoffset:(h,v)=(0.0pt,0.0pt) +* modes: +* h-part:(L,W,R)=(62.59596pt, 472.31595pt, 62.59596pt) +* v-part:(T,H,B)=(68.28644pt, 711.31898pt, 65.44142pt) +* \paperwidth=597.50787pt +* \paperheight=845.04684pt +* \textwidth=472.31595pt +* \textheight=711.31898pt +* \oddsidemargin=-9.67403pt +* \evensidemargin=-9.67403pt +* \topmargin=-43.98355pt +* \headheight=15.0pt +* \headsep=25.0pt +* \topskip=11.0pt +* \footskip=30.0pt +* \marginparwidth=50.0pt +* \marginparsep=10.0pt +* \columnsep=10.0pt +* \skip\footins=10.0pt plus 4.0pt minus 2.0pt +* \hoffset=0.0pt +* \voffset=0.0pt +* \mag=1000 +* \@twocolumnfalse +* \@twosidefalse +* \@mparswitchfalse +* \@reversemarginfalse +* (1in=72.27pt=25.4mm, 1cm=28.453pt) + +(/usr/local/texlive/2025/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count382 +\scratchdimen=\dimen344 +\scratchbox=\box140 +\nofMPsegments=\count383 +\nofMParguments=\count384 +\everyMPshowfont=\toks57 +\MPscratchCnt=\count385 +\MPscratchDim=\dimen345 +\MPnumerator=\count386 +\makeMPintoPDFobject=\count387 +\everyMPtoPDFconversion=\toks58 +) (/usr/local/texlive/2025/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4 +85. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv +e +)) +\c@lstlisting=\count388 +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: hyperref package is loaded. +Package caption Info: End \AtBeginDocument code. + +Package pgfplots notification 'compat/show suggested version=true': you might b +enefit from \pgfplotsset{compat=1.18} (current compat level: 1.17). + +Package hyperref Info: Link coloring ON on input line 13. +(./FPGA-Neural-Datasheet-EN.out) (./FPGA-Neural-Datasheet-EN.out) +\@outlinefile=\write4 +\openout4 = `FPGA-Neural-Datasheet-EN.out'. + +LaTeX Font Info: Trying to load font information for T1+pcr on input line 37 +. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/t1pcr.fd +File: t1pcr.fd 2001/06/04 font definitions for T1/pcr. +) +Package microtype Info: Loading generic protrusion settings for font family +(microtype) `pcr' (encoding: T1). +(microtype) For optimal results, create family-specific settings. +(microtype) See the microtype manual for details. +LaTeX Font Info: Trying to load font information for TS1+pcr on input line 3 +7. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ts1pcr.fd +File: ts1pcr.fd 2001/06/04 font definitions for TS1/pcr. +) +Package microtype Info: Loading generic protrusion settings for font family +(microtype) `pcr' (encoding: TS1). +(microtype) For optimal results, create family-specific settings. +(microtype) See the microtype manual for details. +LaTeX Font Info: Font shape `T1/phv/m/it' in size <8> not available +(Font) Font shape `T1/phv/m/sl' tried instead on input line 50. + +(/usr/local/texlive/2025/texmf-dist/tex/latex/microtype/mt-cmr.cfg +File: mt-cmr.cfg 2013/05/19 v2.2 microtype config. file: Computer Modern Roman +(RS) +) +LaTeX Font Info: Trying to load font information for U+msa on input line 63. + + +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/microtype/mt-msa.cfg +File: mt-msa.cfg 2006/02/04 v1.1 microtype config. file: AMS symbols (a) (RS) +) +LaTeX Font Info: Trying to load font information for U+msb on input line 63. + + +(/usr/local/texlive/2025/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +(/usr/local/texlive/2025/texmf-dist/tex/latex/microtype/mt-msb.cfg +File: mt-msb.cfg 2005/06/01 v1.0 microtype config. file: AMS symbols (b) (RS) +) +Underfull \hbox (badness 1028) in paragraph at lines 60--63 +[][][]\T1/phv/b/n/9 (+20) Reference tar-get de-vice:[] \T1/phv/m/n/9 (+20) Lat- +tice ECP5 \T1/pcr/m/n/9 LFE5U-45F-8BG381C \T1/phv/m/n/9 (+20) (speed grade $\OM +S/cmsy/m/n/9 ^^@\OT1/cmr/m/n/9 (+20) 8$\T1/phv/m/n/9 (+20) , CABGA381, + [] + +LaTeX Font Info: Trying to load font information for TS1+phv on input line 7 +3. +(/usr/local/texlive/2025/texmf-dist/tex/latex/psnfss/ts1phv.fd +File: ts1phv.fd 2020/03/25 scalable font definitions for TS1/phv. +) +Package microtype Info: Loading generic protrusion settings for font family +(microtype) `phv' (encoding: TS1). +(microtype) For optimal results, create family-specific settings. +(microtype) See the microtype manual for details. + + +[1 + +{/usr/local/texlive/2025/texmf-var/fonts/map/pdftex/updmap/pdftex.map}{/usr/loc +al/texlive/2025/texmf-dist/fonts/enc/dvips/base/8r.enc}] +(./chapters/00-features.tex +Underfull \hbox (badness 10000) in paragraph at lines 21--23 + + [] + + +Overfull \hbox (65.45786pt too wide) in paragraph at lines 32--34 +[]\T1/phv/b/n/9 (-20) Runtime net-work width\T1/phv/m/n/9 (-20) : per-layer \T1 +/pcr/m/n/9 n_inputs_real\T1/phv/m/n/9 (-20) /\T1/pcr/m/n/9 n_neurons_real\T1/ph +v/m/n/9 (-20) , + [] + + +Underfull \hbox (badness 5893) in paragraph at lines 36--39 +[]\T1/phv/b/n/9 (+20) Two net-work types\T1/phv/m/n/9 (+20) : clas-sic multi-la +yer dense + [] + + +Overfull \hbox (25.25504pt too wide) in paragraph at lines 42--44 +[]\T1/phv/b/n/9 (-20) SPI Mode 0 \T1/phv/m/n/9 (-20) MSB-first host in-ter-face +, \T1/pcr/m/n/9 SET_NET_TYPE\T1/phv/m/n/9 (-20) +dispatch, + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 42--44 +\T1/pcr/m/n/9 STATUS.done \T1/phv/m/n/9 (+20) sticky/clear-on-read, run-time + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 54--56 + + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 67--69 + + [] + + +Underfull \hbox (badness 6978) in paragraph at lines 70--71 +[]\T1/phv/m/n/9 (+20) FPGA: Lat-tice ECP5 \T1/pcr/m/n/9 LFE5U-45F-8BG381C \T1/p +hv/m/n/9 (+20) ($\OMS/cmsy/m/n/9 ^^@\OT1/cmr/m/n/9 (+20) 8$\T1/phv/m/n/9 (+20) +, + [] + + +Underfull \hbox (badness 8056) in paragraph at lines 74--75 +[]\T1/phv/m/n/9 (+20) PSRAM: ISSI \T1/pcr/m/n/9 IS66WVE4M16EBLL-70BLI \T1/phv/m +/n/9 (+20) (64Mb, + [] + + +pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has +been already used, duplicate ignored + + \relax +l.100 \end{tabularx} + [1] +LaTeX Font Info: Font shape `T1/phv/m/it' in size <9> not available +(Font) Font shape `T1/phv/m/sl' tried instead on input line 119. +) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[2] (./chapters/00b-pinout.tex +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 data_ready_n| + [] + + +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 psram_dq[10]| + [] + + +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 psram_dq[11]| + [] + + +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 psram_dq[12]| + [] + + +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 psram_dq[13]| + [] + + +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 psram_dq[14]| + [] + + +Overfull \hbox (2.01756pt too wide) in paragraph at lines 93--93 +[]|\T1/pcr/m/n/10.95 psram_dq[15]| + [] + +[3]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[4] (./FPGA-Neural-Datasheet-EN.toc + +[1 + +] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[2]) +\tf@toc=\write5 +\openout5 = `FPGA-Neural-Datasheet-EN.toc'. + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[3] +\openout2 = `chapters/01-overview.aux'. + + (./chapters/01-overview.tex +Chapter 1. + + + +pdfTeX warning (ext4): destination with the same identifier (name{page.1}) has +been already used, duplicate ignored + + \relax +l.50 \end{fnnote} + [1 + + +]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + + +pdfTeX warning (ext4): destination with the same identifier (name{page.2}) has +been already used, duplicate ignored + + \relax +l.101 \include{chapters/01-overview} + [2] +\openout2 = `chapters/02-architettura.aux'. + + (./chapters/02-architettura.tex +Chapter 2. + +Overfull \hbox (1.8107pt too wide) in paragraph at lines 59--59 +[]|\T1/pcr/m/n/10.95 neuron_parallel| + [] + + +Overfull \hbox (1.8107pt too wide) in paragraph at lines 59--59 +[]|\T1/pcr/m/n/10.95 layer_sequencer| + [] + + +Overfull \hbox (21.52068pt too wide) in paragraph at lines 59--59 +[]|\T1/pcr/m/n/10.95 int8_memory_access| + [] + + +Overfull \hbox (8.38069pt too wide) in paragraph at lines 59--59 +[]|\T1/pcr/m/n/10.95 memory_interface| + [] + + +Overfull \hbox (8.38069pt too wide) in paragraph at lines 59--59 +[]|\T1/pcr/m/n/10.95 psram_controller| + [] + + +pdfTeX warning (ext4): destination with the same identifier (name{page.3}) has +been already used, duplicate ignored + + \relax +l.59 \end{tabularx} + [3 + + + + +]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + + +pdfTeX warning (ext4): destination with the same identifier (name{page.4}) has +been already used, duplicate ignored + + \relax +l.102 \include{chapters/02-architettura} + [4] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[5] +\openout2 = `chapters/03-datapath.aux'. + + (./chapters/03-datapath.tex +Chapter 3. +Package hyperref Info: bookmark level for unknown lstlisting defaults to 0 on i +nput line 34. + + +[6 + + + + +] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[7]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[8] +\openout2 = `chapters/04-parametri.aux'. + + (./chapters/04-parametri.tex +Chapter 4. + +Overfull \hbox (6.62163pt too wide) in paragraph at lines 23--23 +[]|\T1/pcr/m/n/10.95 MEM_DATA_WIDTH| + [] + + + +[9 + + + + +] +Overfull \hbox (10.24419pt too wide) in paragraph at lines 77--77 + []|[]\T1/phv/b/n/10.95 (-20) N_NEURONS[]| + [] + +) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[10] +\openout2 = `chapters/05-memoria.aux'. + + (./chapters/05-memoria.tex +Chapter 5. + +Overfull \hbox (10.43314pt too wide) in paragraph at lines 20--21 + [] + [] + + + +[11 + + + + +] +Underfull \hbox (badness 6125) in paragraph at lines 117--124 +[]\T1/phv/b/n/10.95 (+20) Only a WRITE closes the page. \T1/phv/m/n/10.95 (+20) + Changes to \T1/pcr/m/n/10.95 lb_n\T1/phv/m/n/10.95 (+20) /\T1/pcr/m/n/10.95 ub +_n \T1/phv/m/n/10.95 (+20) do \T1/phv/m/sl/10.95 (+20) not \T1/phv/m/n/10.95 (+ +20) close it: + [] + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[12] +Underfull \hbox (badness 10000) in paragraph at lines 169--172 +\T1/phv/m/n/10.95 (+20) Measured on \T1/pcr/m/n/10.95 graph_engine\T1/phv/m/n/1 +0.95 (+20) 's edge-list gather (ch. [][]7[][]), by dif-fer-ence be-tween + [] + + +Underfull \hbox (badness 5064) in paragraph at lines 169--172 +\T1/phv/m/n/10.95 (+20) two graph sizes to iso-late the per-edge cost from the +fixed per-neuron over-head + [] + +) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[13] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[14] +\openout2 = `chapters/06-sequencer.aux'. + + (./chapters/06-sequencer.tex +Chapter 6. + + +[15 + + + + +]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[16] +\openout2 = `chapters/06b-grafo.aux'. + + (./chapters/06b-grafo.tex +Chapter 7. + + +[17 + + + + +] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[18] +Overfull \hbox (1.94612pt too wide) in paragraph at lines 125--125 +[]|\T1/phv/m/n/10.95 (-20) num_neurons_graph| + [] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[19]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[20] +\openout2 = `chapters/07-spi.aux'. + + (./chapters/07-spi.tex +Chapter 8. + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()C') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')C' (or ')C(') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions 'C(' (or 'C()') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions '()' (or '()L') defined! on input l +ine 20. + + +Package tikz-timing Warning: No transitions ')L' (or ')L@') defined! on input l +ine 20. + + +Overfull \hbox (588.01773pt too wide) in paragraph at lines 23--24 + [] + [] + + +Overfull \hbox (14.0088pt too wide) in paragraph at lines 57--57 +[]|\T1/phv/m/n/10.95 (-20) SET_NET_TYPE| + [] + + +Overfull \hbox (11.6052pt too wide) in paragraph at lines 60--60 +[]|\T1/phv/m/n/10.95 (-20) READ_OUTPUT| + [] + + +Overfull \hbox (15.11197pt too wide) in paragraph at lines 61--61 +[]|\T1/phv/m/n/10.95 (-20) RUN_NETWORK| + [] + + +Overfull \hbox (9.2228pt too wide) in paragraph at lines 62--62 +[]|\T1/phv/m/n/10.95 (-20) READ_CONFIG| + [] + + +Overfull \hbox (44.42009pt too wide) in paragraph at lines 63--63 +[]|\T1/phv/m/n/10.95 (-20) FLASH_READ_BLOCK| + [] + + +Overfull \hbox (83.9372pt too wide) in paragraph at lines 63--63 +[]|\T1/phv/m/n/10.95 (-20) flash_addr(3B)+psram_addr(3B)+len(3B)| + [] + + +Overfull \hbox (49.18459pt too wide) in paragraph at lines 64--64 +[]|\T1/phv/m/n/10.95 (-20) FLASH_WRITE_BLOCK| + [] + + +Overfull \hbox (83.9372pt too wide) in paragraph at lines 64--64 +[]|\T1/phv/m/n/10.95 (-20) psram_addr(3B)+flash_addr(3B)+len(3B)| + [] + + +Overfull \hbox (8.6433pt too wide) in paragraph at lines 65--65 +[]|\T1/phv/m/n/10.95 (-20) FLASH_ERASE| + [] + + +Overfull \hbox (25.9603pt too wide) in paragraph at lines 67--67 +[]|\T1/phv/m/n/10.95 (-20) CAT_WRITE_SLOT| + [] + + +Overfull \hbox (80.77351pt too wide) in paragraph at lines 67--67 +[]|\T1/phv/m/n/10.95 (-20) slot_id(1B)+offset(3B)+len(3B)+type(1B)| + [] + + +Overfull \hbox (23.99445pt too wide) in paragraph at lines 68--68 +[]|\T1/phv/m/n/10.95 (-20) slot_id(1B)+psram_addr(3B)| + [] + + +Overfull \hbox (64.84686pt too wide) in paragraph at lines 69--69 +[]|\T1/phv/m/n/10.95 (-20) slot_id(1B)+psram_addr(3B)+len(3B)| + [] + + +Overfull \hbox (4.3355pt too wide) in paragraph at lines 70--70 +[]|\T1/phv/m/n/10.95 (-20) CAT_INSPECT| + [] + + +Overfull \hbox (138.2537pt too wide) in paragraph at lines 70--71 +\T1/phv/m/n/10.95 (-20) set[3]+len[3]+type[1]+valid[1]+CRC32[4]+reserved[4], + [] + +[21 + + + + +] + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[22] +Underfull \hbox (badness 2884) in paragraph at lines 72--75 +[]\T1/phv/m/n/10.95 (+20) All flash op-codes are \T1/phv/m/sl/10.95 (+20) fire- +and-forget\T1/phv/m/n/10.95 (+20) : the host polls []\T1/pcr/m/n/10.95 STATUS[] + \T1/phv/m/n/10.95 (+20) (bit4= \T1/pcr/m/n/10.95 flash_busy\T1/phv/m/n/10.95 ( ++20) , + [] + + +Overfull \hbox (0.93117pt too wide) in paragraph at lines 97--97 +[]|\T1/pcr/m/n/10.95 n_neurons_real| + [] + + +Overfull \hbox (20.64114pt too wide) in paragraph at lines 97--97 +[]|\T1/pcr/m/n/10.95 num_neurons_graph| + [] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[23] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[24] +Underfull \hbox (badness 1540) in paragraph at lines 186--193 +\T1/phv/m/n/10.95 (+20) 16 MB SPI NOR, ch. [][]12[][] Ÿ6/Ÿ7) through a ded-i-ca +ted, phys-i-cally sep-a-rate SPI mas-ter + [] + + +Underfull \hbox (badness 10000) in paragraph at lines 196--204 +[]\T1/pcr/m/n/10.95 rtl/spi_flash_master.v \T1/phv/m/n/10.95 (+20) --- raw SPI +mas-ter to-ward the flash chip + [] + + +Underfull \hbox (badness 1888) in paragraph at lines 196--204 +\T1/phv/m/n/10.95 (+20) (RDID/READ/WREN/PP/SE/RDSR-1). Fully in-de-pen-dent 4-w +ire bus (\T1/pcr/m/n/10.95 sclk\T1/phv/m/n/10.95 (+20) /\T1/pcr/m/n/10.95 mosi\ +T1/phv/m/n/10.95 (+20) / + [] + + +Underfull \hbox (badness 2261) in paragraph at lines 204--209 +[]\T1/pcr/m/n/10.95 rtl/flash_copy_engine.v \T1/phv/m/n/10.95 (+20) --- block-s +treaming en-gine on top: flash$\OMS/cmsy/m/n/10.95 !$\T1/phv/m/n/10.95 (+20) PS +RAM + [] + + +Underfull \hbox (badness 1077) in paragraph at lines 209--214 +\T1/phv/m/n/10.95 (+20) (\T1/pcr/m/n/10.95 rtl/crc32.v\T1/phv/m/n/10.95 (+20) , + IEEE 802.3/zlib) com-puted live over the real byte stream dur-ing + [] + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[25] +Overfull \hbox (22.84529pt too wide) in paragraph at lines 241--242 +[]\T1/phv/m/n/10.95 (-20) Full mea-sure-ment method-ol-ogy in \T1/pcr/m/n/10.95 + docs/FPGA-Neural-Flash-Subsystem-Verification.md\T1/phv/m/n/10.95 (-20) . + [] + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[26]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[27] +\openout2 = `chapters/07b-programmazione.aux'. + + (./chapters/07b-programmazione.tex +Chapter 9. + +Overfull \hbox (14.95068pt too wide) in paragraph at lines 42--42 +[]|\T1/pcr/m/n/10.95 num_neurons_graph| + [] + +LaTeX Font Info: Font shape `T1/pcr/m/it' in size <9> not available +(Font) Font shape `T1/pcr/m/sl' tried instead on input line 45. + + +[28 + + + + +] +Underfull \hbox (badness 3954) in paragraph at lines 67--69 +[]\T1/phv/m/n/10.95 (+20) Descriptor (11 bytes, MSB-first): \T1/pcr/m/n/10.95 w +_base\T1/phv/m/n/10.95 (+20) (3) $\OMS/cmsy/m/n/10.95 j$ \T1/pcr/m/n/10.95 bias +_addr\T1/phv/m/n/10.95 (+20) (3) $\OMS/cmsy/m/n/10.95 j$ \T1/pcr/m/n/10.95 acti +vation\T1/phv/m/n/10.95 (+20) (1) $\OMS/cmsy/m/n/10.95 j$ + [] + + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `math shift' on input line 70. + + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `\to' on input line 70. + + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `\to' on input line 70. + + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `math shift' on input line 70. + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[29] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[30]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[31] +\openout2 = `chapters/08-toplevel.aux'. + + (./chapters/08-toplevel.tex +Chapter 10. + +Overfull \hbox (1.8107pt too wide) in paragraph at lines 17--17 +[]|\T1/pcr/m/n/10.95 layer_sequencer| + [] + + +Underfull \hbox (badness 7238) in paragraph at lines 44--48 +\T1/phv/m/n/10.95 (+20) The top-level con-nects SPI (\T1/pcr/m/n/10.95 spi_slav +e\T1/phv/m/n/10.95 (+20) +\T1/pcr/m/n/10.95 spi_engine\T1/phv/m/n/10.95 (+20) ) +, the ar-biter, the se-quencer, + [] + + +Underfull \hbox (badness 7667) in paragraph at lines 74--78 +[]\T1/pcr/m/n/10.95 spi_neuron_top \T1/phv/m/n/10.95 (+20) is ver-i-fied in sim +-u-la-tion with real PSRAM (\T1/pcr/m/n/10.95 psram_model.v\T1/phv/m/n/10.95 (+ +20) , + [] + + + +[32 + + + + +]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[33] +\openout2 = `chapters/09-implementazione.aux'. + + (./chapters/09-implementazione.tex +Chapter 11. + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `math shift' on input line 29. + + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `\times' on input line 29. + + +Package hyperref Warning: Token not allowed in a PDF string (Unicode): +(hyperref) removing `math shift' on input line 29. + + +Underfull \hbox (badness 1014) in paragraph at lines 30--34 +\T1/phv/m/n/10.95 (+20) Configuration: INT8/INT32, \T1/pcr/m/n/10.95 N_INPUTS\T +1/phv/m/n/10.95 (+20) =256, \T1/pcr/m/n/10.95 N_NEURONS\T1/phv/m/n/10.95 (+20) +=4, vari-able \T1/pcr/m/n/10.95 PARALLEL\T1/phv/m/n/10.95 (+20) , 80 MHz + [] + + +Underfull \hbox (badness 2277) in paragraph at lines 30--34 +\T1/phv/m/n/10.95 (+20) tar-get, de-vice \T1/pcr/m/n/10.95 LFE5U-45F-8BG381C \T +1/phv/m/n/10.95 (+20) ($\OMS/cmsy/m/n/10.95 ^^@\OT1/cmr/m/n/10.95 (+20) 8$\T1/p +hv/m/n/10.95 (+20) ). The test buses are gen-er-ated \T1/phv/m/sl/10.95 (+20) i +n-side \T1/phv/m/n/10.95 (+20) the + [] + +Package pgfplots info on input line 59: Using 'lua backend=false' for axis: xmo +de=log unsupported (yet). +Package pgfplots info on input line 72: Using 'lua backend=false' for axis: xmo +de=log unsupported (yet). + + +[34 + + + + +] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[35]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[36] +\openout2 = `chapters/10-hardware.aux'. + + (./chapters/10-hardware.tex +Chapter 12. + + +[37 + + + + +] +Overfull \hbox (20.54706pt too wide) in alignment at lines 128--128 + [] [] [] [] [] + [] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[38] +Underfull \hbox (badness 10000) in paragraph at lines 149--157 +\T1/phv/m/n/10.95 (+20) The place-ment fol-lows the die-edge ge-om-e-try (from +Trel-lis's \T1/pcr/m/n/10.95 globals.json\T1/phv/m/n/10.95 (+20) , + [] + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[39] +Overfull \hbox (23.69565pt too wide) in paragraph at lines 171--171 +\T1/phv/m/n/10.95 (-20) (\T1/pcr/m/n/10.95 flash_sclk/flash_mosi/flash_miso/fla +sh_cs_n\T1/phv/m/n/10.95 (-20) )| + [] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[40] + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[41] +Underfull \hbox (badness 2189) in paragraph at lines 315--317 +[]\T1/phv/m/n/10.95 (+20) Real \T1/pcr/m/n/10.95 .lpf \T1/phv/m/n/10.95 (+20) w +ith the CABGA381 ball as-sign-ment, place&route-verified with 0 er-rors + [] + + + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[42]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[43] +\openout2 = `chapters/11-registri.aux'. + + (./chapters/11-registri.tex +Chapter 13. + + +[44 + + + + +]) +\openout2 = `chapters/12-roadmap.aux'. + + (./chapters/12-roadmap.tex +Chapter 14. +LaTeX Font Info: Font shape `T1/phv/b/it' in size <9> not available +(Font) Font shape `T1/phv/b/sl' tried instead on input line 24. +[45 + + + + +]) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[46] +\openout2 = `chapters/A-moduli.aux'. + + (./chapters/A-moduli.tex +Appendix A. + +Overfull \hbox (9.29321pt too wide) in paragraph at lines 26--26 + []|\T1/phv/m/n/10.95 (-20) combinational| + [] + + +Overfull \hbox (9.29321pt too wide) in paragraph at lines 26--26 + []|\T1/phv/m/n/10.95 (-20) combinational| + [] + + +Overfull \hbox (41.23065pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/neuron_parallel.v| + [] + + +Overfull \hbox (28.09067pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/neuron_memory.v| + [] + + +Overfull \hbox (41.23065pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/layer_sequencer.v| + [] + + +Overfull \hbox (60.94063pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/int8_memory_access.v| + [] + + +Overfull \hbox (47.80064pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/memory_interface.v| + [] + + +Overfull \hbox (47.80064pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/psram_controller.v| + [] + + +Overfull \hbox (14.95068pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/mem_arbiter.v| + [] + + +Overfull \hbox (1.8107pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/spi_slave.v| + [] + + +Overfull \hbox (8.38069pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/spi_engine.v| + [] + + +Overfull \hbox (8.38069pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/act_buffer.v| + [] + + +Overfull \hbox (21.52068pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/graph_engine.v| + [] + + +Overfull \hbox (34.66066pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/spi_neuron_top.v| + [] + + +Overfull \hbox (21.52068pt too wide) in paragraph at lines 26--26 +[]|\T1/pcr/m/n/10.95 rtl/memory_model.v| + [] + + + +[47 + + + + +] +Overfull \hbox (43.45506pt too wide) in paragraph at lines 82--82 +[]|\T1/pcr/m/n/10.95 spi_neuron_top_runnetwork_tb.v| + [] + +) + + +Package fancyhdr Warning: \headheight is too small (15.0pt): +(fancyhdr) Make it at least 21.99997pt, for example: +(fancyhdr) \setlength{\headheight}{21.99997pt}. +(fancyhdr) You might also make \topmargin smaller: +(fancyhdr) \addtolength{\topmargin}{-6.99997pt}. + +[48] (./FPGA-Neural-Datasheet-EN.aux (./chapters/01-overview.aux) +(./chapters/02-architettura.aux) (./chapters/03-datapath.aux) +(./chapters/04-parametri.aux) (./chapters/05-memoria.aux) +(./chapters/06-sequencer.aux) (./chapters/06b-grafo.aux) (./chapters/07-spi.aux +) (./chapters/07b-programmazione.aux) (./chapters/08-toplevel.aux) +(./chapters/09-implementazione.aux) (./chapters/10-hardware.aux) +(./chapters/11-registri.aux) (./chapters/12-roadmap.aux) +(./chapters/A-moduli.aux)) + *********** +LaTeX2e <2024-11-01> patch level 2 +L3 programming layer <2025-01-18> + *********** +Package rerunfilecheck Info: File `FPGA-Neural-Datasheet-EN.out' has not change +d. +(rerunfilecheck) Checksum: DAFB6B8339D13929C620126120C63898;22312. + ) +Here is how much of TeX's memory you used: + 49906 strings out of 473190 + 1133312 string characters out of 5715799 + 2071510 words of memory out of 5000000 + 71372 multiletter control sequences out of 15000+600000 + 649395 words of font info for 459 fonts, out of 8000000 for 9000 + 1141 hyphenation exceptions out of 8191 + 107i,17n,109p,1791b,2268s stack positions out of 10000i,1000n,20000p,200000b,200000s + + +Output written on FPGA-Neural-Datasheet-EN.pdf (56 pages, 453580 bytes). +PDF statistics: + 1333 PDF objects out of 1440 (max. 8388607) + 1189 compressed objects within 12 object streams + 374 named destinations out of 1000 (max. 500000) + 100965 words of extra memory for PDF output out of 106986 (max. 10000000) + diff --git a/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.out b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.out new file mode 100644 index 0000000..4134feb --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.out @@ -0,0 +1,121 @@ +\BOOKMARK [0][-]{chapter.1}{\376\377\000S\000y\000s\000t\000e\000m\000\040\000o\000v\000e\000r\000v\000i\000e\000w}{}% 1 +\BOOKMARK [1][-]{section.1.1}{\376\377\000P\000r\000o\000j\000e\000c\000t\000\040\000g\000o\000a\000l}{chapter.1}% 2 +\BOOKMARK [1][-]{section.1.2}{\376\377\000H\000a\000r\000d\000w\000a\000r\000e\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\000v\000e\000r\000s\000u\000s\000\040\000n\000e\000t\000w\000o\000r\000k\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n}{chapter.1}% 3 +\BOOKMARK [1][-]{section.1.3}{\376\377\000B\000o\000o\000t\000\040\000a\000n\000d\000\040\000i\000n\000i\000t\000i\000a\000l\000i\000z\000a\000t\000i\000o\000n}{chapter.1}% 4 +\BOOKMARK [1][-]{section.1.4}{\376\377\000T\000r\000a\000i\000n\000i\000n\000g\000\040\000a\000n\000d\000\040\000i\000n\000f\000e\000r\000e\000n\000c\000e}{chapter.1}% 5 +\BOOKMARK [1][-]{section.1.5}{\376\377\000D\000e\000s\000i\000g\000n\000\040\000p\000h\000i\000l\000o\000s\000o\000p\000h\000y\000\040\000a\000n\000d\000\040\000r\000e\000u\000s\000e}{chapter.1}% 6 +\BOOKMARK [0][-]{chapter.2}{\376\377\000R\000T\000L\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 7 +\BOOKMARK [1][-]{section.2.1}{\376\377\000H\000i\000e\000r\000a\000r\000c\000h\000i\000c\000a\000l\000\040\000o\000r\000g\000a\000n\000i\000z\000a\000t\000i\000o\000n}{chapter.2}% 8 +\BOOKMARK [1][-]{section.2.2}{\376\377\000R\000o\000l\000e\000\040\000o\000f\000\040\000e\000a\000c\000h\000\040\000m\000o\000d\000u\000l\000e}{chapter.2}% 9 +\BOOKMARK [1][-]{section.2.3}{\376\377\000T\000w\000o\000\040\000e\000x\000e\000c\000u\000t\000i\000o\000n\000\040\000p\000a\000t\000h\000s}{chapter.2}% 10 +\BOOKMARK [0][-]{chapter.3}{\376\377\000C\000o\000m\000p\000u\000t\000e\000\040\000d\000a\000t\000a\000p\000a\000t\000h}{}% 11 +\BOOKMARK [1][-]{section.3.1}{\376\377\000I\000N\000T\0008\000/\000I\000N\000T\0003\0002\000\040\000a\000r\000i\000t\000h\000m\000e\000t\000i\000c\000\040\000c\000h\000a\000i\000n}{chapter.3}% 12 +\BOOKMARK [1][-]{section.3.2}{\376\377\000m\000a\000c\000\137\000u\000n\000i\000t\000\040\040\024\000\040\000m\000u\000l\000t\000i\000p\000l\000y\000-\000a\000c\000c\000u\000m\000u\000l\000a\000t\000o\000r}{chapter.3}% 13 +\BOOKMARK [1][-]{section.3.3}{\376\377\000m\000a\000c\0008\000\040\040\024\000\040\000p\000a\000r\000a\000l\000l\000e\000l\000\040\000M\000A\000C\000\040\000a\000n\000d\000\040\000b\000a\000l\000a\000n\000c\000e\000d\000\040\000a\000d\000d\000e\000r\000\040\000t\000r\000e\000e}{chapter.3}% 14 +\BOOKMARK [1][-]{section.3.4}{\376\377\000n\000e\000u\000r\000o\000n\000\137\000p\000a\000r\000a\000l\000l\000e\000l\000\040\040\024\000\040\000n\000e\000u\000r\000o\000n\000\040\000F\000S\000M}{chapter.3}% 15 +\BOOKMARK [2][-]{subsection.3.4.1}{\376\377\000P\000a\000r\000a\000m\000e\000t\000e\000r\000\040\000g\000u\000a\000r\000d\000\040\000\050\000e\000l\000a\000b\000o\000r\000a\000t\000i\000o\000n\000-\000t\000i\000m\000e\000\051}{section.3.4}% 16 +\BOOKMARK [1][-]{section.3.5}{\376\377\000A\000c\000t\000i\000v\000a\000t\000i\000o\000n\000\040\000f\000u\000n\000c\000t\000i\000o\000n\000s}{chapter.3}% 17 +\BOOKMARK [1][-]{section.3.6}{\376\377\000I\000N\000T\0008\000\040\000s\000a\000t\000u\000r\000a\000t\000i\000o\000n}{chapter.3}% 18 +\BOOKMARK [1][-]{section.3.7}{\376\377\000l\000a\000y\000e\000r\000\040\040\024\000\040\000n\000e\000u\000r\000o\000n\000s\000\040\000i\000n\000\040\000p\000a\000r\000a\000l\000l\000e\000l}{chapter.3}% 19 +\BOOKMARK [0][-]{chapter.4}{\376\377\000P\000a\000r\000a\000m\000e\000t\000e\000r\000s\000\040\000a\000n\000d\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000b\000i\000l\000i\000t\000y}{}% 20 +\BOOKMARK [1][-]{section.4.1}{\376\377\000B\000u\000i\000l\000d\000\040\000p\000a\000r\000a\000m\000e\000t\000e\000r\000s\000\040\000\050\000s\000y\000n\000t\000h\000e\000s\000i\000s\000-\000t\000i\000m\000e\000\051}{chapter.4}% 21 +\BOOKMARK [1][-]{section.4.2}{\376\377\000R\000u\000n\000t\000i\000m\000e\000\040\000n\000e\000t\000w\000o\000r\000k\000\040\000w\000i\000d\000t\000h}{chapter.4}% 22 +\BOOKMARK [2][-]{subsection.4.2.1}{\376\377\000M\000e\000a\000s\000u\000r\000e\000d\000\040\000s\000a\000v\000i\000n\000g\000s}{section.4.2}% 23 +\BOOKMARK [1][-]{section.4.3}{\376\377\000C\000h\000a\000r\000a\000c\000t\000e\000r\000i\000z\000e\000d\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000s}{chapter.4}% 24 +\BOOKMARK [1][-]{section.4.4}{\376\377\000B\000u\000i\000l\000d\000\040\000v\000e\000r\000s\000u\000s\000\040\000r\000u\000n\000t\000i\000m\000e\000\040\000s\000u\000m\000m\000a\000r\000y}{chapter.4}% 25 +\BOOKMARK [0][-]{chapter.5}{\376\377\000M\000e\000m\000o\000r\000y\000\040\000s\000u\000b\000s\000y\000s\000t\000e\000m}{}% 26 +\BOOKMARK [1][-]{section.5.1}{\376\377\000M\000e\000m\000o\000r\000y\000\040\000c\000h\000a\000i\000n}{chapter.5}% 27 +\BOOKMARK [1][-]{section.5.2}{\376\377\000i\000n\000t\0008\000\137\000m\000e\000m\000o\000r\000y\000\137\000a\000c\000c\000e\000s\000s\000\040\040\024\000\040\000b\000y\000t\000e\000/\000w\000o\000r\000d\000\040\000c\000o\000n\000v\000e\000r\000s\000i\000o\000n}{chapter.5}% 28 +\BOOKMARK [1][-]{section.5.3}{\376\377\000m\000e\000m\000o\000r\000y\000\137\000i\000n\000t\000e\000r\000f\000a\000c\000e\000\040\040\024\000\040\000h\000a\000n\000d\000s\000h\000a\000k\000e}{chapter.5}% 29 +\BOOKMARK [1][-]{section.5.4}{\376\377\000p\000s\000r\000a\000m\000\137\000c\000o\000n\000t\000r\000o\000l\000l\000e\000r\000\040\040\024\000\040\000p\000h\000y\000s\000i\000c\000a\000l\000\040\000b\000u\000s}{chapter.5}% 30 +\BOOKMARK [2][-]{subsection.5.4.1}{\376\377\000T\000i\000m\000i\000n\000g}{section.5.4}% 31 +\BOOKMARK [1][-]{section.5.5}{\376\377\000R\000e\000a\000d\000\040\000p\000a\000g\000e\000\040\000m\000o\000d\000e}{chapter.5}% 32 +\BOOKMARK [1][-]{section.5.6}{\376\377\000A\000d\000d\000r\000e\000s\000s\000\040\000m\000a\000p\000\040\000a\000n\000d\000\040\000c\000o\000n\000v\000e\000n\000t\000i\000o\000n\000s}{chapter.5}% 33 +\BOOKMARK [2][-]{subsection.5.6.1}{\376\377\000P\000S\000R\000A\000M\000\040\000p\000h\000y\000s\000i\000c\000a\000l\000\040\000a\000d\000d\000r\000e\000s\000s\000i\000n\000g}{section.5.6}% 34 +\BOOKMARK [1][-]{section.5.7}{\376\377\000B\000a\000n\000d\000w\000i\000d\000t\000h}{chapter.5}% 35 +\BOOKMARK [0][-]{chapter.6}{\376\377\000M\000e\000m\000o\000r\000y\000,\000\040\000m\000u\000l\000t\000i\000-\000n\000e\000u\000r\000o\000n\000\040\000a\000n\000d\000\040\000m\000u\000l\000t\000i\000-\000l\000a\000y\000e\000r}{}% 36 +\BOOKMARK [1][-]{section.6.1}{\376\377\000n\000e\000u\000r\000o\000n\000\137\000m\000e\000m\000o\000r\000y\000\040\040\024\000\040\000m\000e\000m\000o\000r\000y\000/\000n\000e\000u\000r\000o\000n\000\040\000b\000r\000i\000d\000g\000e}{chapter.6}% 37 +\BOOKMARK [1][-]{section.6.2}{\376\377\000l\000a\000y\000e\000r\000\137\000s\000e\000q\000u\000e\000n\000c\000e\000r\000\040\040\024\000\040\000m\000u\000l\000t\000i\000-\000l\000a\000y\000e\000r\000\040\000n\000e\000t\000w\000o\000r\000k}{chapter.6}% 38 +\BOOKMARK [2][-]{subsection.6.2.1}{\376\377\000P\000i\000n\000g\000-\000p\000o\000n\000g\000\040\000b\000u\000f\000f\000e\000r\000s}{section.6.2}% 39 +\BOOKMARK [2][-]{subsection.6.2.2}{\376\377\000D\000e\000s\000c\000r\000i\000p\000t\000o\000r\000\040\000t\000a\000b\000l\000e}{section.6.2}% 40 +\BOOKMARK [1][-]{section.6.3}{\376\377\000H\000i\000e\000r\000a\000r\000c\000h\000y\000\040\000o\000f\000\040\000t\000h\000e\000\040\000b\000u\000s\000y\000/\000d\000o\000n\000e\000\040\000s\000i\000g\000n\000a\000l\000s}{chapter.6}% 41 +\BOOKMARK [0][-]{chapter.7}{\376\377\000G\000r\000a\000p\000h\000\040\000n\000e\000t\000w\000o\000r\000k\000\040\000\050\000T\000y\000p\000e\000\040\000\043\0002\000\051}{}% 42 +\BOOKMARK [1][-]{section.7.1}{\376\377\000T\000w\000o\000\040\000n\000e\000t\000w\000o\000r\000k\000\040\000t\000y\000p\000e\000s}{chapter.7}% 43 +\BOOKMARK [1][-]{section.7.2}{\376\377\000G\000l\000o\000b\000a\000l\000\040\000a\000c\000t\000i\000v\000a\000t\000i\000o\000n\000\040\000b\000u\000f\000f\000e\000r}{chapter.7}% 44 +\BOOKMARK [1][-]{section.7.3}{\376\377\000F\000e\000e\000d\000-\000f\000o\000r\000w\000a\000r\000d\000\040\000D\000A\000G\000\040\000a\000n\000d\000\040\000t\000h\000e\000\040\000s\000r\000c\000\137\000i\000d\000\040\000<\000\040\000o\000u\000t\000\137\000i\000d\000\040\000r\000u\000l\000e}{chapter.7}% 45 +\BOOKMARK [1][-]{section.7.4}{\376\377\000D\000a\000t\000a\000\040\000f\000o\000r\000m\000a\000t\000s}{chapter.7}% 46 +\BOOKMARK [2][-]{subsection.7.4.1}{\376\377\000T\000y\000p\000e\000\040\000\043\0002\000\040\000d\000e\000s\000c\000r\000i\000p\000t\000o\000r\000\040\000\050\000g\000r\000a\000p\000h\000\051}{section.7.4}% 47 +\BOOKMARK [2][-]{subsection.7.4.2}{\376\377\000G\000r\000a\000p\000h\000\040\000e\000d\000g\000e\000\040\000\050\0004\000\040\000b\000y\000t\000e\000s\000,\000\040\000a\000l\000i\000g\000n\000e\000d\000\051}{section.7.4}% 48 +\BOOKMARK [1][-]{section.7.5}{\376\377\000g\000r\000a\000p\000h\000\137\000e\000n\000g\000i\000n\000e\000\040\040\024\000\040\000g\000r\000a\000p\000h\000\040\000e\000n\000g\000i\000n\000e}{chapter.7}% 49 +\BOOKMARK [1][-]{section.7.6}{\376\377\000T\000y\000p\000e\000\040\000\043\0002\000\040\000o\000p\000c\000o\000d\000e\000s\000\040\000a\000n\000d\000\040\000r\000e\000g\000i\000s\000t\000e\000r\000s}{chapter.7}% 50 +\BOOKMARK [1][-]{section.7.7}{\376\377\000O\000c\000c\000u\000p\000a\000n\000c\000y\000\040\000\050\000T\000y\000p\000e\000\040\000\043\0002\000\040\000e\000n\000a\000b\000l\000e\000d\000\051}{chapter.7}% 51 +\BOOKMARK [1][-]{section.7.8}{\376\377\000G\000a\000t\000h\000e\000r\000\040\000b\000a\000n\000d\000w\000i\000d\000t\000h\000\040\000\050\000m\000e\000a\000s\000u\000r\000e\000d\000\051}{chapter.7}% 52 +\BOOKMARK [1][-]{section.7.9}{\376\377\000n\000e\000t\000a\000s\000m\000\040\000h\000o\000s\000t\000\040\000a\000s\000s\000e\000m\000b\000l\000e\000r}{chapter.7}% 53 +\BOOKMARK [0][-]{chapter.8}{\376\377\000S\000P\000I\000\040\000h\000o\000s\000t\000\040\000i\000n\000t\000e\000r\000f\000a\000c\000e}{}% 54 +\BOOKMARK [1][-]{section.8.1}{\376\377\000P\000h\000y\000s\000i\000c\000a\000l\000\040\000l\000a\000y\000e\000r}{chapter.8}% 55 +\BOOKMARK [1][-]{section.8.2}{\376\377\000F\000r\000a\000m\000i\000n\000g\000\040\000a\000n\000d\000\040\000e\000x\000p\000l\000i\000c\000i\000t\000\040\000l\000e\000n\000g\000t\000h}{chapter.8}% 56 +\BOOKMARK [1][-]{section.8.3}{\376\377\000O\000p\000c\000o\000d\000e\000\040\000t\000a\000b\000l\000e}{chapter.8}% 57 +\BOOKMARK [1][-]{section.8.4}{\376\377\000S\000E\000T\000\137\000B\000A\000S\000E\000\040\000s\000e\000l\000e\000c\000t\000o\000r\000s}{chapter.8}% 58 +\BOOKMARK [1][-]{section.8.5}{\376\377\000S\000T\000A\000T\000U\000S\000.\000d\000o\000n\000e\000\040\000s\000t\000i\000c\000k\000y\000\040\000/\000\040\000c\000l\000e\000a\000r\000-\000o\000n\000-\000r\000e\000a\000d}{chapter.8}% 59 +\BOOKMARK [1][-]{section.8.6}{\376\377\000H\000o\000s\000t\000\040\000a\000t\000t\000e\000n\000t\000i\000o\000n\000\040\000p\000i\000n\000s\000\040\000\050\000d\000a\000t\000a\000\137\000r\000e\000a\000d\000y\000\137\000n\000,\000\040\000i\000r\000q\000\137\000n\000\051}{chapter.8}% 60 +\BOOKMARK [1][-]{section.8.7}{\376\377\000R\000E\000A\000D\000\137\000C\000O\000N\000F\000I\000G}{chapter.8}% 61 +\BOOKMARK [1][-]{section.8.8}{\376\377\000F\000l\000a\000s\000h\000\040\000s\000u\000b\000s\000y\000s\000t\000e\000m\000\040\000\050\000o\000p\000c\000o\000d\000e\000s\000\040\0000\000x\0004\0000\040\023\0000\000x\0004\0007\000,\000\040\000c\000o\000m\000p\000l\000e\000t\000e\000d\000\040\0002\0000\0002\0006\000-\0000\0009\000-\0000\0004\000\051}{chapter.8}% 62 +\BOOKMARK [1][-]{section.8.9}{\376\377\000S\000e\000s\000s\000i\000o\000n\000\040\000s\000e\000q\000u\000e\000n\000c\000e\000s}{chapter.8}% 63 +\BOOKMARK [2][-]{subsection.8.9.1}{\376\377\000S\000i\000n\000g\000l\000e\000-\000l\000a\000y\000e\000r\000\040\000p\000a\000t\000h}{section.8.9}% 64 +\BOOKMARK [2][-]{subsection.8.9.2}{\376\377\000M\000u\000l\000t\000i\000-\000l\000a\000y\000e\000r\000\040\000p\000a\000t\000h\000\040\000\050\000R\000U\000N\000\137\000N\000E\000T\000W\000O\000R\000K\000\051}{section.8.9}% 65 +\BOOKMARK [0][-]{chapter.9}{\376\377\000N\000e\000t\000w\000o\000r\000k\000\040\000p\000r\000o\000g\000r\000a\000m\000m\000i\000n\000g}{}% 66 +\BOOKMARK [1][-]{section.9.1}{\376\377\000G\000e\000n\000e\000r\000a\000l\000\040\000f\000l\000o\000w}{chapter.9}% 67 +\BOOKMARK [1][-]{section.9.2}{\376\377\000R\000e\000g\000i\000s\000t\000e\000r\000s\000\040\000a\000n\000d\000\040\000o\000p\000c\000o\000d\000e\000s\000\040\000i\000n\000v\000o\000l\000v\000e\000d}{chapter.9}% 68 +\BOOKMARK [1][-]{section.9.3}{\376\377\000T\000y\000p\000e\000\040\000\043\0001\000\040\040\024\000\040\000d\000e\000n\000s\000e\000\040\000n\000e\000t\000w\000o\000r\000k}{chapter.9}% 69 +\BOOKMARK [2][-]{subsection.9.3.1}{\376\377\000M\000e\000m\000o\000r\000y\000\040\000l\000a\000y\000o\000u\000t}{section.9.3}% 70 +\BOOKMARK [2][-]{subsection.9.3.2}{\376\377\000W\000o\000r\000k\000e\000d\000\040\000e\000x\000a\000m\000p\000l\000e\000:\000\040\000a\000\040\0004\0004\0002\000\040\000n\000e\000t\000w\000o\000r\000k}{section.9.3}% 71 +\BOOKMARK [2][-]{subsection.9.3.3}{\376\377\000H\000o\000s\000t\000\040\000p\000s\000e\000u\000d\000o\000c\000o\000d\000e\000\040\000\050\000d\000e\000n\000s\000e\000\051}{section.9.3}% 72 +\BOOKMARK [1][-]{section.9.4}{\376\377\000T\000y\000p\000e\000\040\000\043\0002\000\040\040\024\000\040\000g\000r\000a\000p\000h\000\040\000n\000e\000t\000w\000o\000r\000k}{chapter.9}% 73 +\BOOKMARK [2][-]{subsection.9.4.1}{\376\377\000M\000e\000m\000o\000r\000y\000\040\000l\000a\000y\000o\000u\000t}{section.9.4}% 74 +\BOOKMARK [2][-]{subsection.9.4.2}{\376\377\000W\000o\000r\000k\000e\000d\000\040\000e\000x\000a\000m\000p\000l\000e}{section.9.4}% 75 +\BOOKMARK [2][-]{subsection.9.4.3}{\376\377\000H\000o\000s\000t\000\040\000p\000s\000e\000u\000d\000o\000c\000o\000d\000e\000\040\000\050\000g\000r\000a\000p\000h\000\051}{section.9.4}% 76 +\BOOKMARK [2][-]{subsection.9.4.4}{\376\377\000n\000e\000t\000a\000s\000m\000\040\000p\000s\000e\000u\000d\000o\000-\000a\000s\000s\000e\000m\000b\000l\000y}{section.9.4}% 77 +\BOOKMARK [0][-]{chapter.10}{\376\377\000A\000r\000b\000i\000t\000r\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000t\000o\000p\000-\000l\000e\000v\000e\000l}{}% 78 +\BOOKMARK [1][-]{section.10.1}{\376\377\000m\000e\000m\000\137\000a\000r\000b\000i\000t\000e\000r\000\040\040\024\000\040\000t\000h\000r\000e\000e\000-\000p\000o\000r\000t\000\040\000a\000r\000b\000i\000t\000e\000r}{chapter.10}% 79 +\BOOKMARK [1][-]{section.10.2}{\376\377\000s\000p\000i\000\137\000n\000e\000u\000r\000o\000n\000\137\000t\000o\000p\000\040\040\024\000\040\000f\000u\000l\000l\000\040\000i\000n\000t\000e\000g\000r\000a\000t\000i\000o\000n}{chapter.10}% 80 +\BOOKMARK [0][-]{chapter.11}{\376\377\000E\000C\000P\0005\000\040\000i\000m\000p\000l\000e\000m\000e\000n\000t\000a\000t\000i\000o\000n}{}% 81 +\BOOKMARK [1][-]{section.11.1}{\376\377\000F\000l\000o\000w\000\040\000a\000n\000d\000\040\000v\000e\000r\000i\000f\000i\000c\000a\000t\000i\000o\000n}{chapter.11}% 82 +\BOOKMARK [1][-]{section.11.2}{\376\377\000D\000a\000t\000a\000p\000a\000t\000h\000\040\000b\000e\000n\000c\000h\000m\000a\000r\000k\000\040\000\050\0002\0005\0006\0004\000\051}{chapter.11}% 83 +\BOOKMARK [2][-]{subsection.11.2.1}{\376\377\000F\000m\000a\000x\000\040\000a\000n\000d\000\040\000t\000h\000r\000o\000u\000g\000h\000p\000u\000t\000\040\000v\000e\000r\000s\000u\000s\000\040\000p\000a\000r\000a\000l\000l\000e\000l\000i\000s\000m}{section.11.2}% 84 +\BOOKMARK [2][-]{subsection.11.2.2}{\376\377\000I\000n\000t\000e\000r\000p\000r\000e\000t\000a\000t\000i\000o\000n}{section.11.2}% 85 +\BOOKMARK [2][-]{subsection.11.2.3}{\376\377\000C\000r\000i\000t\000i\000c\000a\000l\000\040\000p\000a\000t\000h\000\040\000a\000n\000d\000\040\000t\000h\000e\000\040\0001\0000\0000\000\040\000M\000H\000z\000\040\000l\000i\000m\000i\000t}{section.11.2}% 86 +\BOOKMARK [1][-]{section.11.3}{\376\377\000F\000u\000l\000l\000\040\000i\000n\000t\000e\000g\000r\000a\000t\000e\000d\000\040\000s\000y\000s\000t\000e\000m}{chapter.11}% 87 +\BOOKMARK [2][-]{subsection.11.3.1}{\376\377\000C\000a\000u\000s\000e\000:\000\040\000t\000h\000e\000\040\000s\000a\000t\000u\000r\000a\000t\000i\000o\000n\000/\000R\000e\000L\000U\000\040\000c\000a\000r\000r\000y\000\040\000c\000h\000a\000i\000n}{section.11.3}% 88 +\BOOKMARK [2][-]{subsection.11.3.2}{\376\377\000T\000i\000m\000i\000n\000g\000\040\000c\000l\000o\000s\000u\000r\000e\000\040\000\050\0002\0000\0002\0006\000-\0000\0009\000-\0000\0003\000\051}{section.11.3}% 89 +\BOOKMARK [0][-]{chapter.12}{\376\377\000H\000a\000r\000d\000w\000a\000r\000e\000\040\000d\000e\000s\000i\000g\000n\000\040\000a\000n\000d\000\040\000p\000i\000n\000o\000u\000t}{}% 90 +\BOOKMARK [1][-]{section.12.1}{\376\377\000T\000a\000r\000g\000e\000t\000\040\000d\000e\000v\000i\000c\000e}{chapter.12}% 91 +\BOOKMARK [1][-]{section.12.2}{\376\377\000P\000i\000n\000\040\000b\000u\000d\000g\000e\000t}{chapter.12}% 92 +\BOOKMARK [1][-]{section.12.3}{\376\377\000S\000i\000g\000n\000a\000l\000\040\000m\000a\000p\000\040\000\050\000t\000o\000p\000-\000l\000e\000v\000e\000l\000\040\000s\000p\000i\000\137\000n\000e\000u\000r\000o\000n\000\137\000t\000o\000p\000\051\000\040\040\024\000\040\000r\000e\000a\000l\000\040\000b\000a\000l\000l\000s}{chapter.12}% 93 +\BOOKMARK [1][-]{section.12.4}{\376\377\000P\000e\000r\000-\000b\000a\000n\000k\000\040\000a\000l\000l\000o\000c\000a\000t\000i\000o\000n\000\040\000\050\000r\000e\000a\000l\000\040\000d\000i\000e\000\040\000g\000e\000o\000m\000e\000t\000r\000y\000\051}{chapter.12}% 94 +\BOOKMARK [1][-]{section.12.5}{\376\377\000P\000S\000R\000A\000M\000\040\000s\000u\000b\000s\000y\000s\000t\000e\000m}{chapter.12}% 95 +\BOOKMARK [2][-]{subsection.12.5.1}{\376\377\000P\000S\000R\000A\000M\000\040\000c\000o\000n\000n\000e\000c\000t\000i\000o\000n\000\040\000\050\000F\000P\000G\000A\000-\000e\000x\000c\000l\000u\000s\000i\000v\000e\000\051}{section.12.5}% 96 +\BOOKMARK [1][-]{section.12.6}{\376\377\000C\000l\000o\000c\000k}{chapter.12}% 97 +\BOOKMARK [1][-]{section.12.7}{\376\377\000P\000o\000w\000e\000r}{chapter.12}% 98 +\BOOKMARK [1][-]{section.12.8}{\376\377\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\000a\000n\000d\000\040\000p\000r\000o\000g\000r\000a\000m\000m\000i\000n\000g}{chapter.12}% 99 +\BOOKMARK [2][-]{subsection.12.8.1}{\376\377\000J\000T\000A\000G\000\040\000\050\000d\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t\000\040\000/\000\040\000d\000e\000b\000u\000g\000\051}{section.12.8}% 100 +\BOOKMARK [2][-]{subsection.12.8.2}{\376\377\000C\000o\000n\000f\000i\000g\000-\000S\000P\000I\000\040\000t\000o\000\040\000b\000o\000o\000t\000\040\000f\000l\000a\000s\000h}{section.12.8}% 101 +\BOOKMARK [2][-]{subsection.12.8.3}{\376\377\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\000m\000o\000d\000e\000s\000\040\000\050\000C\000F\000G\000M\000D\000N\000\051}{section.12.8}% 102 +\BOOKMARK [1][-]{section.12.9}{\376\377\000O\000p\000e\000n\000\040\000t\000a\000s\000k\000s\000\040\000b\000e\000f\000o\000r\000e\000\040\000s\000c\000h\000e\000m\000a\000t\000i\000c\000\040\000c\000a\000p\000t\000u\000r\000e}{chapter.12}% 103 +\BOOKMARK [0][-]{chapter.13}{\376\377\000Q\000u\000i\000c\000k\000\040\000r\000e\000f\000e\000r\000e\000n\000c\000e}{}% 104 +\BOOKMARK [1][-]{section.13.1}{\376\377\000S\000P\000I\000\040\000o\000p\000c\000o\000d\000e\000s}{chapter.13}% 105 +\BOOKMARK [1][-]{section.13.2}{\376\377\000S\000T\000A\000T\000U\000S\000\040\000b\000y\000t\000e}{chapter.13}% 106 +\BOOKMARK [1][-]{section.13.3}{\376\377\000S\000E\000T\000\137\000B\000A\000S\000E\000\040\000s\000e\000l\000e\000c\000t\000o\000r\000s}{chapter.13}% 107 +\BOOKMARK [1][-]{section.13.4}{\376\377\000D\000e\000s\000c\000r\000i\000p\000t\000o\000r\000\040\000t\000a\000b\000l\000e\000\040\000\050\0001\0001\000\040\000b\000y\000t\000e\000s\000/\000l\000a\000y\000e\000r\000,\000\040\000M\000S\000B\000-\000f\000i\000r\000s\000t\000\051}{chapter.13}% 108 +\BOOKMARK [1][-]{section.13.5}{\376\377\000B\000u\000i\000l\000d\000\040\000p\000a\000r\000a\000m\000e\000t\000e\000r\000s}{chapter.13}% 109 +\BOOKMARK [0][-]{chapter.14}{\376\377\000R\000o\000a\000d\000m\000a\000p\000\040\000a\000n\000d\000\040\000d\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t\000\040\000s\000t\000a\000t\000u\000s}{}% 110 +\BOOKMARK [1][-]{section.14.1}{\376\377\000D\000e\000v\000e\000l\000o\000p\000m\000e\000n\000t\000\040\000p\000h\000a\000s\000e\000s}{chapter.14}% 111 +\BOOKMARK [1][-]{section.14.2}{\376\377\000C\000o\000m\000p\000o\000n\000e\000n\000t\000\040\000s\000t\000a\000t\000u\000s}{chapter.14}% 112 +\BOOKMARK [1][-]{section.14.3}{\376\377\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000a\000l\000\040\000p\000r\000i\000n\000c\000i\000p\000l\000e\000\040\000\050\000s\000u\000m\000m\000a\000r\000y\000\051}{chapter.14}% 113 +\BOOKMARK [1][-]{section.14.4}{\376\377\000L\000o\000n\000g\000-\000t\000e\000r\000m\000\040\000v\000i\000s\000i\000o\000n}{chapter.14}% 114 +\BOOKMARK [0][-]{appendix.A}{\376\377\000M\000o\000d\000u\000l\000e\000s\000\040\000a\000n\000d\000\040\000t\000o\000o\000l\000c\000h\000a\000i\000n}{}% 115 +\BOOKMARK [1][-]{section.A.1}{\376\377\000L\000i\000s\000t\000\040\000o\000f\000\040\000R\000T\000L\000\040\000m\000o\000d\000u\000l\000e\000s}{appendix.A}% 116 +\BOOKMARK [1][-]{section.A.2}{\376\377\000P\000o\000r\000t\000s\000\040\000o\000f\000\040\000t\000h\000e\000\040\000t\000o\000p\000-\000l\000e\000v\000e\000l\000\040\000s\000p\000i\000\137\000n\000e\000u\000r\000o\000n\000\137\000t\000o\000p}{appendix.A}% 117 +\BOOKMARK [1][-]{section.A.3}{\376\377\000T\000o\000o\000l\000c\000h\000a\000i\000n}{appendix.A}% 118 +\BOOKMARK [2][-]{subsection.A.3.1}{\376\377\000M\000a\000i\000n\000\040\000n\000e\000x\000t\000p\000n\000r\000\040\000p\000a\000r\000a\000m\000e\000t\000e\000r\000s}{section.A.3}% 119 +\BOOKMARK [2][-]{subsection.A.3.2}{\376\377\000S\000i\000m\000u\000l\000a\000t\000i\000o\000n\000\040\000e\000x\000a\000m\000p\000l\000e}{section.A.3}% 120 +\BOOKMARK [1][-]{section.A.4}{\376\377\000M\000a\000i\000n\000\040\000t\000e\000s\000t\000b\000e\000n\000c\000h\000e\000s}{appendix.A}% 121 diff --git a/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.pdf b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6a6dc9efa76fc5ac72c0e39c8370d9c0ac4bbff3 GIT binary patch literal 453580 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 z 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

2i4QY<7X4m6W~jCJ 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℞ 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 literal 0 HcmV?d00001 diff --git a/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.tex b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.tex new file mode 100644 index 0000000..97863ef --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.tex @@ -0,0 +1,119 @@ +% ====================================================================== +% FPGA-Neural -- INT8 Neural Network Engine +% Datasheet / Technical reference manual +% Repository: github.com/manvalan/FPGA-Neural +% ====================================================================== +\documentclass[11pt,a4paper,openany]{report} + +\newcommand{\datasheetrev}{A1} +\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}; + \node[anchor=north west,text=fnLight,font=\large] + at ([xshift=2.25cm,yshift=-2.15cm]current page.north west) + {INT8 Neural Network Engine for FPGA}; + \node[anchor=north west,text=fnLight2,font=\normalsize] + at ([xshift=2.25cm,yshift=-2.85cm]current page.north west) + {Parametric 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 Linux / ESP32 / MCU / PC}}; + \node[fnblockT,right=18mm of host,minimum width=34mm] (fpga) + {FPGA\\{\scriptsize Neural Network Engine}}; + \node[fnblock,right=18mm of fpga,minimum width=26mm] (ram) + {PSRAM\\{\scriptsize 8\,MB dedicated}}; + \draw[fnbus] (host) -- node[fnlbl,above]{SPI Mode 0} (fpga); + \draw[fnbus] (fpga) -- node[fnlbl,above]{async 16-bit} (ram); + \node[below=1mm of fpga,font=\scriptsize\itshape,text=fnGrey] + {computation entirely on-chip}; +\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-8BG381C} +(speed grade $-8$, CABGA381, 72$\times$MULT18X18D, $\approx$44k LUT).\\[2pt] +\textbf{\color{fnDark}Baseline configuration:} INT8/INT32, \code{N\_INPUTS}=256, \code{N\_NEURONS}=4, +parametric \code{PARALLEL}, PSRAM working memory ISSI \code{IS66WVE4M16EBLL-70BLI}.\\[2pt] +\textbf{\color{fnDark}Status:} RTL verified in simulation (Icarus) and real synthesis +(Yosys + nextpnr-ecp5). 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}.\par} +\end{titlepage} + +% ====================================================================== +% "FEATURES" PAGE (datasheet style) +% ====================================================================== +\input{chapters/00-features} + +% ====================================================================== +% PINOUT SUMMARY (pages 2-3, pin-by-pin -- not bus ranges) +% ====================================================================== +\newpage +\input{chapters/00b-pinout} + +% ====================================================================== +% TABLE OF CONTENTS +% ====================================================================== +\newpage +\pagenumbering{roman} +{\color{fnDark}\tableofcontents} +\newpage +\pagenumbering{arabic} + +% ====================================================================== +% CHAPTERS +% ====================================================================== +\include{chapters/01-overview} +\include{chapters/02-architettura} +\include{chapters/03-datapath} +\include{chapters/04-parametri} +\include{chapters/05-memoria} +\include{chapters/06-sequencer} +\include{chapters/06b-grafo} +\include{chapters/07-spi} +\include{chapters/07b-programmazione} +\include{chapters/08-toplevel} +\include{chapters/09-implementazione} +\include{chapters/10-hardware} +\include{chapters/11-registri} +\include{chapters/12-roadmap} + +\appendix +\include{chapters/A-moduli} + +\end{document} diff --git a/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.toc b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.toc new file mode 100644 index 0000000..c0813a4 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/FPGA-Neural-Datasheet-EN.toc @@ -0,0 +1,122 @@ +\babel@toc {english}{}\relax +\contentsline {chapter}{\numberline {1}System overview}{1}{chapter.1}% +\contentsline {section}{\numberline {1.1}Project goal}{1}{section.1.1}% +\contentsline {section}{\numberline {1.2}Hardware configuration versus network configuration}{1}{section.1.2}% +\contentsline {section}{\numberline {1.3}Boot and initialization}{2}{section.1.3}% +\contentsline {section}{\numberline {1.4}Training and inference}{2}{section.1.4}% +\contentsline {section}{\numberline {1.5}Design philosophy and reuse}{2}{section.1.5}% +\contentsline {chapter}{\numberline {2}RTL architecture}{3}{chapter.2}% +\contentsline {section}{\numberline {2.1}Hierarchical organization}{3}{section.2.1}% +\contentsline {section}{\numberline {2.2}Role of each module}{3}{section.2.2}% +\contentsline {section}{\numberline {2.3}Two execution paths}{4}{section.2.3}% +\contentsline {chapter}{\numberline {3}Compute datapath}{6}{chapter.3}% +\contentsline {section}{\numberline {3.1}INT8/INT32 arithmetic chain}{6}{section.3.1}% +\contentsline {section}{\numberline {3.2}\texttt {mac\_unit} --- multiply-accumulator}{6}{section.3.2}% +\contentsline {section}{\numberline {3.3}\texttt {mac8} --- parallel MAC and balanced adder tree}{6}{section.3.3}% +\contentsline {section}{\numberline {3.4}\texttt {neuron\_parallel} --- neuron FSM}{7}{section.3.4}% +\contentsline {subsection}{\numberline {3.4.1}Parameter guard (elaboration-time)}{7}{subsection.3.4.1}% +\contentsline {section}{\numberline {3.5}Activation functions}{8}{section.3.5}% +\contentsline {section}{\numberline {3.6}INT8 saturation}{8}{section.3.6}% +\contentsline {section}{\numberline {3.7}\texttt {layer} --- neurons in parallel}{8}{section.3.7}% +\contentsline {chapter}{\numberline {4}Parameters and configurability}{9}{chapter.4}% +\contentsline {section}{\numberline {4.1}Build parameters (synthesis-time)}{9}{section.4.1}% +\contentsline {section}{\numberline {4.2}Runtime network width}{9}{section.4.2}% +\contentsline {subsection}{\numberline {4.2.1}Measured savings}{10}{subsection.4.2.1}% +\contentsline {section}{\numberline {4.3}Characterized configurations}{10}{section.4.3}% +\contentsline {section}{\numberline {4.4}Build versus runtime summary}{10}{section.4.4}% +\contentsline {chapter}{\numberline {5}Memory subsystem}{11}{chapter.5}% +\contentsline {section}{\numberline {5.1}Memory chain}{11}{section.5.1}% +\contentsline {section}{\numberline {5.2}\texttt {int8\_memory\_access} --- byte/word conversion}{11}{section.5.2}% +\contentsline {section}{\numberline {5.3}\texttt {memory\_interface} --- handshake}{11}{section.5.3}% +\contentsline {section}{\numberline {5.4}\texttt {psram\_controller} --- physical bus}{11}{section.5.4}% +\contentsline {subsection}{\numberline {5.4.1}Timing}{12}{subsection.5.4.1}% +\contentsline {section}{\numberline {5.5}Read page mode}{12}{section.5.5}% +\contentsline {section}{\numberline {5.6}Address map and conventions}{13}{section.5.6}% +\contentsline {subsection}{\numberline {5.6.1}PSRAM physical addressing}{13}{subsection.5.6.1}% +\contentsline {section}{\numberline {5.7}Bandwidth}{13}{section.5.7}% +\contentsline {chapter}{\numberline {6}Memory, multi-neuron and multi-layer}{15}{chapter.6}% +\contentsline {section}{\numberline {6.1}\texttt {neuron\_memory} --- memory/neuron bridge}{15}{section.6.1}% +\contentsline {section}{\numberline {6.2}\texttt {layer\_sequencer} --- multi-layer network}{15}{section.6.2}% +\contentsline {subsection}{\numberline {6.2.1}Ping-pong buffers}{16}{subsection.6.2.1}% +\contentsline {subsection}{\numberline {6.2.2}Descriptor table}{16}{subsection.6.2.2}% +\contentsline {section}{\numberline {6.3}Hierarchy of the \texttt {busy}/\texttt {done} signals}{16}{section.6.3}% +\contentsline {chapter}{\numberline {7}Graph network (Type \#2)}{17}{chapter.7}% +\contentsline {section}{\numberline {7.1}Two network types}{17}{section.7.1}% +\contentsline {section}{\numberline {7.2}Global activation buffer}{17}{section.7.2}% +\contentsline {section}{\numberline {7.3}Feed-forward DAG and the \texttt {src\_id < out\_id} rule}{17}{section.7.3}% +\contentsline {section}{\numberline {7.4}Data formats}{17}{section.7.4}% +\contentsline {subsection}{\numberline {7.4.1}Type \#2 descriptor (graph)}{18}{subsection.7.4.1}% +\contentsline {subsection}{\numberline {7.4.2}Graph edge (4~bytes, aligned)}{18}{subsection.7.4.2}% +\contentsline {section}{\numberline {7.5}\texttt {graph\_engine} --- graph engine}{18}{section.7.5}% +\contentsline {section}{\numberline {7.6}Type \#2 opcodes and registers}{19}{section.7.6}% +\contentsline {section}{\numberline {7.7}Occupancy (Type \#2 enabled)}{19}{section.7.7}% +\contentsline {section}{\numberline {7.8}Gather bandwidth (measured)}{20}{section.7.8}% +\contentsline {section}{\numberline {7.9}\texttt {netasm} host assembler}{20}{section.7.9}% +\contentsline {chapter}{\numberline {8}SPI host interface}{21}{chapter.8}% +\contentsline {section}{\numberline {8.1}Physical layer}{21}{section.8.1}% +\contentsline {section}{\numberline {8.2}Framing and explicit length}{21}{section.8.2}% +\contentsline {section}{\numberline {8.3}Opcode table}{21}{section.8.3}% +\contentsline {section}{\numberline {8.4}\texttt {SET\_BASE} selectors}{23}{section.8.4}% +\contentsline {section}{\numberline {8.5}\texttt {STATUS.done} sticky / clear-on-read}{24}{section.8.5}% +\contentsline {section}{\numberline {8.6}Host attention pins (\texttt {data\_ready\_n}, \texttt {irq\_n})}{24}{section.8.6}% +\contentsline {section}{\numberline {8.7}\texttt {READ\_CONFIG}}{25}{section.8.7}% +\contentsline {section}{\numberline {8.8}Flash subsystem (opcodes 0x40--0x47, completed 2026-09-04)}{25}{section.8.8}% +\contentsline {section}{\numberline {8.9}Session sequences}{26}{section.8.9}% +\contentsline {subsection}{\numberline {8.9.1}Single-layer path}{26}{subsection.8.9.1}% +\contentsline {subsection}{\numberline {8.9.2}Multi-layer path (RUN\_NETWORK)}{26}{subsection.8.9.2}% +\contentsline {chapter}{\numberline {9}Network programming}{28}{chapter.9}% +\contentsline {section}{\numberline {9.1}General flow}{28}{section.9.1}% +\contentsline {section}{\numberline {9.2}Registers and opcodes involved}{28}{section.9.2}% +\contentsline {section}{\numberline {9.3}Type \#1 --- dense network}{29}{section.9.3}% +\contentsline {subsection}{\numberline {9.3.1}Memory layout}{29}{subsection.9.3.1}% +\contentsline {subsection}{\numberline {9.3.2}Worked example: a $4\to 4\to 2$ network}{29}{subsection.9.3.2}% +\contentsline {subsection}{\numberline {9.3.3}Host pseudocode (dense)}{29}{subsection.9.3.3}% +\contentsline {section}{\numberline {9.4}Type \#2 --- graph network}{30}{section.9.4}% +\contentsline {subsection}{\numberline {9.4.1}Memory layout}{30}{subsection.9.4.1}% +\contentsline {subsection}{\numberline {9.4.2}Worked example}{30}{subsection.9.4.2}% +\contentsline {subsection}{\numberline {9.4.3}Host pseudocode (graph)}{30}{subsection.9.4.3}% +\contentsline {subsection}{\numberline {9.4.4}\texttt {netasm} pseudo-assembly}{31}{subsection.9.4.4}% +\contentsline {chapter}{\numberline {10}Arbitration and top-level}{32}{chapter.10}% +\contentsline {section}{\numberline {10.1}\texttt {mem\_arbiter} --- three-port arbiter}{32}{section.10.1}% +\contentsline {section}{\numberline {10.2}\texttt {spi\_neuron\_top} --- full integration}{32}{section.10.2}% +\contentsline {chapter}{\numberline {11}ECP5 implementation}{34}{chapter.11}% +\contentsline {section}{\numberline {11.1}Flow and verification}{34}{section.11.1}% +\contentsline {section}{\numberline {11.2}Datapath benchmark (256$\times $4)}{34}{section.11.2}% +\contentsline {subsection}{\numberline {11.2.1}Fmax and throughput versus parallelism}{35}{subsection.11.2.1}% +\contentsline {subsection}{\numberline {11.2.2}Interpretation}{35}{subsection.11.2.2}% +\contentsline {subsection}{\numberline {11.2.3}Critical path and the 100~MHz limit}{35}{subsection.11.2.3}% +\contentsline {section}{\numberline {11.3}Full integrated system}{35}{section.11.3}% +\contentsline {subsection}{\numberline {11.3.1}Cause: the saturation/ReLU carry chain}{35}{subsection.11.3.1}% +\contentsline {subsection}{\numberline {11.3.2}Timing closure (2026-09-03)}{36}{subsection.11.3.2}% +\contentsline {chapter}{\numberline {12}Hardware design and pinout}{37}{chapter.12}% +\contentsline {section}{\numberline {12.1}Target device}{37}{section.12.1}% +\contentsline {section}{\numberline {12.2}Pin budget}{37}{section.12.2}% +\contentsline {section}{\numberline {12.3}Signal map (top-level \texttt {spi\_neuron\_top}) --- real balls}{38}{section.12.3}% +\contentsline {section}{\numberline {12.4}Per-bank allocation (real die geometry)}{40}{section.12.4}% +\contentsline {section}{\numberline {12.5}PSRAM subsystem}{40}{section.12.5}% +\contentsline {subsection}{\numberline {12.5.1}PSRAM connection (FPGA-exclusive)}{40}{subsection.12.5.1}% +\contentsline {section}{\numberline {12.6}Clock}{41}{section.12.6}% +\contentsline {section}{\numberline {12.7}Power}{41}{section.12.7}% +\contentsline {section}{\numberline {12.8}Configuration and programming}{41}{section.12.8}% +\contentsline {subsection}{\numberline {12.8.1}JTAG (development / debug)}{41}{subsection.12.8.1}% +\contentsline {subsection}{\numberline {12.8.2}Config-SPI to boot flash}{41}{subsection.12.8.2}% +\contentsline {subsection}{\numberline {12.8.3}Configuration modes (\texttt {CFGMDN})}{42}{subsection.12.8.3}% +\contentsline {section}{\numberline {12.9}Open tasks before schematic capture}{42}{section.12.9}% +\contentsline {chapter}{\numberline {13}Quick reference}{44}{chapter.13}% +\contentsline {section}{\numberline {13.1}SPI opcodes}{44}{section.13.1}% +\contentsline {section}{\numberline {13.2}STATUS byte}{44}{section.13.2}% +\contentsline {section}{\numberline {13.3}SET\_BASE selectors}{44}{section.13.3}% +\contentsline {section}{\numberline {13.4}Descriptor table (11 bytes/layer, MSB-first)}{44}{section.13.4}% +\contentsline {section}{\numberline {13.5}Build parameters}{44}{section.13.5}% +\contentsline {chapter}{\numberline {14}Roadmap and development status}{45}{chapter.14}% +\contentsline {section}{\numberline {14.1}Development phases}{45}{section.14.1}% +\contentsline {section}{\numberline {14.2}Component status}{45}{section.14.2}% +\contentsline {section}{\numberline {14.3}Architectural principle (summary)}{46}{section.14.3}% +\contentsline {section}{\numberline {14.4}Long-term vision}{46}{section.14.4}% +\contentsline {chapter}{\numberline {A}Modules and toolchain}{47}{appendix.A}% +\contentsline {section}{\numberline {A.1}List of RTL modules}{47}{section.A.1}% +\contentsline {section}{\numberline {A.2}Ports of the top-level \texttt {spi\_neuron\_top}}{47}{section.A.2}% +\contentsline {section}{\numberline {A.3}Toolchain}{47}{section.A.3}% +\contentsline {subsection}{\numberline {A.3.1}Main nextpnr parameters}{47}{subsection.A.3.1}% +\contentsline {subsection}{\numberline {A.3.2}Simulation example}{48}{subsection.A.3.2}% +\contentsline {section}{\numberline {A.4}Main testbenches}{48}{section.A.4}% diff --git a/hardware/v1/docs/DatasheetLatex/chapters/00-features.tex b/hardware/v1/docs/DatasheetLatex/chapters/00-features.tex new file mode 100644 index 0000000..9a7437f --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/00-features.tex @@ -0,0 +1,120 @@ +\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 --- General description and features}; +\end{tikzpicture} + +\vspace{6pt} +\noindent +{\small FPGA-Neural is a \textbf{parametric hardware accelerator for feed-forward +neural networks} contained entirely within the FPGA. Computation (multiplication, +accumulation, bias, activation, saturation) takes place entirely on-chip in INT8/INT32 +integer arithmetic; the host system only provides configuration, weights, input data +and control through a simple SPI interface, without ever being part of the +computational datapath. A single bitstream serves any topology up to the build +maximum.} + +\vspace{8pt} +\begin{multicols}{2} +{\color{fnDark}\large\bfseries Features}\\[2pt] +{\footnotesize +\begin{itemize}[leftmargin=1.1em] +\item \textbf{INT8 $\times$ INT8 $\to$ INT16 $\to$ INT32} datapath, 32-bit accumulation + with sign extension. +\item \textbf{Balanced binary adder tree} ($O(\log_2 \text{PARALLEL})$) instead of + linear reduction. +\item Configurable parallel MAC: \code{PARALLEL} simultaneous hardware MACs per neuron, + mapped onto \code{MULT18X18D} DSPs. +\item Fully \textbf{parametric} architecture: \code{N\_INPUTS}, \code{N\_NEURONS}, + \code{PARALLEL}, \code{DATA\_WIDTH}, \code{ACC\_WIDTH}, \code{N\_LAYERS}. +\item \textbf{Runtime network width}: per-layer \code{n\_inputs\_real}/\code{n\_neurons\_real}, + a single bitstream for every topology up to the maximum. +\item Configurable activations: \code{ACT\_RELU} (default) and \code{ACT\_NONE} (linear + with bilateral saturation), with INT8 saturation. +\item \textbf{Two network types}: classic multi-layer dense (\code{layer\_sequencer}, + ping-pong buffers) and \textbf{arbitrary sparse graph} (\code{graph\_engine} + + activation buffer in \code{DP16KD} block RAM), selectable at runtime. +\item \textbf{Dedicated memory} subsystem: byte$\leftrightarrow$word interface, + asynchronous parallel PSRAM controller with \textbf{page mode} (70~ns random + access, 20~ns page burst), 8~MB addressable (23~bit). +\item \textbf{SPI Mode 0} MSB-first host interface, \code{SET\_NET\_TYPE}+dispatch, \code{STATUS.done} + sticky/clear-on-read, runtime \code{READ\_CONFIG}. +\item \textbf{Flash subsystem} for boot/persistence: FPGA-exclusive access to a + \code{W25Q128JV} SPI NOR (16~MB) via a dedicated SPI master, a + flash$\leftrightarrow$PSRAM copy engine, and a 16-slot catalog with CRC32, + 8 host opcodes. +\item Verified in \textbf{simulation} (Icarus Verilog) and \textbf{real synthesis} + (Yosys + nextpnr-ecp5 + ecppack). +\end{itemize}} + +\columnbreak + +{\color{fnDark}\large\bfseries Applications}\\[2pt] +{\footnotesize +\begin{itemize}[leftmargin=1.1em] +\item Deterministic low-latency inference as a peripheral of a + Linux SoC, Raspberry-Pi-like board, ESP32, microcontrollers. +\item Reusable hardware block integrable into heterogeneous projects + (a platform, not a single network). +\item Edge AI on compact dense INT8-quantized networks. +\item Off-loading the neural workload from the host CPU to dedicated + hardware with predictable 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-8BG381C} ($-8$, CABGA381). +\item Synthesis: Yosys; place\&route: nextpnr-ecp5; bitstream: Project~Trellis + (\code{ecppack}). +\item Simulation: Icarus Verilog (\code{-g2012}). +\item PSRAM: ISSI \code{IS66WVE4M16EBLL-70BLI} (64\,Mb, 4M$\times$16). +\end{itemize}} +\end{multicols} + +\vspace{2pt} +% --- key parameter table --- +\noindent +{\small\color{fnDark}\bfseries Key parameters (characterized baseline configuration)} +\vspace{2pt} + +\noindent +\begin{tabularx}{\textwidth}{L{3.2cm}L{3.6cm}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 \\ +Inputs / neurons & 256 / 4 & datapath benchmark baseline \\ +\rowa Simultaneous MACs & $2\ldots64$ & $=$\code{PARALLEL}$\times$\code{N\_NEURONS} \\ +Activations & ReLU, linear & \code{ACT\_RELU} / \code{ACT\_NONE} \\ +\rowa Fmax (P=2, datapath) & 87.88~MHz & isolated datapath benchmark \\ +Fmax (P=2, integrated system) & 67.91~MHz & full system incl. flash subsystem, real place\&route \\ +MAC throughput (P=16) & $\approx$3.34~G\,MAC/s & theoretical, datapath only \\ +\rowa Working memory & 8~MB PSRAM & 16-bit parallel bus, 70~ns / 20~ns page mode \\ +Address space & 23~bit (byte) & \code{ADDR\_WIDTH}=23 \\ +\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 configures / trains / controls}}; + \node[fnblockT,right=16mm of host,minimum width=52mm,minimum height=22mm] (eng){}; + \node[anchor=north,font=\footnotesize\bfseries,text=fnDark] at (eng.north){FPGA -- Neural Network Engine}; + \node[fnreg,fill=white] (spi) at ([yshift=-2mm]eng.center){\code{spi\_slave} + \code{spi\_engine}}; + \node[fnreg,fill=white,below=2.5mm of spi] (arb){\code{mem\_arbiter} + \code{layer\_sequencer}}; + \node[fnreg,fill=white,above=2.5mm of spi] (core){\code{neuron\_memory} $\to$ \code{neuron\_parallel} $\to$ \code{mac8}}; + \node[fnblock,right=16mm of eng,minimum width=24mm,minimum height=13mm] (ram){PSRAM 8\,MB\\{\scriptsize \code{psram\_controller}}}; + \draw[fnbus] (host) -- node[fnlbl,above]{SPI} (eng.west|-host); + \draw[fnbus] (eng.east|-ram) -- node[fnlbl,above]{16-bit async} (ram); +\end{tikzpicture} +\end{center} +\begin{center}\footnotesize\itshape\color{fnGrey} +The neural datapath is entirely inside the FPGA; the host does not take part in the +individual MAC operations.\end{center} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/00b-pinout.tex b/hardware/v1/docs/DatasheetLatex/chapters/00b-pinout.tex new file mode 100644 index 0000000..0bcf9b2 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/00b-pinout.tex @@ -0,0 +1,103 @@ +\thispagestyle{plain} +\noindent +\begin{tikzpicture} +\node[fill=fnDark,text=white,rounded corners=2pt,inner sep=6pt, + minimum width=\textwidth,anchor=west] + {\large\bfseries Pinout summary --- pin-by-pin connection}; +\end{tikzpicture} + +\vspace{6pt} +\noindent +{\footnotesize +Quick-reference table: the \textbf{57 real signals} of the top-level +\code{spi\_neuron\_top}, each with its own individual \code{CABGA381} ball +(\textbf{not} a bus range) --- real data from Project~Trellis's device +database (\code{iodb.json}), \textbf{verified by a complete +\code{nextpnr-ecp5} place\&route run at 0 errors} (not a planned pinout). +Full description, per-bank placement rationale and the pin-by-pin +connection to the ISSI PSRAM: ch.~\ref{ch:hw}. +} + +\vspace{4pt} +\noindent +\renewcommand{\arraystretch}{1.08} +\begin{tabularx}{\textwidth}{L{2.7cm} C{1.0cm} C{1.0cm} C{0.9cm} Y} +\toprule +\rowh \thd{Signal} & \thd{Ball} & \thd{Bank} & \thd{Dir} & \thd{Corresponding pin / function} \\ +\midrule +\multicolumn{5}{l}{\textit{\color{fnDark}Clock and reset}}\\ +\code{clk} & H5 & 7 & IN & System clock, pad \code{GR\_PCLK7\_0} (dedicated global clock). \\ +\rowa \code{rst} & B4 & 7 & IN & Global synchronous reset, active high. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}Application SPI (host $\leftrightarrow$ FPGA, Mode~0)}}\\ +\code{sclk} & B5 & 7 & IN & SPI clock (CPOL=0, CPHA=0). \\ +\rowa \code{mosi} & C5 & 7 & IN & Master-Out Slave-In. \\ +\code{miso} & A3 & 7 & OUT & Master-In Slave-Out. \\ +\rowa \code{cs\_n} & B3 & 7 & IN & Chip-select, active low. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}Host attention (active-low, level)}}\\ +\code{data\_ready\_n} & C3 & 7 & OUT & Low while a result is waiting to be read. \\ +\rowa \code{irq\_n} & C4 & 7 & OUT & Low while the graph engine's load-time guard has tripped. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}Flash subsystem --- SPI toward W25Q128JV (boot/persistence)}}\\ +\code{flash\_sclk} & E3 & 7 & OUT & SPI clock toward the flash --- ordinary GPIO, independent (Phase F7, ch.~\ref{ch:hw}). \\ +\rowa \code{flash\_mosi} & D3 & 7 & OUT & Master-Out Slave-In toward the onboard flash. \\ +\code{flash\_miso} & D5 & 7 & IN & Master-In Slave-Out from the flash. \\ +\rowa \code{flash\_cs\_n} & E4 & 7 & OUT & Flash chip-select, active low. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}PSRAM address bus \code{psram\_a[21:0]} --- 22 individual balls (bank 2)}}\\ +\code{psram\_a[0]} & E16 & 2 & OUT & PSRAM A0 \\ +\rowa \code{psram\_a[1]} & F16 & 2 & OUT & PSRAM A1 \\ +\code{psram\_a[2]} & D18 & 2 & OUT & PSRAM A2 \\ +\rowa \code{psram\_a[3]} & E17 & 2 & OUT & PSRAM A3 \\ +\code{psram\_a[4]} & E18 & 2 & OUT & PSRAM A4 \\ +\rowa \code{psram\_a[5]} & F18 & 2 & OUT & PSRAM A5 \\ +\code{psram\_a[6]} & F17 & 2 & OUT & PSRAM A6 \\ +\rowa \code{psram\_a[7]} & G16 & 2 & OUT & PSRAM A7 \\ +\code{psram\_a[8]} & G18 & 2 & OUT & PSRAM A8 \\ +\rowa \code{psram\_a[9]} & H16 & 2 & OUT & PSRAM A9 \\ +\code{psram\_a[10]} & H17 & 2 & OUT & PSRAM A10 \\ +\rowa \code{psram\_a[11]} & H18 & 2 & OUT & PSRAM A11 \\ +\code{psram\_a[12]} & J16 & 2 & OUT & PSRAM A12 \\ +\rowa \code{psram\_a[13]} & J17 & 2 & OUT & PSRAM A13 \\ +\code{psram\_a[14]} & C20 & 2 & OUT & PSRAM A14 \\ +\rowa \code{psram\_a[15]} & D19 & 2 & OUT & PSRAM A15 \\ +\code{psram\_a[16]} & E19 & 2 & OUT & PSRAM A16 \\ +\rowa \code{psram\_a[17]} & E20 & 2 & OUT & PSRAM A17 \\ +\code{psram\_a[18]} & F19 & 2 & OUT & PSRAM A18 \\ +\rowa \code{psram\_a[19]} & F20 & 2 & OUT & PSRAM A19 \\ +\code{psram\_a[20]} & G20 & 2 & OUT & PSRAM A20 \\ +\rowa \code{psram\_a[21]} & H20 & 2 & OUT & PSRAM A21 \\ +\code{psram\_a[22]} & P18 & 3 & OUT & Always 0 (byte$\to$word shift): NC on the board. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}PSRAM data bus \code{psram\_dq[15:0]} --- 16 individual balls (banks 2 and 3)}}\\ +\rowa \code{psram\_dq[0]} & K18 & 2 & IO & PSRAM DQ0 \\ +\code{psram\_dq[1]} & C18 & 2 & IO & PSRAM DQ1 (dual-function ball, used as ordinary GPIO). \\ +\rowa \code{psram\_dq[2]} & D17 & 2 & IO & PSRAM DQ2 \\ +\code{psram\_dq[3]} & D20 & 2 & IO & PSRAM DQ3 \\ +\rowa \code{psram\_dq[4]} & G19 & 2 & IO & PSRAM DQ4 \\ +\code{psram\_dq[5]} & J18 & 2 & IO & PSRAM DQ5 \\ +\rowa \code{psram\_dq[6]} & J19 & 2 & IO & PSRAM DQ6 \\ +\code{psram\_dq[7]} & J20 & 2 & IO & PSRAM DQ7 \\ +\rowa \code{psram\_dq[8]} & K19 & 2 & IO & PSRAM DQ8 \\ +\code{psram\_dq[9]} & K20 & 2 & IO & PSRAM DQ9 \\ +\rowa \code{psram\_dq[10]} & L17 & 3 & IO & PSRAM DQ10 \\ +\code{psram\_dq[11]} & M18 & 3 & IO & PSRAM DQ11 \\ +\rowa \code{psram\_dq[12]} & M17 & 3 & IO & PSRAM DQ12 \\ +\code{psram\_dq[13]} & N16 & 3 & IO & PSRAM DQ13 \\ +\rowa \code{psram\_dq[14]} & N18 & 3 & IO & PSRAM DQ14 \\ +\code{psram\_dq[15]} & P17 & 3 & IO & PSRAM DQ15 \\ +\multicolumn{5}{l}{\textit{\color{fnDark}PSRAM control}}\\ +\rowa \code{psram\_ce\_n} & N17 & 3 & OUT & PSRAM CE\# --- chip enable, active low. \\ +\code{psram\_oe\_n} & R16 & 3 & OUT & PSRAM OE\# --- output enable (read). \\ +\rowa \code{psram\_we\_n} & R17 & 3 & OUT & PSRAM WE\# --- write enable. \\ +\code{psram\_lb\_n} & T16 & 3 & OUT & PSRAM LB\# --- lower-byte enable (DQ[7:0]). \\ +\rowa \code{psram\_ub\_n} & N19 & 3 & OUT & PSRAM UB\# --- upper-byte enable (DQ[15:8]). \\ +\code{psram\_zz\_n} & N20 & 3 & OUT & PSRAM ZZ\# --- sleep/snooze (high during normal operation). \\ +\bottomrule +\end{tabularx} +\renewcommand{\arraystretch}{1.25} + +\vspace{4pt} +\noindent +{\footnotesize\color{fnGrey} +Standard I/O: LVCMOS33 on all 57 signals. Boot config-SPI and JTAG balls (fixed-function +dedicated pins, no RTL port) do not appear in this table --- see ch.~\ref{ch:hw} +§``Configuration and programming''. Source: \code{synth/ecp5/spi\_neuron\_top.lpf}, +generated by \code{tools/pinout/gen\_lpf.py} against Project~Trellis's +\code{iodb.json}.\par} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/01-overview.aux b/hardware/v1/docs/DatasheetLatex/chapters/01-overview.aux new file mode 100644 index 0000000..e9db7ee --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/01-overview.aux @@ -0,0 +1,53 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}System overview}{1}{chapter.1}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:overview}{{1}{1}{System overview}{chapter.1}{}} +\@writefile{toc}{\contentsline {section}{\numberline {1.1}Project goal}{1}{section.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {1.2}Hardware configuration versus network configuration}{1}{section.1.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {1.3}Boot and initialization}{2}{section.1.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {1.4}Training and inference}{2}{section.1.4}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {1.5}Design philosophy and reuse}{2}{section.1.5}\protected@file@percent } +\@setckpt{chapters/01-overview}{ +\setcounter{page}{3} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{1} +\setcounter{section}{5} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{0} +\setcounter{LT@tables}{2} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{2} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{3} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{6} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/01-overview.tex b/hardware/v1/docs/DatasheetLatex/chapters/01-overview.tex new file mode 100644 index 0000000..7efacff --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/01-overview.tex @@ -0,0 +1,93 @@ +\chapter{System overview} +\label{ch:overview} + +\section{Project goal} +FPGA-Neural implements a \textbf{reusable Neural Network Engine in FPGA hardware}. +The whole is made of three elements: the FPGA, which is the actual accelerator; a +dedicated RAM physically associated with the FPGA and not shared with the host; and a +host interface independent of the operating system, initially SPI (with possible +future extension to Dual~SPI). + +The founding principle is the separation between who \emph{executes} the computation +and who \emph{uses} it: the neural network computation happens entirely inside the +FPGA, while the host system only provides configuration, network parameters, input +data, control and result readback. The host is not part of the computational datapath. +Possible host systems include Linux SoCs, Raspberry~Pi-like systems, ESP32, +microcontrollers and development PCs: the same engine architecture must be usable in +completely different systems. + +\begin{center} +\begin{tikzpicture}[font=\footnotesize,node distance=8mm] + \node[fnblockD,minimum width=42mm,minimum height=20mm] (host){\textbf{HOST}\\[2pt] + {\scriptsize Configuration}\\{\scriptsize Training}\\{\scriptsize Control}}; + \node[fnblockT,below=14mm of host,minimum width=42mm,minimum height=20mm] (fpga) + {\textbf{FPGA}\\[2pt]{\scriptsize Neural Network Engine}\\{\scriptsize Compute / Control}}; + \node[fnblock,below=14mm of fpga,minimum width=42mm,minimum height=13mm] (ram) + {\textbf{Dedicated RAM}\\{\scriptsize weights / bias / buffers}}; + \draw[fnbus] (host) -- node[fnlbl,right]{SPI / Dual SPI} (fpga); + \draw[fnbus] (fpga) -- node[fnlbl,right]{parallel bus} (ram); +\end{tikzpicture} +\end{center} + +\section{Hardware configuration versus network configuration} +The project draws a precise distinction between the accelerator's \textbf{hardware +architecture} and the \textbf{neural network parameters}. + +The physical architecture of the engine is defined at FPGA synthesis and +implementation time. Typical hardware parameters are \code{N\_INPUTS}, +\code{N\_NEURONS}, \code{N\_LAYERS}, \code{PARALLEL}, \code{DATA\_WIDTH}, +\code{ACC\_WIDTH}: they are Verilog parameters resolved at synthesis and they +determine the datapath contained in the bitstream. The network parameters --- weights, +bias, activation and quantization parameters, specific constants --- are instead loaded +at runtime through the host interface and stored in the RAM associated with the FPGA. + +\begin{fnnote}[Central architectural principle] +A build fixes the \emph{ceiling} of the machine (maximum number of layers, maximum +width, \code{PARALLEL}); the host configures the \emph{actual} network --- number of +layers, per-layer input/output width, per-layer activation and trained parameters --- +entirely at runtime, over SPI, into the FPGA's local memory. A single bitstream serves +any topology up to that ceiling. +\end{fnnote} + +\section{Boot and initialization} +The FPGA is configured at power-on through the usual configuration mechanism (bitstream +loading from SPI flash). The bitstream defines the hardware architecture of the engine; +the host does not dynamically build the datapath during normal operation, but rather +configures the network data on which the already existing datapath operates. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=4.5mm,start chain=going below, + every node/.style={on chain}] + \node[fnblockA,minimum width=60mm](p){Power-on}; + \node[fnblock,minimum width=60mm]{FPGA configuration (bitstream from flash)}; + \node[fnblockT,minimum width=60mm]{Neural Network Engine available}; + \node[fnblock,minimum width=60mm]{Host initialization (SPI)}; + \node[fnblock,minimum width=60mm]{Loading network parameters / weights / bias}; + \node[fnblockD,minimum width=60mm]{Engine ready}; + \begin{scope}[every path/.style={fnarrow}] + \foreach \a/\b in {1/2,2/3,3/4,4/5,5/6}{} + \end{scope} + \foreach \i [count=\j from 2] in {1,...,5}{ + \draw[fnarrow] (chain-\i) -- (chain-\j);} +\end{tikzpicture} +\end{center} + +\section{Training and inference} +Training and inference are conceptually separate. The first implementation does not +require the FPGA to perform training: weights can be computed externally +(PC/Linux/other host) and transferred over SPI into the FPGA's RAM, which then performs +inference. This drastically reduces the complexity of the initial hardware, without +precluding a future implementation of assisted or fully hardware training (roadmap +Phase~8, ch.~\ref{ch:roadmap}). During inference the host only provides the input data +and retrieves the result, obtaining deterministic computation, reduced host load, +hardware parallelism, predictable latency and independence from the host CPU +architecture. + +\section{Design philosophy and reuse} +The project should be understood as a \emph{reusable FPGA neural acceleration platform} +rather than a single network. The application determines input size, topology, number +of layers and neurons, parallelism, numeric precision, activation functions, memory and +performance requirements; the hardware generation process produces the corresponding +FPGA implementation. The same HDL architecture remains conceptually unchanged while the +synthesis parameters generate implementations appropriate to the different application +targets. diff --git a/hardware/v1/docs/DatasheetLatex/chapters/02-architettura.aux b/hardware/v1/docs/DatasheetLatex/chapters/02-architettura.aux new file mode 100644 index 0000000..6c2bc0a --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/02-architettura.aux @@ -0,0 +1,54 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@iii {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{363.57677pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}RTL architecture}{3}{chapter.2}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:arch}{{2}{3}{RTL architecture}{chapter.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {2.1}Hierarchical organization}{3}{section.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {2.2}Role of each module}{3}{section.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {2.3}Two execution paths}{4}{section.2.3}\protected@file@percent } +\@setckpt{chapters/02-architettura}{ +\setcounter{page}{6} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\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}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{5} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{10} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/02-architettura.tex b/hardware/v1/docs/DatasheetLatex/chapters/02-architettura.tex new file mode 100644 index 0000000..91dba3c --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/02-architettura.tex @@ -0,0 +1,80 @@ +\chapter[RTL architecture]{RTL architecture and module hierarchy} +\label{ch:arch} + +\section{Hierarchical organization} +The design is organized in layers, from the elementary multiply-accumulator up to the +integrated top-level with SPI interface and PSRAM. Each layer encapsulates the previous +one and abstracts away its details: the validated datapath (\code{mac\_unit}, +\code{mac8}, \code{neuron\_parallel}) is never modified by the higher orchestration +layers. + +\begin{center} +\begin{tikzpicture}[font=\footnotesize,every node/.style={fnblock,minimum width=40mm}, + level distance=13mm,sibling distance=0mm] + \node[fnblockD,minimum width=62mm](top){\code{spi\_neuron\_top} \\ {\scriptsize integrated top-level}}; + \node[fnblockT,minimum width=62mm,below=8mm of top](arb){\code{mem\_arbiter} \;/\; \code{layer\_sequencer} \\ {\scriptsize 3-port arbitration + layer sequencing}}; + \node[fnblock,minimum width=62mm,below=8mm of arb](nm){\code{neuron\_memory} \\ {\scriptsize memory $\leftrightarrow$ neuron bridge, neuron loop}}; + \node[fnblock,minimum width=62mm,below=8mm of nm](np){\code{neuron\_parallel} \\ {\scriptsize neuron FSM: groups, bias, activation, saturation}}; + \node[fnblockT,minimum width=62mm,below=8mm of np](m8){\code{mac8} \\ {\scriptsize \code{PARALLEL} MACs + balanced adder tree}}; + \node[fnblock,minimum width=62mm,below=8mm of m8](mu){\code{mac\_unit} \\ {\scriptsize $x\cdot w$ + sign extension + accumulate}}; + \foreach \a/\b in {top/arb,arb/nm,nm/np,np/m8,m8/mu} + \draw[fnarrow] (\a) -- (\b); + + % memory branches on the right + \node[fnblockA,minimum width=34mm,right=14mm of nm](ma){\code{int8\_memory\_access}\\{\scriptsize byte $\leftrightarrow$ 16-bit word}}; + \node[fnblockA,minimum width=34mm,below=6mm of ma](mi){\code{memory\_interface}\\{\scriptsize req/ready handshake}}; + \node[fnblockA,minimum width=34mm,below=6mm of mi](pc){\code{psram\_controller}\\{\scriptsize physical PSRAM bus}}; + \draw[fnarrowT] (ma)--(mi); \draw[fnarrowT] (mi)--(pc); + \draw[fnarrowT,dashed] (nm.east) -- (ma.west); + + % SPI branches on the left + \node[fnblockA,minimum width=30mm,left=14mm of arb,yshift=6mm](ss){\code{spi\_slave}\\{\scriptsize Mode 0 physical layer}}; + \node[fnblockA,minimum width=30mm,below=6mm of ss](se){\code{spi\_engine}\\{\scriptsize opcode FSM + registers}}; + \draw[fnarrowT] (ss)--(se); + \draw[fnarrowT,dashed] (se.east) -- (arb.west); +\end{tikzpicture} +\end{center} + +\section{Role of each module} +\begin{tabularx}{\textwidth}{L{3.4cm}Y} +\toprule +\rowh \thd{Module} & \thd{Function} \\ +\midrule +\code{mac\_unit} & Single multiply-accumulate: $\mathrm{acc\_out}=\mathrm{acc\_in}+(x\cdot w)$, with sign extension of the product to \code{ACC\_WIDTH}. Parametric on \code{DATA\_WIDTH}/\code{ACC\_WIDTH}. \\ +\rowa \code{mac8} & \code{PARALLEL} instances of \code{mac\_unit} whose products are summed by a \emph{balanced binary adder tree} of depth $\log_2(\text{PARALLEL})$; the result is added to the input accumulator. \\ +\code{neuron\_parallel} & FSM of a single neuron: processes \code{N\_INPUTS} inputs in groups of \code{PARALLEL}, accumulates across groups, adds the bias, applies the activation and saturates to INT8. Includes the processing guard on \code{N\_INPUTS \% PARALLEL} and the runtime width \code{n\_inputs\_real}. \\ +\rowa \code{layer} & Instantiates \code{N\_NEURONS} neurons \emph{in parallel} on the same input vector; \code{busy}=OR, \code{done}=AND of the neurons. A purely data-combinational path used in the datapath benchmarks. \\ +\code{neuron\_memory} & Integrates computation with memory: reads $X$ (shared) once, then for each neuron re-reads $W$ and bias from RAM and reuses a single \code{neuron\_parallel} instance (memory-bound, one neuron at a time). Output \code{y\_bus} packed neuron-major. \\ +\rowa \code{layer\_sequencer} & Chains up to \code{N\_LAYERS} executions of \code{neuron\_memory} by reading a descriptor table written by the host and alternating the ping-pong buffers in RAM (Phase~5). \\ +\code{act\_buffer} & Global activation buffer in \code{DP16KD} block RAM, indexed by signal id (Type \#2). \\ +\rowa \code{graph\_engine} & Graph-network engine (Type \#2): gather from \code{act\_buffer}, reuses \code{neuron\_parallel}, writes outputs by id (ch.~\ref{ch:grafo}). \\ +\code{int8\_memory\_access} & Converts the byte/INT8 interface (byte address) into the 16-bit word interface, selecting the low/high byte via \code{lb\_n}/\code{ub\_n} and \code{addr>>1}. \\ +\rowa \code{memory\_interface} & 2-state handshake FSM (IDLE/WAIT) that serializes the single transaction toward the controller. \\ +\code{psram\_controller} & Asynchronous parallel PSRAM bus controller with read \textbf{page mode}: 70~ns random access (\code{tAA}), 20~ns same-page bursts (\code{tAPA}) with CE\#/OE\# held asserted; enables page mode on the chip at boot via the configuration register (ch.~\ref{ch:mem}, \S~5.5). Drives \code{ce\_n/oe\_n/we\_n/lb\_n/ub\_n/zz\_n} and the tri-state data bus. \\ +\rowa \code{mem\_arbiter} & Fixed-priority arbiter (B$>$C$>$A) among three byte-level masters: \code{spi\_engine} (A), \code{neuron\_memory} (B), \code{layer\_sequencer} (C). \\ +\code{spi\_slave} & SPI Mode 0 physical layer, MSB-first, 3-stage CDC synchronizer on SCLK/MOSI/CS\_N, shift register and CS framing. \\ +\rowa \code{spi\_engine} & Protocol/opcode FSM and register bank (\code{x\_base}, \code{w\_base}, \code{bias\_addr}, ping-pong base, activation, runtime widths\ldots), with sticky/clear-on-read \code{STATUS.done}. \\ +\code{spi\_neuron\_top} & Top-level: connects SPI, arbiter, sequencer, \code{neuron\_memory} and the PSRAM chain; multiplexes control of \code{neuron\_memory} between the sequencer and the direct single-layer path. \\ +\bottomrule +\end{tabularx} + +\vspace{6pt} +\begin{fnnote}[Simulation models] +\code{psram\_model.v} (in \code{sim/}) and \code{memory\_model.v} are behavioral memory +models used in the testbenches; they are not part of the synthesizable design but they +reproduce the real latency for end-to-end verification. +\end{fnnote} + +\section{Two execution paths} +The top-level exposes two mutually exclusive modes toward the same \code{neuron\_memory} +compute engine: +\begin{itemize} +\item \textbf{Single-layer / manual path}: the host sets the bases with +\op{SET\_BASE}, starts with \op{START} and reads with \op{READ\_OUTPUT}. +\code{spi\_engine} drives \code{neuron\_memory} directly. +\item \textbf{Multi-layer path}: the host writes the descriptor table and starts with +\op{RUN\_NETWORK}; \code{layer\_sequencer} takes over control of \code{neuron\_memory} +(while \code{seq\_busy} is high) and chains the layers. +\end{itemize} +The top-level multiplexer switches the control lines of \code{neuron\_memory} based on +\code{seq\_busy}, returning the engine to the direct path at the end of the sequence. diff --git a/hardware/v1/docs/DatasheetLatex/chapters/03-datapath.aux b/hardware/v1/docs/DatasheetLatex/chapters/03-datapath.aux new file mode 100644 index 0000000..a2409fe --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/03-datapath.aux @@ -0,0 +1,63 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Compute datapath}{6}{chapter.3}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:datapath}{{3}{6}{Compute datapath}{chapter.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3.1}INT8/INT32 arithmetic chain}{6}{section.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.2}\texttt {mac\_unit} --- multiply-accumulator}{6}{section.3.2}\protected@file@percent } +\newlabel{lst:macunit}{{3.1}{6}{\texttt {rtl/mac\_unit.v} --- arithmetic core}{lstlisting.3.1}{}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {3.1}{\ignorespaces \texttt {rtl/mac\_unit.v} --- arithmetic core}}{6}{lstlisting.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.3}\texttt {mac8} --- parallel MAC and balanced adder tree}{6}{section.3.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.4}\texttt {neuron\_parallel} --- neuron FSM}{7}{section.3.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4.1}Parameter guard (elaboration-time)}{7}{subsection.3.4.1}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {3.2}{\ignorespaces \texttt {rtl/neuron\_parallel.v} --- parameter guard}}{7}{lstlisting.3.2}\protected@file@percent } +\gdef \LT@iv {\LT@entry + {1}{85.97733pt}\LT@entry + {1}{51.83368pt}\LT@entry + {1}{334.50494pt}} +\@writefile{toc}{\contentsline {section}{\numberline {3.5}Activation functions}{8}{section.3.5}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.6}INT8 saturation}{8}{section.3.6}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {3.7}\texttt {layer} --- neurons in parallel}{8}{section.3.7}\protected@file@percent } +\@setckpt{chapters/03-datapath}{ +\setcounter{page}{9} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{3} +\setcounter{section}{7} +\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}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{9} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{7} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{19} +\setcounter{lstlisting}{2} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/03-datapath.tex b/hardware/v1/docs/DatasheetLatex/chapters/03-datapath.tex new file mode 100644 index 0000000..a9d1bbe --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/03-datapath.tex @@ -0,0 +1,166 @@ +\chapter{Compute datapath} +\label{ch:datapath} + +\section{INT8/INT32 arithmetic chain} +The elementary datapath implements the typical sequence of a quantized neuron: +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=3mm,start chain=going right, + every node/.style={fnblock,minimum width=15mm,minimum height=8mm,on chain}] + \node[fnblockT]{INT8\\$\times$\,INT8}; + \node{INT16\\product}; + \node{sign-ext\\INT32}; + \node[fnblockD]{accumulate\\INT32}; + \node{$+$ bias}; + \node[fnblockA]{activation}; + \node[fnblockT]{sat. INT8}; + \foreach \i [count=\j from 2] in {1,...,6} + \draw[fnarrow] (chain-\i) -- (chain-\j); +\end{tikzpicture} +\end{center} +Each INT8$\times$INT8 product fits in 16~bits; it is sign-extended to 32~bits before +accumulation, so the accumulator does not overflow on long vectors. Bias and activation +operate at 32~bits; only the final output is saturated to INT8. + +\section{\texttt{mac\_unit} --- multiply-accumulator} +The \code{mac\_unit} module is purely combinational and parametric on \code{DATA\_WIDTH} +and \code{ACC\_WIDTH}. It computes: +\[ +\mathrm{acc\_out} = \mathrm{acc\_in} + \mathrm{signext}_{ACC}(x \cdot w) +\] +The product has width $2\times$\code{DATA\_WIDTH} and is sign-extended by replicating +the most significant bit. On ECP5 the multiplication maps onto a \code{MULT18X18D} DSP +block. + +\begin{lstlisting}[caption={\texttt{rtl/mac\_unit.v} --- arithmetic core},label={lst:macunit}] +localparam PROD_WIDTH = 2 * DATA_WIDTH; +wire signed [PROD_WIDTH-1:0] product = x * w; +wire signed [ACC_WIDTH-1:0] product_ext = + {{(ACC_WIDTH-PROD_WIDTH){product[PROD_WIDTH-1]}}, product}; +assign acc_out = acc_in + product_ext; +\end{lstlisting} + +\section{\texttt{mac8} --- parallel MAC and balanced adder tree} +\code{mac8} instantiates \code{PARALLEL} \code{mac\_unit} units that generate +\code{PARALLEL} independent products, then sums them with a \emph{balanced binary +adder tree}. Compared to the linear reduction +$((((p_0{+}p_1){+}p_2){+}p_3){+}\dots)$, of depth $O(\text{PARALLEL})$, the tree has +depth $O(\log_2 \text{PARALLEL})$, drastically reducing the combinational path. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,level distance=11mm, + every node/.style={fnreg,minimum width=8mm}, + level 1/.style={sibling distance=30mm}, + level 2/.style={sibling distance=15mm}, + level 3/.style={sibling distance=8mm}, + edge from parent/.style={fnarrowT,draw}] + \node[fnblockD]{sum} + child {node[fnblockT]{$+$} + child {node[fnblockT]{$+$} + child {node{$p_0$}} child {node{$p_1$}}} + child {node[fnblockT]{$+$} + child {node{$p_2$}} child {node{$p_3$}}}} + child {node[fnblockT]{$+$} + child {node[fnblockT]{$+$} + child {node{$p_4$}} child {node{$p_5$}}} + child {node[fnblockT]{$+$} + child {node{$p_6$}} child {node{$p_7$}}}}; +\end{tikzpicture} +\end{center} +\begin{center}\footnotesize\itshape\color{fnGrey} +Example with PARALLEL=8: 3 levels. PARALLEL=16 $\to$ 4 levels; PARALLEL=32 $\to$ 5 +levels.\end{center} + +\begin{fnnote}[PARALLEL as a power of two] +The tree is designed for \code{PARALLEL} as a power of two (8, 16, 32\ldots). This is +also the value used in all project configurations. +\end{fnnote} + +\section{\texttt{neuron\_parallel} --- neuron FSM} +\code{neuron\_parallel} processes \code{N\_INPUTS} inputs in groups of \code{PARALLEL}, +maintaining the accumulator from one group to the next. At the end it adds the bias, +applies the activation and saturates to INT8. The number of groups is +$\text{GROUPS}=\text{N\_INPUTS}/\text{PARALLEL}$. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=4mm,start chain=going below, + every node/.style={on chain,fnblock,minimum width=46mm}] + \node[fnblockA]{\code{start}}; + \node{group 0 $\to$ accumulate}; + \node{group 1 $\to$ accumulate}; + \node[draw=none,fill=none]{\vdots}; + \node{group GROUPS$-$1 $\to$ accumulate}; + \node{$+$ bias}; + \node[fnblockA]{activation (ACT\_RELU / ACT\_NONE)}; + \node[fnblockT]{INT8 saturation}; + \node[fnblockD]{\code{done}, \code{y}}; + \foreach \i [count=\j from 2] in {1,...,8} + \draw[fnarrow] (chain-\i) -- (chain-\j); +\end{tikzpicture} +\end{center} + +\subsection{Parameter guard (elaboration-time)} +If \code{PARALLEL} does not exactly divide \code{N\_INPUTS} two failures occur, both +confirmed empirically in \code{sim/parameter\_sweep\_tb.v}: +\begin{itemize} +\item integer division truncates \code{GROUPS} and the excess inputs are never read +$\to$ \textbf{wrong} result, with no error and no warning; +\item if \code{PARALLEL > N\_INPUTS}, \code{GROUPS=0} and the terminal condition is +never satisfied $\to$ the neuron \textbf{hangs} (busy high, done never asserted). +\end{itemize} +The solution does not modify the validated datapath: a \code{generate} block +instantiates a deliberately undefined module when +$\text{N\_INPUTS} \bmod \text{PARALLEL}\neq0$, forcing an error at \emph{elaboration} +both in simulation and in synthesis. For valid configurations the branch is never +elaborated. + +\begin{lstlisting}[caption={\texttt{rtl/neuron\_parallel.v} --- parameter guard}] +generate + if (N_INPUTS == 0 || N_INPUTS % PARALLEL != 0) begin : PARAMETER_ERROR + neuron_parallel_requires_N_INPUTS_multiple_of_PARALLEL + invalid_parameter_combination(); + end +endgenerate +\end{lstlisting} + +\begin{fnnote}[Edge case \texttt{N\_INPUTS=0} (fixed 2026-09-04)] +The original condition (\code{N\_INPUTS \% PARALLEL != 0}) does not catch +\code{N\_INPUTS=0}, since $0 \bmod \text{PARALLEL}=0$ for any \code{PARALLEL}: the module +elaborated successfully (both in simulation and in real Yosys synthesis) while leaving +\code{x\_bus}/\code{w\_bus} undriven and \code{start} silently ineffective. Found during +the re-certification campaign (\code{docs/validation/bugs.md}, BUG-002) and fixed by +extending the guard as above --- \code{N\_INPUTS=0} now fails elaboration exactly like the +other degenerate cases. +\end{fnnote} + +\section{Activation functions} +\code{neuron\_parallel} accepts a 2-bit \code{activation} port. The default is +\code{ACT\_RELU}, the only behavior that existed before the port was introduced, so +every pre-existing caller remains unchanged. + +\begin{tabularx}{\textwidth}{L{2.6cm} C{1.4cm} Y} +\toprule +\rowh \thd{Encoding} & \thd{Value} & \thd{Behavior} \\ +\midrule +\code{ACT\_NONE} & \code{2'd0} & Linear: no clamp to zero, bilateral saturation to the INT8 range $[-128,+127]$. \\ +\rowa \code{ACT\_RELU} & \code{2'd1} & $\max(0,x)$, then positive saturation to $+127$ (default; also the fallback for reserved encodings). \\ +\bottomrule +\end{tabularx} + +\section{INT8 saturation} +After bias and activation, the 32-bit accumulator is reduced to INT8: +\[ +y=\begin{cases} ++127 & \text{if } \mathrm{final\_acc} > 127\\ +-128 & \text{if } \mathrm{final\_acc} < -128 \ \text{(ACT\_NONE only)}\\ +0 & \text{if } \mathrm{final\_acc}\le 0 \ \text{(ACT\_RELU only)}\\ +\mathrm{final\_acc}[7:0] & \text{otherwise} +\end{cases} +\] + +\section{\texttt{layer} --- neurons in parallel} +\code{layer} instantiates \code{N\_NEURONS} neurons that share the input vector +\code{x\_bus} but have distinct weights and bias; \code{busy} is the OR and \code{done} +the AND of the neurons' signals. It is the module used in the datapath benchmarks +(ch.~\ref{ch:impl}), where all neurons work simultaneously. The addressing convention +is neuron-major: the weights of neuron $n$ occupy +\code{weights\_bus[n*N\_INPUTS*DATA\_WIDTH +: N\_INPUTS*DATA\_WIDTH]}. diff --git a/hardware/v1/docs/DatasheetLatex/chapters/04-parametri.aux b/hardware/v1/docs/DatasheetLatex/chapters/04-parametri.aux new file mode 100644 index 0000000..eee9a46 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/04-parametri.aux @@ -0,0 +1,66 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@v {\LT@entry + {1}{97.35826pt}\LT@entry + {1}{63.21504pt}\LT@entry + {1}{311.74265pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {4}Parameters and configurability}{9}{chapter.4}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:param}{{4}{9}{Parameters and configurability}{chapter.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4.1}Build parameters (synthesis-time)}{9}{section.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.2}Runtime network width}{9}{section.4.2}\protected@file@percent } +\gdef \LT@vi {\LT@entry + {1}{168.49014pt}\LT@entry + {1}{97.35826pt}\LT@entry + {1}{206.46754pt}} +\gdef \LT@vii {\LT@entry + {1}{68.9055pt}\LT@entry + {1}{68.9055pt}\LT@entry + {1}{68.9055pt}\LT@entry + {1}{265.59944pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2.1}Measured savings}{10}{subsection.4.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.3}Characterized configurations}{10}{section.4.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {4.4}Build versus runtime summary}{10}{section.4.4}\protected@file@percent } +\@setckpt{chapters/04-parametri}{ +\setcounter{page}{11} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{4} +\setcounter{section}{4} +\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}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{13} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{7} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{25} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/04-parametri.tex b/hardware/v1/docs/DatasheetLatex/chapters/04-parametri.tex new file mode 100644 index 0000000..781f930 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/04-parametri.tex @@ -0,0 +1,88 @@ +\chapter{Parameters and configurability} +\label{ch:param} + +\section{Build parameters (synthesis-time)} +The hardware architecture is fixed at synthesis through the following Verilog +parameters. They determine the datapath contained in the bitstream and its capacity +\emph{ceiling}. + +\begin{tabularx}{\textwidth}{L{3.0cm} C{1.8cm} Y} +\toprule +\rowh \thd{Parameter} & \thd{Default} & \thd{Meaning} \\ +\midrule +\code{DATA\_WIDTH} & 8 & Data width (INT8). \\ +\rowa \code{ACC\_WIDTH} & 32 & Accumulator width (INT32). \\ +\code{N\_INPUTS} & 32 / 256 & Maximum number of inputs per neuron (benchmark baseline: 256). \\ +\rowa \code{N\_NEURONS} & 1 / 4 & Maximum number of neurons per layer. \\ +\code{PARALLEL} & 8 & Simultaneous hardware MACs per neuron; must divide \code{N\_INPUTS} and should be a power of two. \\ +\rowa \code{N\_LAYERS} & 4 & Maximum number of layers chainable by \code{layer\_sequencer}. \\ +\code{ADDR\_WIDTH} & 23 & Byte-address width (8~MB). \\ +\rowa \code{MEM\_DATA\_WIDTH} & 16 & Width of the physical PSRAM data bus. \\ +\code{CLK\_FREQ\_MHZ} & 80 & Frequency used in the PSRAM timing formulas (must be aligned to the real oscillator). \\ +\bottomrule +\end{tabularx} + +\begin{fnwarn}[\texttt{N\_INPUTS} \% \texttt{PARALLEL} constraint] +\code{PARALLEL} must divide \code{N\_INPUTS} exactly, otherwise the elaboration guard +fires (§\ref{ch:datapath}). The same constraint applies at runtime to +\code{n\_inputs\_real}. +\end{fnwarn} + +\section{Runtime network width} +A single bitstream serves any topology \emph{up to} the build maximum. The actual width +of each execution is a separate value, set by the host: +\begin{itemize} +\item \code{n\_inputs\_real} --- inputs actually used in this execution (must be a +multiple of \code{PARALLEL}); +\item \code{n\_neurons\_real} --- neurons actually computed in this execution. +\end{itemize} +Both default to the build maximum, so any caller that leaves them unconnected processes +the full width as before the ports were introduced. + +\begin{fnnote}[Real early termination] +This is not mere address bookkeeping: the two values directly bound the hardware loops +(X/W reads of \code{neuron\_memory}, MAC group count of \code{neuron\_parallel} and the +length of the ping-pong copy for \code{RUN\_NETWORK}). A narrower layer actually +\emph{computes} and \emph{copies} faster and does not require zero-padding of the RAM +for the unused tail: data beyond \code{n\_inputs\_real}/\code{n\_neurons\_real} is never +read. +\end{fnnote} + +This lets a network taper within a single chained execution, for example +$256\to64\to16\to4$, with each layer declaring its own actual width in the descriptor +table (ch.~\ref{ch:seq}). + +\subsection{Measured savings} +Early termination was measured end-to-end: +\begin{tabularx}{\textwidth}{L{5.5cm} C{3.0cm} Y} +\toprule +\rowh \thd{Test} & \thd{Cycles} & \thd{Comparison} \\ +\midrule +\code{neuron\_parallel\_tb.v} (T7) & 3 vs 6 & reduced vs full, with ``garbage'' data in the skipped lanes (proof that they are not read). \\ +\rowa \code{neuron\_memory\_tb.v} (T5) & 209 vs 788 & 8-of-32 vs full 32, through the real PSRAM stack. \\ +\bottomrule +\end{tabularx} + +\section{Characterized configurations} +Some combinations validated in simulation and/or synthesis: +\begin{tabularx}{\textwidth}{C{2.0cm} C{2.0cm} C{2.0cm} Y} +\toprule +\rowh \thd{N\_INPUTS} & \thd{N\_NEURONS} & \thd{PARALLEL} & \thd{Notes} \\ +\midrule +32 & 4 & 8 & First functional parametric test (Phase~1). \\ +\rowa 256 & 4 & 2/4/8/16 & Datapath benchmark sweep (Phase~7). \\ +32 & 1..3 & 8 & Single/multi-neuron memory integration (Phase~3). \\ +\rowa 4 & 4 & 2 & End-to-end 2-layer \code{RUN\_NETWORK} test over real SPI. \\ +\bottomrule +\end{tabularx} + +\section{Build versus runtime summary} +\begin{center} +\begin{tikzpicture}[font=\footnotesize,node distance=6mm] + \node[fnblockD,minimum width=54mm,minimum height=15mm](b){\textbf{BUILD (synthesis)}\\[2pt] + {\scriptsize N\_INPUTS, N\_NEURONS, N\_LAYERS,}\\{\scriptsize PARALLEL, DATA\_WIDTH, ACC\_WIDTH}\\{\scriptsize $\Rightarrow$ machine ceiling}}; + \node[fnblockT,right=16mm of b,minimum width=54mm,minimum height=15mm](r){\textbf{RUNTIME (host, SPI)}\\[2pt] + {\scriptsize n\_inputs\_real, n\_neurons\_real,}\\{\scriptsize activation, num\_layers, weights/bias}\\{\scriptsize $\Rightarrow$ actual network}}; + \draw[fnbus] (b) -- node[fnlbl,above]{$\le$} (r); +\end{tikzpicture} +\end{center} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/05-memoria.aux b/hardware/v1/docs/DatasheetLatex/chapters/05-memoria.aux new file mode 100644 index 0000000..30e50c8 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/05-memoria.aux @@ -0,0 +1,68 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\@writefile{toc}{\contentsline {chapter}{\numberline {5}Memory subsystem}{11}{chapter.5}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:mem}{{5}{11}{Memory subsystem}{chapter.5}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5.1}Memory chain}{11}{section.5.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.2}\texttt {int8\_memory\_access} --- byte/word conversion}{11}{section.5.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.3}\texttt {memory\_interface} --- handshake}{11}{section.5.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.4}\texttt {psram\_controller} --- physical bus}{11}{section.5.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {5.4.1}Timing}{12}{subsection.5.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.5}Read page mode}{12}{section.5.5}\protected@file@percent } +\newlabel{sec:pagemode}{{5.5}{12}{Read page mode}{section.5.5}{}} +\gdef \LT@viii {\LT@entry + {1}{103.04872pt}\LT@entry + {1}{108.73918pt}\LT@entry + {1}{260.52805pt}} +\gdef \LT@ix {\LT@entry + {1}{159.95424pt}\LT@entry + {1}{104.12057pt}\LT@entry + {1}{104.12057pt}\LT@entry + {1}{104.12057pt}} +\@writefile{toc}{\contentsline {section}{\numberline {5.6}Address map and conventions}{13}{section.5.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {5.6.1}PSRAM physical addressing}{13}{subsection.5.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.7}Bandwidth}{13}{section.5.7}\protected@file@percent } +\newlabel{sec:bandwidth}{{5.7}{13}{Bandwidth}{section.5.7}{}} +\@setckpt{chapters/05-memoria}{ +\setcounter{page}{15} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{5} +\setcounter{section}{7} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{2} +\setcounter{LT@tables}{9} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{19} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{7} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{35} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/05-memoria.tex b/hardware/v1/docs/DatasheetLatex/chapters/05-memoria.tex new file mode 100644 index 0000000..a764d56 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/05-memoria.tex @@ -0,0 +1,187 @@ +\chapter{Memory subsystem} +\label{ch:mem} + +\section{Memory chain} +The compute engine works with addresses and data at the \emph{byte} level (INT8), while +the PSRAM is a 16-bit word device. Three cascaded modules realize the conversion and +the physical access: + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=8mm] + \node[fnblockD,minimum width=30mm,minimum height=12mm](nm){byte-level master\\{\scriptsize \code{neuron\_memory} / \code{spi\_engine} / \code{layer\_sequencer}}}; + \node[fnblockT,right=10mm of nm,minimum width=28mm,minimum height=12mm](ia){\code{int8\_memory\_access}\\{\scriptsize byte $\leftrightarrow$ 16-bit word}}; + \node[fnblock,right=10mm of ia,minimum width=26mm,minimum height=12mm](mi){\code{memory\_interface}\\{\scriptsize IDLE/WAIT FSM}}; + \node[fnblockA,below=9mm of mi,minimum width=26mm,minimum height=12mm](pc){\code{psram\_controller}\\{\scriptsize async 70\,ns physical bus}}; + \node[fnblock,left=10mm of pc,minimum width=26mm,minimum height=12mm](ps){PSRAM\\{\scriptsize 8\,MB 4M$\times$16}}; + \draw[fnbus] (nm)--node[fnlbl,above]{req/wr/addr}(ia); + \draw[fnbus] (ia)--node[fnlbl,above]{16-bit}(mi); + \draw[fnbus] (mi)--(pc); + \draw[fnbus] (pc)--node[fnlbl,above]{DQ/A/ctrl}(ps); +\end{tikzpicture} +\end{center} + +\section{\texttt{int8\_memory\_access} --- byte/word conversion} +Converts the INT8 interface (byte address) into the word interface. The byte address is +divided by two (\code{addr>>1}) to obtain the word address; the least significant bit +selects the byte: +\begin{itemize} +\item \code{addr[0]=0} $\to$ low byte: \code{lb\_n=0}, \code{ub\_n=1}, data on DQ[7:0]; +\item \code{addr[0]=1} $\to$ high byte: \code{lb\_n=1}, \code{ub\_n=0}, data on DQ[15:8]. +\end{itemize} +On read it extracts the correct byte from \code{mem\_rdata}. The FSM has two states +(IDLE, WAIT) and returns \code{ready} as a one-cycle pulse. + +\section{\texttt{memory\_interface} --- handshake} +Two-state FSM that serializes a single transaction: in IDLE, on the \code{req} request, +it latches \code{wr/addr/wdata/lb\_n/ub\_n} and emits a one-cycle \code{mem\_req} pulse +toward the controller; in WAIT it waits for \code{mem\_ready}, captures \code{rdata} on +read and asserts \code{ready}. It guarantees the ``one transaction at a time'' contract. + +\section{\texttt{psram\_controller} --- physical bus} +Asynchronous parallel PSRAM bus controller, with support for the chip's read +\textbf{page mode} (\S~\ref{sec:pagemode}). The main state machine is: + +\begin{center} +\begin{tikzpicture}[font=\scriptsize] + \node[fnstate](init) at (0,0){INIT}; + \node[fnstate](idle) at (3.2,0){IDLE}; + \node[fnstate](read) at (7,2.7){READ}; + \node[fnstate](popen) at (11,2.7){PAGE\\OPEN}; + \node[fnstate](write) at (7,-2.7){WRITE}; + \node[fnstate](ww) at (11,-2.7){WRITE\\WAIT}; + \draw[fnarrow] (init)--node[fnlbl,above]{INIT\_CYCLES + CR load}(idle); + \draw[fnarrow] (idle)--node[fnlbl,above,sloped]{req \& !wr}(read); + \draw[fnarrow] (idle)--node[fnlbl,below,sloped]{req \& wr}(write); + \draw[fnarrow] (read)--node[fnlbl,above]{ready}(popen); + \draw[fnarrowT] (popen) to[bend left=25] node[fnlbl,below]{req \& !wr}(read); + \draw[fnarrow] (popen) to[bend right=20] node[fnlbl,above,sloped]{req \& wr}(write); + \draw[fnarrow] (popen) to[out=-100,in=15,looseness=1.15] node[fnlbl,pos=0.55]{tCEM timeout}(idle); + \draw[fnarrow] (write)--node[fnlbl,above]{ACCESS\_CYCLES}(ww); + \draw[fnarrow] (ww) to[out=160,in=-70] node[fnlbl,pos=0.5,left]{ready}(idle); +\end{tikzpicture} +\end{center} + +From INIT the controller automatically goes through a configuration-register load +sub-sequence (\code{STATE\_CR\_INIT}, 4 steps) before reaching IDLE for the first +time --- see \S~\ref{sec:pagemode}. The PAGE~OPEN~$\to$~WRITE transition +(bottom-right arrow) internally passes through two transit micro-states, +\code{STATE\_PAGE\_CLOSE} and \code{STATE\_PAGE\_REOPEN} (one cycle each): the +first forces CE\#/OE\# high for at least one cycle before the controller starts +driving the data bus, avoiding contention with the PSRAM's still-active output +($\geq t_{HZ}$); the second restarts the already-latched transaction exactly as +IDLE would. They are not drawn as separate nodes to keep the figure readable. + +\subsection{Timing} +\begin{fnspec}[Timing formulas] +$\text{ACCESS\_CYCLES}=\lceil (70\times \text{CLK\_FREQ\_MHZ})/1000\rceil$ \quad +(random-access latency, $t_{AA}$/$t_{RC}$ = 70~ns)\\[3pt] +$\text{PAGE\_CYCLES}=\lceil (20\times \text{CLK\_FREQ\_MHZ})/1000\rceil$ \quad +(same-page continuation, $t_{APA}$/$t_{PC}$ = 20~ns)\\[3pt] +$\text{INIT\_CYCLES}=150\times \text{CLK\_FREQ\_MHZ}$ \quad +(power-up initialization, $t_{PU}$ = 150~\textmu s)\\[3pt] +$\text{PAGE\_TIMEOUT\_CYCLES}=\lceil (6000\times \text{CLK\_FREQ\_MHZ})/1000\rceil$ \quad +(automatic page close, safety margin under $t_{CEM}$ = 8~\textmu s) +\end{fnspec} +The data bus is tri-state driven: \code{psram\_dq = dq\_oe ? dq\_out : Z}. On read +\code{dq\_oe=0}; on write \code{dq\_oe=1} during the \code{we\_n} pulse. A WRITE\_WAIT +state keeps \code{ce\_n/lb\_n/ub\_n} active for the final hold before release. + +\begin{fnwarn}[This is not QSPI] +This is a classic asynchronous-SRAM interface, \textbf{not} QSPI: most commercial +serial/QSPI ``PSRAM'' parts are not compatible with this controller without a rewrite. +See ch.~\ref{ch:hw} for the recommended part (parallel ISSI). +\end{fnwarn} + +\section{Read page mode} +\label{sec:pagemode} +The recommended chip (ch.~\ref{ch:hw}) is ``asynchronous/\textbf{page mode}'': once +an initial random access at $t_{AA}$~=~70~ns has been done, further reads inside the +same 16-word page (address bits above \code{A[3]} unchanged) only cost +$t_{APA}$/$t_{PC}$~=~20~ns, because CE\#/OE\# stay asserted and only the address bus +changes. Page mode is \textbf{disabled by default} at power-up (bit~7 of the +configuration register, CR~=~\texttt{0x0070} by default) and must be explicitly +enabled. + +\begin{itemize} +\item \textbf{Enable at boot}: right after INIT, the controller runs the + datasheet's ``software-access sequence'' (2 dummy reads + 2 writes, \texttt{0x0000} + unlock then real CR \texttt{0x00F0} = default with the Page bit set) at the + chip's highest address --- it reuses exactly the same READ/WRITE logic as every + other transaction, so it goes through the same timing checks. +\item \textbf{Page bursts}: after a READ the controller no longer closes CE\#/OE\# + (PAGE~OPEN state). A following read in the same page only waits PAGE\_CYCLES; a + read crossing into a different page still avoids a CE\# toggle but pays a full + ACCESS\_CYCLES for that one word (any change at \code{A[4]} or above requires a + new $t_{AA}$). A counter closes the page before the $t_{CEM}$ limit with a + safety margin. +\item \textbf{Only a WRITE closes the page.} Changes to \code{lb\_n}/\code{ub\_n} + do \emph{not} close it: \code{int8\_memory\_access} alternates these signals on + nearly every access (byte-granular access over the 16-bit bus), so treating them + as a close condition --- the first implementation attempt --- made the real + workload \emph{slower}, not faster (measured: 53.25$\to$61.25 cycles/edge on + \code{graph\_engine}'s gather); removed, corrected to 53.25$\to$37.53 + cycles/edge (bandwidth +42\%, \S~\ref{sec:bandwidth}). +\end{itemize} + +\begin{fnwarn}[No benefit without a sequential pattern] +Page mode only speeds up accesses that stay in the same page (or nearly) while the +controller is waiting for a new request with the page still open. Isolated, +scattered accesses (a random address every time) still pay a full ACCESS\_CYCLES, +plus a small close/reopen overhead if preceded by a WRITE or a $t_{CEM}$ timeout: +it is not a universal win, it depends on the caller's access pattern. +\end{fnwarn} + +Real Fmax (\code{nextpnr-ecp5}, ch.~\ref{ch:impl}) on the integrated +\code{spi\_neuron\_top} system with Type~\#2 enabled: \textbf{75.73~MHz} at +\code{PARALLEL}=2 (was 55.59~MHz before page mode was added) and +\textbf{65.13~MHz} at \code{PARALLEL}=8, both still FAIL against the 80~MHz +target but not regressed. The critical path stays, in both cases, entirely +inside \code{u\_graph\_engine.u\_neuron} (the \code{mac8}/\code{neuron\_parallel} +accumulate chain, ch.~\ref{ch:impl}) --- \code{psram\_controller} never appears +in the critical path despite page mode's resource growth. + +\section{Address map and conventions} +The addressing space is \code{ADDR\_WIDTH}=23~bits (\emph{byte} address), for a full +8~MB. The regions do not have hardwired addresses: their bases are registers set by the +host via \op{SET\_BASE} (single-layer path) or read from the descriptor table +(multi-layer path). + +\begin{tabularx}{\textwidth}{L{3.2cm} L{3.4cm} Y} +\toprule +\rowh \thd{Region} & \thd{Base} & \thd{Content / convention} \\ +\midrule +Input $X$ & \code{x\_base} & Shared input vector, read once per invocation. \\ +\rowa Weights $W$ & \code{w\_base} & Neuron-major: weights of neuron $n$ at \code{w\_base + n*N\_INPUTS} bytes. \\ +Bias & \code{bias\_addr} & One byte per neuron: bias of neuron $n$ at \code{bias\_addr + n}. \\ +\rowa Descriptor table & \code{table\_base} & \code{N\_LAYERS} 11-byte entries (ch.~\ref{ch:seq}). \\ +Ping-pong buffers A/B & \code{buf\_a\_base} / \code{buf\_b\_base} & Intermediate outputs between layers. \\ +\bottomrule +\end{tabularx} + +\subsection{PSRAM physical addressing} +The recommended PSRAM is 4M$\times$16 (8~MB), which requires a 22-bit word address +(A0--A21). \code{int8\_memory\_access} computes \code{addr>>1}, turning the 23-bit byte +address into a 22-bit word address that maps exactly onto A0--A21; bit~22 of +\code{psram\_a} is therefore always 0 and 22 real address lines remain on the PCB. + +\section{Bandwidth} +\label{sec:bandwidth} +Measured on \code{graph\_engine}'s edge-list gather (ch.~\ref{ch:grafo}), by +difference between two graph sizes to isolate the per-edge cost from the fixed +per-neuron overhead (\code{sim/graph\_engine\_bandwidth\_tb.v}): + +\begin{tabularx}{\textwidth}{L{5.2cm} Y Y Y} +\toprule +\rowh \thd{} & \thd{Before (no page mode)} & \thd{After (page mode)} & \thd{$\Delta$} \\ +\midrule +Cycles/edge & 53.25 & 37.53 & $-29.5\%$ \\ +\rowa Bandwidth @80\,MHz & 6.01\,MB/s & 8.53\,MB/s & $+41.9\%$ \\ +Bandwidth @16\,MHz\textsuperscript{*} & 1.20\,MB/s & 1.71\,MB/s & $+41.9\%$ \\ +\bottomrule +\end{tabularx} +\textsuperscript{*}recommended real oscillator (ch.~\ref{ch:hw}). + +The model still remains memory-bound by construction: \code{neuron\_memory} reads +$X$ once and re-reads $W$/bias for each neuron (ch.~\ref{ch:seq}), one neuron at a +time; page mode reduces the per-byte cost of a sequential access, it does not +eliminate the access pattern itself. diff --git a/hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.aux b/hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.aux new file mode 100644 index 0000000..540f7d1 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.aux @@ -0,0 +1,57 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\@writefile{toc}{\contentsline {chapter}{\numberline {6}Memory, multi-neuron and multi-layer}{15}{chapter.6}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:seq}{{6}{15}{Memory, multi-neuron and multi-layer}{chapter.6}{}} +\@writefile{toc}{\contentsline {section}{\numberline {6.1}\texttt {neuron\_memory} --- memory/neuron bridge}{15}{section.6.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {6.2}\texttt {layer\_sequencer} --- multi-layer network}{15}{section.6.2}\protected@file@percent } +\gdef \LT@x {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{57.52458pt}\LT@entry + {1}{306.05219pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.1}Ping-pong buffers}{16}{subsection.6.2.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2.2}Descriptor table}{16}{subsection.6.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {6.3}Hierarchy of the \texttt {busy}/\texttt {done} signals}{16}{section.6.3}\protected@file@percent } +\@setckpt{chapters/06-sequencer}{ +\setcounter{page}{17} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\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}{10} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{21} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{7} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{41} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.tex b/hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.tex new file mode 100644 index 0000000..a162a48 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/06-sequencer.tex @@ -0,0 +1,111 @@ +\chapter[Memory, multi-neuron and multi-layer]{Memory integration, multi-neuron and multi-layer} +\label{ch:seq} + +\section{\texttt{neuron\_memory} --- memory/neuron bridge} +\code{neuron\_memory} connects the compute datapath to memory and manages the loop over +the neurons. It reads the $X$ vector only once (shared input), then for each neuron +re-reads $W$ and bias from RAM and feeds them to a single reused instance of +\code{neuron\_parallel}: the design is memory-bound, one neuron computed at a time, +without duplicating the datapath. The output is \code{y\_bus}, packed neuron-major +(\code{DATA\_WIDTH*N\_NEURONS} bits). + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=13mm] + \node[fnstate](idle){IDLE}; + \node[fnstate,right=of idle](rx){READ\_X}; + \node[fnstate,right=of rx](rw){READ\_W}; + \node[fnstate,below=10mm of rw](rb){READ\_BIAS}; + \node[fnstate,left=of rb](sn){START\_N}; + \node[fnstate,left=of sn](wn){WAIT\_N}; + \draw[fnarrow] (idle)--node[fnlbl,above]{start}(rx); + \draw[fnarrow] (rx)--node[fnlbl,above]{X read}(rw); + \draw[fnarrow] (rw)--(rb); + \draw[fnarrow] (rb)--(sn); + \draw[fnarrow] (sn)--(wn); + \draw[fnarrow] (wn) to[bend left=18] node[fnlbl,above]{next neuron}(rw); + \draw[fnarrow] (wn) to[bend right=28] node[fnlbl,below]{last neuron: done}(idle); +\end{tikzpicture} +\end{center} + +The states are IDLE, READ\_X, READ\_W, READ\_BIAS, START\_N, WAIT\_N. After the last +neuron the FSM returns to IDLE and asserts \code{done}. The count of neurons and inputs +actually processed is given by \code{n\_neurons\_real}/\code{n\_inputs\_real} +(ch.~\ref{ch:param}). + +\section{\texttt{layer\_sequencer} --- multi-layer network} +\code{layer\_sequencer} chains up to \code{N\_LAYERS} executions of the same +\code{neuron\_memory} instance, realizing a dense feed-forward network \emph{without} +touching the validated compute core. It reads a descriptor table written by the host and +alternates the two output buffers in RAM (ping-pong). + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=13mm] + \node[fnstate](i){IDLE}; + \node[fnstate,right=of i](rd){READ\\DESC}; + \node[fnstate,right=of rd](rw){READ\\WAIT}; + \node[fnstate,below=10mm of rw](sl){START\\LAYER}; + \node[fnstate,left=of sl](wl){WAIT\\LAYER}; + \node[fnstate,left=of wl](ci){COPY\\ISSUE}; + \node[fnstate,below=9mm of ci](cw){COPY\\WAIT}; + \draw[fnarrow] (i)--node[fnlbl,above]{run\_start}(rd); + \draw[fnarrow] (rd)--(rw); + \draw[fnarrow] (rw)--(sl); + \draw[fnarrow] (sl)--(wl); + \draw[fnarrow] (wl)--(ci); + \draw[fnarrow] (ci)--(cw); + \draw[fnarrow] (cw) to[bend left=15] node[fnlbl,left]{next layer}(rd); + \draw[fnarrow] (cw) to[bend right=12] node[fnlbl,below]{last: seq\_done}(i); +\end{tikzpicture} +\end{center} + +\subsection{Ping-pong buffers} +Layer~0 reads the external input \code{x\_base}. Layer $k>0$ reads from the buffer +written by layer $k-1$; the output of each layer is copied into the other buffer, +alternating A and B. The final output remains both in \code{y\_bus} (readable with +\op{READ\_OUTPUT}) and in the ping-pong buffer into which it was copied. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=7mm] + \node[fnblockA,minimum width=18mm](x){X\\\code{x\_base}}; + \node[fnblockD,right=10mm of x,minimum width=20mm](l0){Layer 0}; + \node[fnblock,right=10mm of l0,minimum width=18mm](ba){buf A}; + \node[fnblockD,right=10mm of ba,minimum width=20mm](l1){Layer 1}; + \node[fnblock,right=10mm of l1,minimum width=18mm](bb){buf B}; + \node[fnblockD,right=10mm of bb,minimum width=20mm](l2){Layer 2}; + \draw[fnarrow] (x)--(l0); \draw[fnarrow] (l0)--(ba); + \draw[fnarrow] (ba)--(l1); \draw[fnarrow] (l1)--(bb); + \draw[fnarrow] (bb)--(l2); + \draw[fnarrowT,dashed] (l2.south) to[bend left=25] node[fnlbl,below]{copy into buf A} (ba.south); +\end{tikzpicture} +\end{center} + +\subsection{Descriptor table} +Written by the host into RAM at \code{table\_base} with \op{WRITE\_RAM}; \code{N\_LAYERS} +entries of 11 bytes each, MSB-first: + +\begin{tabularx}{\textwidth}{L{3.4cm} C{1.6cm} Y} +\toprule +\rowh \thd{Field} & \thd{Bytes} & \thd{Meaning} \\ +\midrule +\code{w\_base} & 3 & Weight base of the layer. \\ +\rowa \code{bias\_addr} & 3 & Bias base of the layer. \\ +\code{activation} & 1 & Layer activation (low 2 bits, cf. \code{ACT\_*}). \\ +\rowa \code{n\_inputs\_real} & 2 & Actual inputs of the layer (multiple of \code{PARALLEL}). \\ +\code{n\_neurons\_real} & 2 & Actual neurons of the layer. \\ +\midrule +\rowh \thd{Total} & \thd{11} & per entry/layer \\ +\bottomrule +\end{tabularx} + +\begin{fnnote}[Copy proportional to the actual width] +The sequencer copies exactly \code{n\_neurons\_real} bytes of \code{y\_bus} into the +ping-pong buffer (not the full build width): a narrower layer is copied faster, without +zero-padding in RAM. Each activation is read per-layer from the table, independent of the +\code{activation} register of the single-layer path. +\end{fnnote} + +\section{Hierarchy of the \texttt{busy}/\texttt{done} signals} +In the multi-layer path, \code{STATUS.busy} is the OR of the single-layer and sequencer +busy signals, while \code{STATUS.done} latches only at completion of the \emph{last} +layer, not at each intermediate layer (ch.~\ref{ch:spi}). The top-level returns control +of \code{neuron\_memory} to the direct \op{START} path at the end of the sequence. diff --git a/hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.aux b/hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.aux new file mode 100644 index 0000000..4c38c10 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.aux @@ -0,0 +1,75 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\@writefile{toc}{\contentsline {chapter}{\numberline {7}Graph network (Type \#2)}{17}{chapter.7}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:grafo}{{7}{17}{Graph network (Type \#2)}{chapter.7}{}} +\@writefile{toc}{\contentsline {section}{\numberline {7.1}Two network types}{17}{section.7.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.2}Global activation buffer}{17}{section.7.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.3}Feed-forward DAG and the \texttt {src\_id < out\_id} rule}{17}{section.7.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.4}Data formats}{17}{section.7.4}\protected@file@percent } +\gdef \LT@xi {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{57.52458pt}\LT@entry + {1}{306.05219pt}} +\gdef \LT@xii {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{57.52458pt}\LT@entry + {1}{306.05219pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.4.1}Type \#2 descriptor (graph)}{18}{subsection.7.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.4.2}Graph edge (4~bytes, aligned)}{18}{subsection.7.4.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.5}\texttt {graph\_engine} --- graph engine}{18}{section.7.5}\protected@file@percent } +\gdef \LT@xiii {\LT@entry + {1}{85.97733pt}\LT@entry + {1}{108.73918pt}\LT@entry + {1}{277.59944pt}} +\gdef \LT@xiv {\LT@entry + {1}{142.88284pt}\LT@entry + {1}{329.4331pt}} +\@writefile{toc}{\contentsline {section}{\numberline {7.6}Type \#2 opcodes and registers}{19}{section.7.6}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.7}Occupancy (Type \#2 enabled)}{19}{section.7.7}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.8}Gather bandwidth (measured)}{20}{section.7.8}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.9}\texttt {netasm} host assembler}{20}{section.7.9}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {7.1}{\ignorespaces Pseudo-assembly example (graph)}}{20}{lstlisting.7.1}\protected@file@percent } +\@setckpt{chapters/06b-grafo}{ +\setcounter{page}{21} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{7} +\setcounter{section}{9} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{4} +\setcounter{LT@tables}{14} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{31} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{11} +\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}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{53} +\setcounter{lstlisting}{1} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.tex b/hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.tex new file mode 100644 index 0000000..63c0f10 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/06b-grafo.tex @@ -0,0 +1,190 @@ +\chapter[Graph network (Type \#2)]{Two-level configuration: graph network (Type \#2)} +\label{ch:grafo} + +\section{Two network types} +The engine exposes two \emph{network types} selectable by the host, with the same start +command dispatching to the correct engine: + +\begin{itemize} +\item \textbf{Type \#1 --- classic network (dense).} Layers with neurons per layer, fully +connected between consecutive layers. It is the \code{layer\_sequencer} path +(ch.~\ref{ch:seq}), started by \op{RUN\_NETWORK}. Connections are \emph{implicit by +position}: nothing is enumerated, only the weights are defined, addressed as +\code{w\_base + k*n\_inputs + j}. +\item \textbf{Type \#2 --- arbitrary graph (sparse).} Starting from the input neuron ids, +each neuron's connections up to the output are defined through a per-neuron \emph{sparse +edge-list}. Connections are \emph{explicit by enumeration}: each connection is an edge +\code{(src\_id, weight)}; if it is not in the list, it does not exist. +\end{itemize} + +\begin{fnnote}[The difference in one line] +Dense: you define the \emph{weights} by position in a matrix. Graph: you define each +\emph{connection} as an edge \code{(src\_id, weight)} in a per-neuron list. The two +descriptor tables share the same 11-byte format but different fields; the +\code{net\_type} register tells the engine which interpretation to use. +\end{fnnote} + +\section{Global activation buffer} +Type \#2 introduces an \textbf{activation buffer} indexed by \emph{signal id}, one INT8 +byte per id, implemented in \textbf{on-chip \code{DP16KD} block RAM} +(\code{rtl/act\_buffer.v}). Ids \code{0..N\_in-1} are the inputs; each neuron writes its +own output into its own id. The source gather reads from here with \emph{single-cycle +random access}: this is what makes the graph cheap, because it is the access that PSRAM +(70~ns, sequential) could not accelerate. + +\begin{fnspec}[V1 sizing] +\code{N\_TOTAL}=4096 signals, 16-bit id (room to 65\,536 without changing the format). +Buffer = 4~KB, i.e. 2 \code{DP16KD} blocks out of 108. The real constraint becomes the +PSRAM edge capacity ($\approx$2\,M edges at 4~B), not block RAM. +\end{fnspec} + +\section{Feed-forward DAG and the \texttt{src\_id < out\_id} rule} +The graph is a feed-forward DAG: every connection points to an \textbf{already-computed} +id (\code{src\_id < out\_id}). Neurons are processed in ascending id order, so that when a +neuron is computed all its sources are ready in the buffer. Cycles and recurrence are out +of scope for V1. The rule is checked at two levels: by the host assembler (compile time) +and by a runtime guard in \code{graph\_engine} (\code{STATUS.err}), in the same philosophy +as the elaboration guard on \code{N\_INPUTS \% PARALLEL}. + +\section{Data formats} +Both descriptors are 11~bytes/entry, MSB-first, at \code{table\_base}. + +\subsection{Type \#2 descriptor (graph)} +\begin{tabularx}{\textwidth}{L{3.4cm} C{1.6cm} Y} +\toprule +\rowh \thd{Field} & \thd{Bytes} & \thd{Meaning} \\ +\midrule +\code{conn\_ptr} & 3 & Byte address in PSRAM of the neuron's edge block. \\ +\rowa \code{n\_conn} & 2 & Real connections (pre-padding). \\ +\code{out\_id} & 2 & Id into which the neuron's output is written. \\ +\rowa \code{activation} & 1 & \code{ACT\_RELU} / \code{ACT\_NONE} (low 2 bits). \\ +\code{bias} & 1 & Neuron bias (INT8). \\ +\rowa \code{reserved} & 2 & 0. \\ +\midrule +\rowh \thd{Total} & \thd{11} & entries in ascending \code{out\_id} order \\ +\bottomrule +\end{tabularx} + +\subsection{Graph edge (4~bytes, aligned)} +\begin{tabularx}{\textwidth}{L{3.4cm} C{1.6cm} Y} +\toprule +\rowh \thd{Field} & \thd{Bytes} & \thd{Meaning} \\ +\midrule +\code{src\_id} & 2 & Source id (uint16 BE). \\ +\rowa \code{weight} & 1 & Weight (INT8). \\ +\code{reserved} & 1 & 0 (4-byte alignment). \\ +\bottomrule +\end{tabularx} + +\begin{fnnote}[Padding to \texttt{PARALLEL}] +An arbitrary \code{n\_conn} is not a multiple of \code{PARALLEL}: the neuron's edge-list +is padded up to the multiple with \textbf{zero-weight} edges (waste +$\le$\code{PARALLEL}$-1$ per neuron). This keeps the datapath and its guard intact. +\end{fnnote} + +\section{\texttt{graph\_engine} --- graph engine} +\code{rtl/graph\_engine.v} orchestrates Type \#2 \textbf{reusing \code{neuron\_parallel} +unmodified}, as \code{neuron\_memory} does for the dense case. Key difference: between the +two modes only the \emph{X addressing} changes. In Type \#1 the input is contiguous +(\code{x\_base + i}); in Type \#2 it is a gather (\code{act\_buf[src\_id]}). The arithmetic +core is untouched. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=4mm,start chain=going below, + every node/.style={on chain,fnblock,minimum width=52mm}] + \node[fnblockA]{\code{COPY\_INPUTS}: PSRAM \code{x\_base} $\to$ \code{act\_buf[0..N\_in-1]}}; + \node{\code{READ\_DESC}: descriptor of neuron k}; + \node{\code{READ\_EDGES}: stream edges + gather \code{act\_buf[src\_id]}}; + \node{\code{START\_N} / \code{WAIT\_N}: group of \code{PARALLEL} $\to$ \code{neuron\_parallel}}; + \node[fnblockT]{\code{WRITE\_ACT}: y $\to$ \code{act\_buf[out\_id]}}; + \node{next neuron (id order)}; + \node[fnblockD]{\code{WRITE\_OUTPUTS}: last \code{n\_out} $\to$ PSRAM \code{out\_base}}; + \foreach \i [count=\j from 2] in {1,...,6} + \draw[fnarrow] (chain-\i) -- (chain-\j); +\end{tikzpicture} +\end{center} + +The outputs are the \textbf{last \code{n\_out}} ids: in a DAG with the +\code{src\_id < out\_id} ordering the output neurons (sinks, not reused as sources) +naturally end up with the highest ids. At the end \code{graph\_engine} copies these +\code{n\_out} bytes into a PSRAM region at \code{out\_base}, which the host reads back with +\op{READ\_RAM}. + +\section{Type \#2 opcodes and registers} +The type is selected with a new opcode; \op{RUN\_NETWORK} dispatches on the +\code{net\_type} register (details in ch.~\ref{ch:spi}). + +\begin{tabularx}{\textwidth}{L{2.6cm} L{3.4cm} Y} +\toprule +\rowh \thd{Opcode / sel} & \thd{Name} & \thd{Function} \\ +\midrule +\op{0x11} & SET\_NET\_TYPE & \code{type(1B)}: \code{0x01}=dense (\#1), \code{0x02}=graph (\#2). Default after \op{RESET}=dense. \\ +\rowa \code{SET\_BASE sel 9} & num\_neurons\_graph & Number of graph neurons (uint16). \\ +\code{SET\_BASE sel 10} & n\_out & Number of output ids (uint16). \\ +\bottomrule +\end{tabularx} + +\begin{fnnote}[Zero regression on Type \#1] +With \code{net\_type=dense} (the default value after \op{RESET}) the \#1 path is +bit-identical to before: \op{RUN\_NETWORK} keeps its \code{num\_layers(1B)} payload and the +framing of the existing opcodes does not change. +\end{fnnote} + +\section{Occupancy (Type \#2 enabled)} +Yosys synthesis of the full \code{spi\_neuron\_top} system with Type \#2 enabled +(\code{PARALLEL}=2): + +\begin{tabularx}{\textwidth}{L{4.6cm} Y} +\toprule +\rowh \thd{Resource} & \thd{Use} \\ +\midrule +\code{DP16KD} (block RAM) & 2 (activation buffer) \\ +\rowa \code{MULT18X18D} (DSP) & 4 (2 \code{neuron\_memory} + 2 \code{graph\_engine}) \\ +LUT4 & 2619 \\ +\rowa TRELLIS\_FF & 2467 \\ +\code{\$\_TBUF\_} (PSRAM bus) & 16 \\ +\bottomrule +\end{tabularx} +The device (108 \code{DP16KD}, 72 DSP, $\approx$44k LUT/FF) stays well below saturation: +Type \#2 adds a complete mode at a contained resource cost. LUT4/TRELLIS\_FF grew from an +earlier measurement (2367/2406) because of the PSRAM page mode added to the controller +(ch.~\ref{ch:mem}, \S~5.5) --- under 6\% utilization, no practical impact. + +\section{Gather bandwidth (measured)} +The per-edge gather cost was \textbf{isolated} by building two structurally-identical +graphs with different edge counts and differencing the cycles: the subtraction cancels the +fixed per-neuron overhead and leaves the edge cost alone. + +\begin{fnspec}[Per-edge cost] +\textbf{37.53 cycles/edge} with PSRAM page mode enabled (ch.~\ref{ch:mem}, \S~5.5) --- +\textbf{53.25 cycles/edge} without it (pre-page-mode baseline, consistent with theory: +4~bytes/edge $\times$ $\approx$13 cycles/byte over async PSRAM $\approx$52). At 80~MHz: +$\approx$2.13\,M edges/s ($\approx$8.5~MB/s, +42\% vs. baseline); at the real 16~MHz +clock: $\approx$426\,k edges/s ($\approx$1.71~MB/s). +\end{fnspec} + +Page-mode read (roadmap G7, ch.~\ref{ch:roadmap}) has been implemented and measured: the +gather's sequential access benefits directly, cutting the per-edge cost by 29.5\% +(53.25$\to$37.53 cycles/edge). Each edge still pays \code{int8\_memory\_access}'s +byte-granular access (4 bytes/edge); page mode reduces the cost of each sequential byte, +not the number of accesses. + +\section{\texttt{netasm} host assembler} +Readable network configuration needs no dedicated FPGA logic: a pseudo-assembly is +compiled \emph{on the host} (\code{tools/netasm/}) into the exact bytes of the tables and +edges, then loaded with \op{WRITE\_RAM}. The assembler validates at compile time +(\code{src\_id < out\_id}, \code{N\_TOTAL} bounds, padding to \code{PARALLEL}), +complementing the runtime guard. + +\begin{lstlisting}[language=,caption={Pseudo-assembly example (graph)},basicstyle=\ttfamily\scriptsize] +NET graph +INPUTS 4 ; ids 0..3 +NEURON n4 relu bias=2 + CONN 0 w=5 + CONN 1 w=-3 +NEURON n5 none bias=0 + CONN n4 w=2 ; symbolic reference to n4's output + CONN 2 w=7 +OUTPUT n5 +END +\end{lstlisting} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/07-spi.aux b/hardware/v1/docs/DatasheetLatex/chapters/07-spi.aux new file mode 100644 index 0000000..1a5c0b8 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/07-spi.aux @@ -0,0 +1,82 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xv {\LT@entry + {1}{43.2982pt}\LT@entry + {1}{80.28644pt}\LT@entry + {1}{122.96556pt}\LT@entry + {1}{80.28644pt}\LT@entry + {1}{125.81102pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {8}SPI host interface}{21}{chapter.8}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:spi}{{8}{21}{SPI host interface}{chapter.8}{}} +\@writefile{toc}{\contentsline {section}{\numberline {8.1}Physical layer}{21}{section.8.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {8.2}Framing and explicit length}{21}{section.8.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {8.3}Opcode table}{21}{section.8.3}\protected@file@percent } +\gdef \LT@xvi {\LT@entry + {1}{46.14322pt}\LT@entry + {1}{103.04872pt}\LT@entry + {1}{323.12401pt}} +\@writefile{toc}{\contentsline {section}{\numberline {8.4}\texttt {SET\_BASE} selectors}{23}{section.8.4}\protected@file@percent } +\newlabel{sec:setbase}{{8.4}{23}{\texttt {SET\_BASE} selectors}{section.8.4}{}} +\@writefile{toc}{\contentsline {section}{\numberline {8.5}\texttt {STATUS.done} sticky / clear-on-read}{24}{section.8.5}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {8.6}Host attention pins (\texttt {data\_ready\_n}, \texttt {irq\_n})}{24}{section.8.6}\protected@file@percent } +\gdef \LT@xvii {\LT@entry + {1}{57.52458pt}\LT@entry + {1}{114.43008pt}\LT@entry + {1}{300.36128pt}} +\@writefile{toc}{\contentsline {section}{\numberline {8.7}\texttt {READ\_CONFIG}}{25}{section.8.7}\protected@file@percent } +\newlabel{sec:readcfg}{{8.7}{25}{\texttt {READ\_CONFIG}}{section.8.7}{}} +\@writefile{toc}{\contentsline {section}{\numberline {8.8}Flash subsystem (opcodes 0x40--0x47, completed 2026-09-04)}{25}{section.8.8}\protected@file@percent } +\newlabel{sec:flashspi}{{8.8}{25}{Flash subsystem (opcodes 0x40--0x47, completed 2026-09-04)}{section.8.8}{}} +\gdef \LT@xviii {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{363.57677pt}} +\@writefile{toc}{\contentsline {section}{\numberline {8.9}Session sequences}{26}{section.8.9}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {8.9.1}Single-layer path}{26}{subsection.8.9.1}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {8.1}{\ignorespaces Single-layer session}}{26}{lstlisting.8.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {8.9.2}Multi-layer path (RUN\_NETWORK)}{26}{subsection.8.9.2}\protected@file@percent } +\newlabel{sec:run-network}{{8.9.2}{26}{Multi-layer path (RUN\_NETWORK)}{subsection.8.9.2}{}} +\@writefile{lol}{\contentsline {lstlisting}{\numberline {8.2}{\ignorespaces Multi-layer session}}{26}{lstlisting.8.2}\protected@file@percent } +\@setckpt{chapters/07-spi}{ +\setcounter{page}{28} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{8} +\setcounter{section}{9} +\setcounter{subsection}{2} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{4} +\setcounter{LT@tables}{18} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{50} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{7} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{65} +\setcounter{lstlisting}{2} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/07-spi.tex b/hardware/v1/docs/DatasheetLatex/chapters/07-spi.tex new file mode 100644 index 0000000..b60250a --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/07-spi.tex @@ -0,0 +1,290 @@ +\chapter{SPI host interface} +\label{ch:spi} + +\section{Physical layer} +The FPGA is always an SPI \textbf{slave}. The v1 protocol uses SPI \textbf{Mode~0} +(CPOL=0, CPHA=0), MSB-first, single-SPI. One command per low-CS period; byte~0 of each +transaction is the opcode. Multi-byte fields are big-endian. + +\begin{fnspec}[Mode 0 sampling] +\code{mosi} is sampled on the \textbf{rising} edge of \code{sclk}; \code{miso} is driven +on the \textbf{falling} edge (stable before the master's next sampling). \code{spi\_slave} +synchronizes \code{sclk/mosi/cs\_n} with a double flip-flop (3-stage CDC) before every +edge detection. +\end{fnspec} + +\begin{center} +\begin{tikztimingtable}[timing/dslope=0.1,timing/.style={x=3.4ex,y=2.2ex}, + xscale=1.0,font=\scriptsize] + \sig{CS\_N} & H 1L 16L 1H \\ + \sig{SCLK} & L 1L {2C(2)}8{2C(2)} 6L \\ + \sig{MOSI} & U 1U 2D{b7} 2D{b6} 2D{b5} 2D{b4} 2D{b3} 2D{b2} 2D{b1} 2D{b0} 2U \\ + \sig{MISO} & Z 1Z 16D{data} 1Z \\ +\end{tikztimingtable} +\end{center} +\begin{center}\footnotesize\itshape\color{fnGrey} +Framing of one byte: CS falls, 8 SCLK pulses, MSB first; MISO in tri-state outside a +transaction.\end{center} + +\begin{fnnote}[\texttt{tx\_byte\_req} contract] +\code{tx\_byte\_req} is a \emph{prefetch hint}, not a ``byte consumed'' event: a consumer +must advance its pointers (RAM address, response byte index) on \code{rx\_valid}, which +pulses exactly once per real byte transferred. +\end{fnnote} + +\section{Framing and explicit length} +The length of RAM transfers is \textbf{explicit}, not delimited by the CS edge: +\op{WRITE\_RAM}/\op{READ\_RAM} carry a 2-byte length field, so the SPI controller only +needs a byte counter. Byte addresses are 23-bit, carried in a 3-byte field with the most +significant bit reserved to 0. + +\section{Opcode table} +\renewcommand{\arraystretch}{1.16} +\begin{longtable}{C{1.1cm} L{2.4cm} L{3.9cm} L{2.4cm} L{4.0cm}} +\toprule +\rowh \thd{Op} & \thd{Name} & \thd{Payload (host$\to$FPGA)} & \thd{Response} & \thd{Function} \\ +\midrule +\endfirsthead +\rowh \thd{Op} & \thd{Name} & \thd{Payload} & \thd{Response} & \thd{Function} \\ \midrule +\endhead +\bottomrule +\endfoot +\op{0x00} & NOP & --- & --- & No operation (idle/dummy clocking). \\ +\rowa \op{0x01} & WRITE\_RAM & addr(3B)+len(2B)+data & --- & Writes a block into PSRAM (X, weights, bias, parameters). \\ +\op{0x02} & READ\_RAM & addr(3B)+len(2B) & \code{len} bytes & Reads a block back from PSRAM. \\ +\rowa \op{0x0F} & RESET & --- & --- & Synchronous reset of the engine and clearing of the STATUS latch; does not erase PSRAM. \\ +\op{0x10} & SET\_BASE & sel(1B)+addr(3B) & --- & Sets the bases/registers (see §\ref{sec:setbase}). \\ +\rowa \op{0x11} & SET\_NET\_TYPE & type(1B) & --- & Network type: \code{0x01}=dense (\#1), \code{0x02}=graph (\#2). Default after RESET=dense. \\ +\rowa \op{0x20} & START & --- & --- & Starts \code{neuron\_memory} (single-layer path); ignored if busy. \\ +\op{0x21} & STATUS & --- & 1 byte & bit0=\code{busy} (live), bit1=\code{done} (sticky, clear-on-read), bit2=\code{err} (graph guard), bit3=\code{flash\_err} (sticky, clear-on-read), bit4=\code{flash\_busy} (live); bit7:5=0. \\ +\rowa \op{0x22} & READ\_OUTPUT & --- & \code{N\_NEURONS} bytes & \code{y\_bus} neuron-major (byte~0 = neuron~0); dense path only (Type \#1). \\ +\op{0x23} & RUN\_NETWORK & num\_layers(1B) & --- & Starts execution: dispatches on \code{net\_type} to \code{layer\_sequencer} (\#1) or \code{graph\_engine} (\#2); ignored if busy. \\ +\rowa \op{0x30} & READ\_CONFIG & --- & 11 bytes & Hardware configuration record (§\ref{sec:readcfg}). \\ +\op{0x40} & FLASH\_READ\_BLOCK & flash\_addr(3B)+psram\_addr(3B)+len(3B) & --- & Raw flash$\to$PSRAM read, bypasses the catalog. \\ +\rowa \op{0x41} & FLASH\_WRITE\_BLOCK & psram\_addr(3B)+flash\_addr(3B)+len(3B) & --- & Raw PSRAM$\to$flash write (internal erase-before-write + $\leq$256B Page Program loop + WIP poll, transparent to the host), bypasses the catalog. \\ +\op{0x42} & FLASH\_ERASE & sector\_addr(3B) & --- & Standalone 4~KB sector erase (must be sector-aligned), bypasses the catalog. \\ +\rowa \op{0x43} & CAT\_READ & --- & --- & Reloads the 16-slot catalog (on-chip registers) from the flash's reserved sector. \\ +\op{0x44} & CAT\_WRITE\_SLOT & slot\_id(1B)+offset(3B)+len(3B)+type(1B) & --- & Registers/updates the slot's (offset, length, type) in the on-chip catalog and persists it to flash; marks the slot \emph{invalid} until \op{SAVE\_SLOT} confirms it. \\ +\rowa \op{0x45} & LOAD\_SLOT & slot\_id(1B)+psram\_addr(3B) & --- & Flash$\to$PSRAM for the slot (offset/length from the catalog), verifies the CRC32 live; \code{STATUS.flash\_err} if the slot is invalid or the CRC does not match. \\ +\op{0x46} & SAVE\_SLOT & slot\_id(1B)+psram\_addr(3B)+len(3B) & --- & PSRAM$\to$flash at the slot's already-registered offset, computes the CRC32 live; on success updates and persists the catalog entry (length, CRC, valid=1). \\ +\rowa \op{0x47} & CAT\_INSPECT & slot\_id(1B) & 16 bytes & Synchronous read of an already-loaded catalog entry: offset[3]+len[3]+type[1]+valid[1]+CRC32[4]+reserved[4], MSB-first. \\ +\end{longtable} +All flash opcodes are \emph{fire-and-forget}: the host polls \op{STATUS} (bit4= +\code{flash\_busy}, bit3=\code{flash\_err}) or the \code{irq\_n}/\code{data\_ready\_n} pins +for the outcome, except \op{CAT\_INSPECT}, which responds synchronously. + +The 8 flash opcodes (\op{0x40}--\op{0x47}) are described in full, with design rationale and +measured real latencies, in §\ref{sec:flashspi} below. + +\section{\texttt{SET\_BASE} selectors} +\label{sec:setbase} +\begin{tabularx}{\textwidth}{C{1.2cm} L{3.2cm} Y} +\toprule +\rowh \thd{sel} & \thd{Register} & \thd{Use} \\ +\midrule +0 & \code{x\_base} & Input base $X$. \\ +\rowa 1 & \code{w\_base} & Weight base. \\ +2 & \code{bias\_addr} & Bias base. \\ +\rowa 3 & \code{table\_base} & Descriptor table base (multi-layer). \\ +4 & \code{buf\_a\_base} & Ping-pong buffer A. \\ +\rowa 5 & \code{buf\_b\_base} & Ping-pong buffer B. \\ +6 & \code{activation} & Activation (low 2 bits) --- single-layer path only. \\ +\rowa 7 & \code{n\_inputs\_real} & Runtime input width (16-bit BE) --- single-layer. \\ +8 & \code{n\_neurons\_real} & Runtime neuron width (16-bit BE) --- single-layer. \\ +\rowa 9 & \code{num\_neurons\_graph} & Number of graph neurons (16-bit BE) --- Type \#2. \\ +10 & \code{n\_out} & Number of output ids (16-bit BE) --- Type \#2. \\ +\bottomrule +\end{tabularx} +Selectors 6--8 concern only the single-layer/manual path; with \op{RUN\_NETWORK} the +equivalent values are read per-layer from the descriptor table. + +\begin{fnwarn}[``real=0'' edge cases fixed (2026-09-04)] +The re-certification campaign (\code{docs/validation/bugs.md}) found that several +runtime values equal to zero were unguarded, with outcomes ranging from a silently +ignored limit to a hang or arbitrary-address PSRAM writes. All five cases below are now +safe no-ops, independently verified: +\begin{itemize} +\item \code{n\_inputs\_real=0} (selector 7): completes in 1 cycle with +$y=\text{activation}(\text{bias})$ (BUG-003). +\item \code{n\_neurons\_real=0} (selector 8): completes without performing any +per-neuron computation, far faster than a full-width run (BUG-004). +\item \code{num\_neurons\_graph=0} (selector 9): completes immediately after the input +copy, without ever entering the descriptor loop (BUG-006). +\item \op{RUN\_NETWORK} with \code{num\_layers=0} (dense path): an immediate no-op --- +\textbf{before the fix it executed 256 fabricated layers, reading arbitrary PSRAM data as +descriptors} (BUG-005, CRITICAL, see \S\ref{sec:run-network} below). +\item \op{SET\_NET\_TYPE} received while a run is in progress: now silently rejected +(no effect, no SPI error) instead of remapping the arbiter's multiplexer mid-execution +--- \textbf{before the fix it caused a permanent hang of the in-progress engine} +(BUG-007, CRITICAL). +\end{itemize} +Details, evidence, and per-fix verification are in \code{docs/validation/bugs.md}. +\end{fnwarn} + +\section{\texttt{STATUS.done} sticky / clear-on-read} +In \code{neuron\_memory} the \code{done} signal is a single-cycle pulse. A host polling +over SPI (much slower than the FPGA clock) would almost certainly miss a raw one-cycle +pulse. The SPI register bank therefore latches \code{done} into a sticky bit on the pulse +and clears it when the host reads \op{STATUS} (or \op{RESET}). The \code{busy} bit is +instead held at level for the whole computation and is read live. + +\begin{fnwarn}[Race corrected (2026-09-02)] +A real race in the sticky mechanism (present since Phase~4) was corrected by latching a +\code{status\_snapshot} on acceptance of the \op{STATUS} opcode and conditioning the +clearing of the sticky bit on \code{status\_snapshot[1]} (it clears only if the byte +actually transmitted showed \code{done=1}). A \code{done} that arrives too late for a +snapshot is reported on the next poll instead of being lost. +\end{fnwarn} + +\section{Host attention pins (\texttt{data\_ready\_n}, \texttt{irq\_n})} +Besides \op{STATUS} polling, the top-level exposes two active-low physical pins (bank 7, +ch.~\ref{ch:hw}) that mirror the sticky bits without an SPI transaction, handy for driving +a host GPIO/IRQ: +\begin{itemize} +\item \code{data\_ready\_n} = $\sim$\code{STATUS.done} (sticky): low when a result is ready +to read, returns high on the \op{STATUS} read (clear-on-read). +\item \code{irq\_n} = $\sim$\code{STATUS.err} (graph guard): low when \code{graph\_engine}'s +load-time guard has tripped. It is \textbf{not} clear-on-read: it clears only on \op{RESET} +or a fresh graph start, so an error is not missed between polls. +\end{itemize} +These are additive ports: they touch neither the existing opcodes nor the registers. + +\begin{fnwarn}[\code{flash\_err} has no dedicated pin] +\code{STATUS.flash\_err} (bit3) is reported \textbf{only} in the \op{STATUS} byte, by +design: reusing \code{irq\_n} would have conflated it with graph-guard errors (two +independent error domains on one pin), while a flash operation is always host-initiated +with an opcode just issued, so polling \op{STATUS} right after --- already implicit in the +``fire-and-forget, then poll \op{STATUS}/\code{data\_ready\_n}'' convention --- is already a +natural fit, no extra async pin needed. \code{data\_ready\_n}, on the other hand, +\emph{also clears at the end of a flash operation}: it mirrors \code{STATUS.done} (bit1), +which now latches on a completed flash op too, not only on \op{RUN\_NETWORK}/\op{START}. +\end{fnwarn} + +\section{\texttt{READ\_CONFIG}} +\label{sec:readcfg} +Fixed \textbf{11-byte} payload: it lets a single host firmware work with different +bitstreams without recompiling. The \code{N\_INPUTS}/\code{N\_NEURONS} values report the +build \emph{maximum} (the ceiling), not necessarily the currently loaded network. + +\begin{tabularx}{\textwidth}{C{1.6cm} L{3.6cm} Y} +\toprule +\rowh \thd{Byte} & \thd{Field} & \thd{Source} \\ +\midrule +0 & \code{ADDR\_WIDTH} (bit) & \code{neuron\_memory.ADDR\_WIDTH} \\ +\rowa 1--2 & \code{N\_INPUTS} (16-bit BE) & build maximum \\ +3 & \code{N\_NEURONS} & build maximum \\ +\rowa 4 & \code{PARALLEL} & build parameter \\ +5 & \code{DATA\_WIDTH} (bit) & build parameter \\ +\rowa 6--7 & protocol version (BE) & \code{0x0001} \\ +8--9 & \code{N\_TOTAL} (16-bit BE) & max graph signals (Type \#2) \\ +\rowa 10 & capability flag & bit0=\code{GRAPH\_SUPPORTED}=1 \\ +\bottomrule +\end{tabularx} + +\section{Flash subsystem (opcodes 0x40--0x47, completed 2026-09-04)} +\label{sec:flashspi} +The FPGA has \textbf{exclusive} access to the onboard boot/persistence flash (Winbond +\code{W25Q128JV}, 16~MB SPI NOR, ch.~\ref{ch:hw} §6/§7) through a dedicated, physically +separate SPI master (\code{rtl/spi\_flash\_master.v}), never through direct host access to +the flash pins. This is \textbf{not} a filesystem: a fixed-size catalog (16 slots, +\code{rtl/flash\_slot\_manager.v}) maps \code{slot\_id}~$\to$~(offset, length, type, valid, +CRC32) in a reserved flash sector (sector 0) --- no dynamic allocation, no garbage +collection. + +\begin{fnnote}[Layering (each level independently testable)] +\begin{itemize} +\item \code{rtl/spi\_flash\_master.v} --- raw SPI master toward the flash chip + (RDID/READ/WREN/PP/SE/RDSR-1). Fully independent 4-wire bus (\code{sclk}/\code{mosi}/ + \code{miso}/\code{cs\_n}, all ordinary GPIO --- Phase F7, 2026-09-04): an earlier + version reused the boot \code{CCLK} pad via the ECP5 \code{USRMCLK} primitive to save + one pin, dropped because it made the ``exclusive flash bus'' claim electrically + misleading (SCLK still depended on the same pad as the config engine) and carried an + unresolved verification gap (\code{USRMCLKTS} timing never checked against the + primary Lattice sysCONFIG Usage Guide). +\item \code{rtl/flash\_copy\_engine.v} --- block-streaming engine on top: flash$\to$PSRAM + (\code{DIR\_LOAD}), PSRAM$\to$flash with internal erase-before-write + $\leq$256B + Page Program loop + WIP polling (\code{DIR\_SAVE}), standalone sector erase + (\code{DIR\_ERASE}). A low-priority master (Port D) on \code{rtl/mem\_arbiter.v}: + flash operations are ms-scale and never block inference. +\item \code{rtl/flash\_slot\_manager.v} --- the slot catalog on top of that, plus a CRC32 + (\code{rtl/crc32.v}, IEEE~802.3/zlib) computed live over the real byte stream during + \op{LOAD\_SLOT}/\op{SAVE\_SLOT}, so a corrupted or partially-written slot (e.g. power + lost mid-erase) is detected even when the underlying flash operation itself reported + success. +\end{itemize} +\end{fnnote} + +\begin{fnwarn}[Sector alignment is mandatory] +\op{SAVE\_SLOT} (and the raw \op{FLASH\_WRITE\_BLOCK}/\op{FLASH\_ERASE}) require the target +flash address to be 4~KB-sector-aligned --- rejected as an error otherwise, rather than a +silent partial-sector read-modify-erase-write (no scratch buffer large enough exists for +that, and every real \op{SAVE\_SLOT} already writes a whole, sector-aligned slot by +construction). +\end{fnwarn} + +Full rationale, every datasheet citation, every adversarial test (CRC mismatch, never-saved +slot, page-boundary crossing, simulated power loss, arbiter contention), and the two real +bugs found and fixed during bring-up (one pre-existing in \code{psram\_controller.v}, one in +the new arbiter request handshake) are in \code{WORKLOG.md} (Phases F1-F6 entries) and +\code{docs/FPGA-Neural-Flash-Subsystem-Verification.md} (per-module coverage summary, not +repeated here). + +\begin{tabularx}{\textwidth}{L{3.4cm}Y} +\toprule +\rowh \thd{Operation} & \thd{Measured real latency} \\ +\midrule +ERASE (4~KB sector) & $\approx$400~ms (dominated by the flash chip's own internal tSE, independent of the host clock) \\ +\rowa SAVE (256~B page, incl. its own erase) & $\approx$403~ms (same, tSE+tPP) \\ +LOAD (4096~B) & 1.74~ms (2.35~MB/s) @80~MHz; 8.71~ms (0.47~MB/s) @16~MHz (purely SPI-clock-bound) \\ +\bottomrule +\end{tabularx} +Full measurement methodology in \code{docs/FPGA-Neural-Flash-Subsystem-Verification.md}. + +\section{Session sequences} +\subsection{Single-layer path} +\begin{lstlisting}[language=,caption={Single-layer session},basicstyle=\ttfamily\scriptsize] +RESET -> 0x0F +READ_CONFIG -> 0x30 (host learns N_INPUTS/N_NEURONS/...) +WRITE_RAM (weights) -> 0x01 ... +WRITE_RAM (bias) -> 0x01 ... +SET_BASE (X/W/BIAS) -> 0x10 x3 +WRITE_RAM (input X) -> 0x01 ... +START -> 0x20 +poll STATUS -> 0x21 (until done=1; cleared by this read) +READ_OUTPUT -> 0x22 +\end{lstlisting} + +\subsection{Multi-layer path (RUN\_NETWORK)} +\label{sec:run-network} +\begin{lstlisting}[language=,caption={Multi-layer session},basicstyle=\ttfamily\scriptsize] +WRITE_RAM (descriptor table) -> 0x01 ... +WRITE_RAM (weights/bias per layer, X L0) -> 0x01 ... +SET_BASE (X/TABLE/BUF_A/BUF_B) -> 0x10 x4 +RUN_NETWORK(num_layers) -> 0x23 +poll STATUS -> 0x21 (until done=1) +READ_OUTPUT -> 0x22 (y_bus of the final layer) +\end{lstlisting} + +\begin{fnnote}[Out of scope for v1] +Dual~SPI and CRC/checksum on host transfers (SPI assumed reliable on a board trace --- not +to be confused with the flash catalog's CRC32, §\ref{sec:flashspi}, which protects a +different domain: flash$\leftrightarrow$PSRAM persistence, not the host SPI link). +\end{fnnote} + +\begin{fnwarn}[\op{WRITE\_RAM}/\op{READ\_RAM} have no backpressure to the host --- a real risk, not a theoretical one] +Every received/produced byte must be fully processed by \code{spi\_engine} before the next +SCLK-driven byte boundary arrives --- reasonable for the initial bulk-loading of weights/ +inputs, not a real-time path. The concrete risk: if a host issues \op{WRITE\_RAM}/ +\op{READ\_RAM} before \code{psram\_controller.v}'s power-up sequence has completed +($\sim$150~\textmu s after reset, \code{STATE\_INIT}+\code{STATE\_CR\_INIT}), +\code{spi\_engine} stalls waiting for the very first PSRAM access to complete, while the +host --- not slowed by any handshake --- keeps clocking bytes. Bytes received during that +stall are \textbf{silently dropped}, with no error and no hang: just wrong data in PSRAM. +Found during the flash-subsystem work (\code{WORKLOG.md}, Phase~F5) via a minimal +\op{WRITE\_RAM}-only reproduction with no flash opcodes involved at all: it is a general +hazard for any host, not specific to the flash opcodes. \textbf{Current mitigation: a host +must wait for PSRAM power-up (or otherwise ensure the FPGA has been out of reset for +$>$150~\textmu s) before its first \op{WRITE\_RAM}/\op{READ\_RAM}.} Not fixed at the +protocol level (would need real backpressure, a larger change) --- declared here as an open +risk, not silently worked around. +\end{fnwarn} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.aux b/hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.aux new file mode 100644 index 0000000..38f0e04 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.aux @@ -0,0 +1,78 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xix {\LT@entry + {1}{40.45274pt}\LT@entry + {1}{108.73918pt}\LT@entry + {1}{51.83368pt}\LT@entry + {1}{51.83368pt}\LT@entry + {1}{219.45667pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {9}Network programming}{28}{chapter.9}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:prog}{{9}{28}{Network programming}{chapter.9}{}} +\@writefile{toc}{\contentsline {section}{\numberline {9.1}General flow}{28}{section.9.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {9.2}Registers and opcodes involved}{28}{section.9.2}\protected@file@percent } +\gdef \LT@xx {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{363.57677pt}} +\@writefile{toc}{\contentsline {section}{\numberline {9.3}Type \#1 --- dense network}{29}{section.9.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.3.1}Memory layout}{29}{subsection.9.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.3.2}Worked example: a $4\to 4\to 2$ network}{29}{subsection.9.3.2}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.1}{\ignorespaces Dense descriptor table (22 bytes)}}{29}{lstlisting.9.1}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.2}{\ignorespaces SPI session (dense)}}{29}{lstlisting.9.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.3.3}Host pseudocode (dense)}{29}{subsection.9.3.3}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.3}{\ignorespaces Encoding and loading a dense network}}{29}{lstlisting.9.3}\protected@file@percent } +\gdef \LT@xxi {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{363.57677pt}} +\@writefile{toc}{\contentsline {section}{\numberline {9.4}Type \#2 --- graph network}{30}{section.9.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.4.1}Memory layout}{30}{subsection.9.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.4.2}Worked example}{30}{subsection.9.4.2}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.4}{\ignorespaces Graph descriptors + edges}}{30}{lstlisting.9.4}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.5}{\ignorespaces SPI session (graph)}}{30}{lstlisting.9.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.4.3}Host pseudocode (graph)}{30}{subsection.9.4.3}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.6}{\ignorespaces Encoding and loading a graph}}{31}{lstlisting.9.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {9.4.4}\texttt {netasm} pseudo-assembly}{31}{subsection.9.4.4}\protected@file@percent } +\@writefile{lol}{\contentsline {lstlisting}{\numberline {9.7}{\ignorespaces netasm: source and generated bytes}}{31}{lstlisting.9.7}\protected@file@percent } +\@setckpt{chapters/07b-programmazione}{ +\setcounter{page}{32} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{9} +\setcounter{section}{4} +\setcounter{subsection}{4} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{3} +\setcounter{LT@tables}{21} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{52} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{21} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{77} +\setcounter{lstlisting}{7} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.tex b/hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.tex new file mode 100644 index 0000000..4783351 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/07b-programmazione.tex @@ -0,0 +1,232 @@ +\chapter[Network programming]{Neural network programming} +\label{ch:prog} + +This chapter is the practical guide to encoding a network for FPGA-Neural: how it is laid +out in memory, which registers are set and how it is started, for both topologies. It +assumes the SPI opcodes (ch.~\ref{ch:spi}) and the descriptor formats (ch.~\ref{ch:seq}, +\ref{ch:grafo}). + +\section{General flow} +Whatever the type, the cycle is the same: the host \emph{builds the data structures in +RAM}, sets the \emph{base registers}, declares the \emph{network type}, \emph{starts} and +\emph{reads back} the result. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=3mm,start chain=going below, + every node/.style={on chain,fnblock,minimum width=64mm}] + \node[fnblockA]{1. \op{RESET} --- clears the engine and the STATUS latch}; + \node{2. \op{SET\_NET\_TYPE} --- dense (\#1) or graph (\#2)}; + \node{3. \op{WRITE\_RAM} --- tables, weights/edges, bias, input X}; + \node{4. \op{SET\_BASE} --- base registers (x, table, \ldots)}; + \node[fnblockT]{5. \op{RUN\_NETWORK} --- dispatch on \code{net\_type}}; + \node{6. \op{STATUS} polling --- waits for \code{done}}; + \node[fnblockD]{7. \op{READ\_OUTPUT} / \op{READ\_RAM} --- result}; + \foreach \i [count=\j from 2] in {1,...,6} \draw[fnarrow] (chain-\i)--(chain-\j); +\end{tikzpicture} +\end{center} + +\section{Registers and opcodes involved} +All base values are set with \op{SET\_BASE} \code{sel(1B)+addr(3B)}. Selectors: + +\begin{tabularx}{\textwidth}{C{1.0cm} L{3.4cm} C{1.4cm} C{1.4cm} Y} +\toprule +\rowh \thd{sel} & \thd{Register} & \thd{Type \#1} & \thd{Type \#2} & \thd{Use} \\ +\midrule +0 & \code{x\_base} & \checkmark & \checkmark & Input base $X$. \\ +\rowa 3 & \code{table\_base} & \checkmark & \checkmark & Descriptor table. \\ +4 & \code{buf\_a\_base} & \checkmark & \checkmark\textsuperscript{$\ast$} & Ping-pong A (\#1) / \code{out\_base} reuse (\#2). \\ +\rowa 5 & \code{buf\_b\_base} & \checkmark & --- & Ping-pong B (\#1). \\ +9 & \code{num\_neurons\_graph} & --- & \checkmark & Number of graph neurons. \\ +\rowa 10 & \code{n\_out} & --- & \checkmark & Number of output ids. \\ +\bottomrule +\end{tabularx} +\begin{center}\footnotesize\itshape\color{fnGrey} +$\ast$ In Type \#2 the ping-pong buffers are unused: selector 4 is reused as +\code{out\_base} (region into which outputs are copied). Selectors 1/2/6/7/8 concern only +the manual single-layer path (\op{START}), not \op{RUN\_NETWORK}.\end{center} + +For Type \#1, the \emph{per-layer} \code{w\_base}/\code{bias\_addr} are \textbf{not} set +with \op{SET\_BASE}: they are fields of the descriptor table. \op{SET\_NET\_TYPE} defaults +to \emph{dense} after \op{RESET}, so a \#1 network works even without issuing it. + +% ====================================================================== +\section{Type \#1 --- dense network} + +\subsection{Memory layout} +\begin{tabularx}{\textwidth}{L{3.4cm} Y} +\toprule +\rowh \thd{Structure} & \thd{Format} \\ +\midrule +Input $X$ & \code{n\_inputs\_real} INT8 bytes at \code{x\_base}. \\ +\rowa Weights (per layer) & Neuron-major: neuron $k$ at \code{w\_base + k*n\_inputs\_real}, \code{n\_neurons*n\_inputs} bytes. \\ +Bias (per layer) & One INT8 byte per neuron at \code{bias\_addr}. \\ +\rowa Descriptor table & \code{num\_layers} 11-byte entries at \code{table\_base}. \\ +Buffers A/B & Ping-pong intermediate outputs. \\ +\bottomrule +\end{tabularx} +Descriptor (11 bytes, MSB-first): \code{w\_base}(3) $|$ \code{bias\_addr}(3) $|$ +\code{activation}(1) $|$ \code{n\_inputs\_real}(2) $|$ \code{n\_neurons\_real}(2). + +\subsection{Worked example: a $4\to4\to2$ network} +Layer~0: 4 inputs, 4 neurons, ReLU. Layer~1: 4 inputs, 2 neurons, linear +(\code{PARALLEL}=2, so each \code{n\_inputs\_real} is a multiple of 2). Chosen addresses: +\code{table\_base}=\code{0x000000}, \code{x\_base}=\code{0x001000}, L0 weights/bias at +\code{0x002000}/\code{0x002100}, L1 at \code{0x002200}/\code{0x002300}, buffers at +\code{0x003000}/\code{0x003100}. + +\begin{lstlisting}[language=,caption={Dense descriptor table (22 bytes)},basicstyle=\ttfamily\scriptsize] +Layer 0: 00 20 00 | 00 21 00 | 01 | 00 04 | 00 04 + w_base bias_addr ReLU n_in=4 n_neu=4 +Layer 1: 00 22 00 | 00 23 00 | 00 | 00 04 | 00 02 + w_base bias_addr NONE n_in=4 n_neu=2 +\end{lstlisting} + +\begin{lstlisting}[language=,caption={SPI session (dense)},basicstyle=\ttfamily\scriptsize] +0x0F RESET +0x11 01 SET_NET_TYPE = dense +0x01 000000 0016 <22-byte table> WRITE_RAM table +0x01 002000 0010 <16-byte L0 wts> WRITE_RAM L0 weights (neuron-major) +0x01 002100 0004 <4-byte L0 bias> +0x01 002200 0008 <8-byte L1 wts> +0x01 002300 0002 <2-byte L1 bias> +0x01 001000 0004 WRITE_RAM input X +0x10 00 001000 SET_BASE x_base +0x10 03 000000 SET_BASE table_base +0x10 04 003000 SET_BASE buf_a +0x10 05 003100 SET_BASE buf_b +0x23 02 RUN_NETWORK num_layers=2 +0x21 ... poll STATUS until done=1 +0x22 READ_OUTPUT -> 2 bytes (final layer) +\end{lstlisting} + +\subsection{Host pseudocode (dense)} +\begin{lstlisting}[language=,caption={Encoding and loading a dense network},basicstyle=\ttfamily\scriptsize] +def load_dense(layers, X): # layers in execution order + spi(RESET); spi(SET_NET_TYPE, DENSE) + table = b"" + for L in layers: # L: weights[n][k], bias[n], act, n_in, n_out + assert L.n_in % PARALLEL == 0 + w = alloc(L.weights_neuron_major) # k slow, input fast + b = alloc(L.bias) + table += u24(w)+u24(b)+u8(L.act)+u16(L.n_in)+u16(L.n_out) + write_ram(TABLE_BASE, table) + write_ram(X_BASE, X) + set_base(0, X_BASE); set_base(3, TABLE_BASE) + set_base(4, BUF_A); set_base(5, BUF_B) + spi(RUN_NETWORK, len(layers)) + wait_status_done() + return read_output(layers[-1].n_out) +\end{lstlisting} + +% ====================================================================== +\section{Type \#2 --- graph network} + +\subsection{Memory layout} +\begin{tabularx}{\textwidth}{L{3.4cm} Y} +\toprule +\rowh \thd{Structure} & \thd{Format} \\ +\midrule +Input $X$ & \code{N\_in} bytes at \code{x\_base}; copied into \code{act\_buf[0..N\_in-1]} at start. \\ +\rowa Descriptor table & \code{num\_neurons\_graph} 11-byte entries at \code{table\_base}, in ascending \code{out\_id} order. \\ +Edge blocks & Per neuron: \code{n\_conn} 4-byte edges at \code{conn\_ptr}, padded to a multiple of \code{PARALLEL} (zero-weight edges). \\ +\rowa Outputs & \code{n\_out} bytes written to \code{out\_base} (=selector 4). \\ +\bottomrule +\end{tabularx} +Graph descriptor (11 bytes): \code{conn\_ptr}(3) $|$ \code{n\_conn}(2) $|$ \code{out\_id}(2) +$|$ \code{activation}(1) $|$ \code{bias}(1) $|$ \code{reserved}(2). \quad +Edge (4 bytes): \code{src\_id}(2) $|$ \code{weight}(1) $|$ \code{reserved}(1). \quad +Rule: \code{src\_id < out\_id} (feed-forward DAG). + +\subsection{Worked example} +4 inputs (ids 0--3). Neuron n4 (\code{out\_id}=4, ReLU, bias=2) connected to ids 0 and 1; +neuron n5 (\code{out\_id}=5, linear, bias=0) connected to n4 (id~4) and id~2; output = n5 +(\code{n\_out}=1). \code{PARALLEL}=2, both have 2 connections (no padding). Addresses: +\code{table\_base}=\code{0x000000}, edges at \code{0x000100}, \code{x\_base}= +\code{0x001000}, \code{out\_base}=\code{0x002000}. + +\begin{lstlisting}[language=,caption={Graph descriptors + edges},basicstyle=\ttfamily\scriptsize] +Descriptors (at 0x000000, 22 bytes): + n4: 00 01 00 | 00 02 | 00 04 | 01 | 02 | 00 00 + conn_ptr n_conn out_id ReLU bias rsv + n5: 00 01 08 | 00 02 | 00 05 | 00 | 00 | 00 00 + conn_ptr n_conn out_id NONE bias rsv + +Edge blocks (at 0x000100, 4 bytes/edge: src_id, weight, rsv): + n4 @0x000100: 00 00 05 00 (src=0, w=+5) + 00 01 FD 00 (src=1, w=-3) ; -3 = 0xFD + n5 @0x000108: 00 04 02 00 (src=4, w=+2) ; id4 = n4's output + 00 02 07 00 (src=2, w=+7) +\end{lstlisting} + +\begin{lstlisting}[language=,caption={SPI session (graph)},basicstyle=\ttfamily\scriptsize] +0x0F RESET +0x11 02 SET_NET_TYPE = graph +0x01 000000 0016 <22-byte table> WRITE_RAM descriptors +0x01 000100 0010 <16-byte edges> WRITE_RAM edge blocks +0x01 001000 0004 WRITE_RAM input X +0x10 00 001000 SET_BASE x_base +0x10 03 000000 SET_BASE table_base +0x10 04 002000 SET_BASE out_base (sel 4 reuse) +0x10 09 000002 SET_BASE num_neurons_graph = 2 +0x10 0A 000001 SET_BASE n_out = 1 +0x23 00 RUN_NETWORK (dispatch to graph_engine) +0x21 ... poll STATUS (bit2=err if src_id>=out_id) +0x02 002000 0001 READ_RAM out_base -> 1 byte (n5 output) +\end{lstlisting} + +\subsection{Host pseudocode (graph)} +\begin{lstlisting}[language=,caption={Encoding and loading a graph},basicstyle=\ttfamily\scriptsize] +def load_graph(neurons, X, n_out): # neurons sorted by ascending out_id + spi(RESET); spi(SET_NET_TYPE, GRAPH) + edges = b""; table = b"" + for N in neurons: # N: out_id, conns=[(src_id,w)...], act, bias + for (src,_) in N.conns: + assert src < N.out_id and src < N_TOTAL # DAG rule + conn_ptr = EDGE_BASE + len(edges) + padded = pad(N.conns, PARALLEL, fill=(0,0)) # zero-weight edges + for (src,w) in padded: + edges += u16(src)+i8(w)+u8(0) + table += u24(conn_ptr)+u16(len(N.conns))+u16(N.out_id) \ + + u8(N.act)+i8(N.bias)+u16(0) + write_ram(TABLE_BASE, table); write_ram(EDGE_BASE, edges) + write_ram(X_BASE, X) + set_base(0, X_BASE); set_base(3, TABLE_BASE); set_base(4, OUT_BASE) + set_base(9, len(neurons)); set_base(10, n_out) + spi(RUN_NETWORK, 0) # payload ignored in graph + wait_status_done() + return read_ram(OUT_BASE, n_out) +\end{lstlisting} + +\subsection{\texttt{netasm} pseudo-assembly} +The readable description is compiled by the host assembler (\code{tools/netasm/}) into +exactly the table and edge bytes above. Example equivalent to the worked graph: + +\begin{lstlisting}[language=,caption={netasm: source and generated bytes},basicstyle=\ttfamily\scriptsize] +; --- source --- +NET graph +INPUTS 4 ; ids 0..3 +NEURON n4 relu bias=2 + CONN 0 w=5 + CONN 1 w=-3 +NEURON n5 none bias=0 + CONN n4 w=2 ; symbolic reference -> id 4 + CONN 2 w=7 +OUTPUT n5 +END + +; --- the assembler emits --- +; assigned ids: n4=4, n5=5 (guarantees src_id < out_id) +; descriptors: 00 01 00 00 02 00 04 01 02 00 00 +; 00 01 08 00 02 00 05 00 00 00 00 +; edges: 00 00 05 00 00 01 FD 00 (n4) +; 00 04 02 00 00 02 07 00 (n5) +; registers: table_base, x_base, out_base, num_neurons=2, n_out=1 +; compile-time checks: src_id$ C $>$ A}: an inference in progress is more critical than the +sequencer's bookkeeping, which in turn is more critical than a manual SPI access that has +just arrived. In normal operation B and C are anyway temporally disjoint +(\code{neuron\_memory} requests only during an execution, \code{layer\_sequencer} only in +the pauses between layers), so the priority matters mostly for the corner case of a +manual \op{WRITE\_RAM}/\op{READ\_RAM} arriving during a multi-layer execution. + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=6mm] + \node[fnblock,minimum width=30mm](a){Port A --- \code{spi\_engine}}; + \node[fnblock,below=4mm of a,minimum width=30mm](b){Port B --- \code{neuron\_memory}}; + \node[fnblock,below=4mm of b,minimum width=30mm](c){Port C --- \code{layer\_sequencer}}; + \node[fnblockD,right=16mm of b,minimum width=26mm,minimum height=16mm](arb){\code{mem\_arbiter}\\{\scriptsize B$>$C$>$A}}; + \node[fnblockT,right=14mm of arb,minimum width=26mm](m){shared memory\\{\scriptsize chain}}; + \draw[fnarrow] (a)-|(arb.west|-a); \draw[fnarrow] (b)--(arb.west); + \draw[fnarrow] (c)-|(arb.west|-c); + \draw[fnbus] (arb)--(m); +\end{tikzpicture} +\end{center} + +Once access is granted, the arbiter retains ownership until the single transaction's +\code{m\_ready} pulse, then releases: all three masters emit \code{req} as a clean +one-cycle pulse, so a queue-less grant-and-forward design suffices. + +\section{\texttt{spi\_neuron\_top} --- full integration} +The top-level connects SPI (\code{spi\_slave}+\code{spi\_engine}), the arbiter, the +sequencer, \code{neuron\_memory} and the PSRAM chain. The reset of \code{neuron\_memory} +is the OR of the global reset with the soft-reset pulse of the \op{RESET} opcode, so the +host can recover the engine over SPI without a physical reset (the RAM stays intact). + +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=7mm] + \node[fnblockA,minimum width=22mm](ss){\code{spi\_slave}}; + \node[fnblockA,right=8mm of ss,minimum width=22mm](se){\code{spi\_engine}}; + \node[fnblockT,below=8mm of se,minimum width=26mm](sq){\code{layer\_sequencer}}; + \node[fnblockD,right=10mm of se,minimum width=24mm](mux){ctrl MUX\\{\scriptsize on \code{seq\_busy}}}; + \node[fnblock,below=8mm of mux,minimum width=26mm](nm){\code{neuron\_memory}}; + \node[fnblockD,right=10mm of mux,minimum width=22mm](arb){\code{mem\_arbiter}}; + \node[fnblockA,right=8mm of arb,minimum width=26mm](mem){PSRAM chain}; + \draw[fnarrow] (ss)--(se); + \draw[fnarrow] (se)--(mux); + \draw[fnarrow] (sq)--(mux); + \draw[fnarrow] (mux)--(nm); + \draw[fnarrow] (se.south) to[bend right=10] (arb.north west); + \draw[fnarrow] (nm)--(arb); + \draw[fnarrow] (sq.east) to[bend right=20] (arb.south west); + \draw[fnbus] (arb)--(mem); +\end{tikzpicture} +\end{center} + +The multiplexer switches the control lines of \code{neuron\_memory} between the sequencer +(while \code{seq\_busy} is high) and the direct path of \code{spi\_engine} (legacy +single-layer mode), returning the engine to the direct path at the end of the sequence. + +\begin{fnnote}[End-to-end verification] +\code{spi\_neuron\_top} is verified in simulation with real PSRAM +(\code{psram\_model.v}, no mock): RESET/READ\_CONFIG/WRITE\_RAM/READ\_RAM/SET\_BASE/ +START/STATUS/READ\_OUTPUT and \op{RUN\_NETWORK} are exercised purely over simulated SPI +(ch.~\ref{ch:impl}). +\end{fnnote} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.aux b/hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.aux new file mode 100644 index 0000000..b983e66 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.aux @@ -0,0 +1,76 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xxiii {\LT@entry + {1}{154.26378pt}\LT@entry + {1}{97.35826pt}\LT@entry + {1}{220.69391pt}} +\gdef \LT@xxiv {\LT@entry + {1}{51.83368pt}\LT@entry + {1}{63.21504pt}\LT@entry + {1}{51.83368pt}\LT@entry + {1}{57.52458pt}\LT@entry + {1}{57.52458pt}\LT@entry + {1}{54.67912pt}\LT@entry + {1}{51.83368pt}} +\expandafter \gdef \csname pgfplots@labelstyle@plt:tp\endcsname {fnBlue={\pgfkeysnovalue },mark={square*},thick={\pgfkeysnovalue },mark options={fill=fnBlue}} +\expandafter \gdef \csname pgfplots@show@ref@plt:tp\endcsname {\begingroup \def \pgfplots@draw@image {\def \tikz@plot@handler {\pgfkeys {/pgf/plots/@handler options/.cd, start=\relax , end macro=\relax , point macro=\pgfutil@gobble , jump macro=\relax , special macro=\pgfutil@gobble , point macro=\pgf@plot@line@handler , jump=\global \let \pgf@plotstreampoint \pgf@plot@line@handler@move }\begingroup \escapechar =-1 \edef \pgfplotsplothandlername {\string \pgfplothandlerlineto }\pgfmath@smuggleone \pgfplotsplothandlername \endgroup \def \pgfplotsplothandlerLUAfactory {function(axis, pointmetainputhandler) return pgfplots.GenericPlothandler.new("\pgfplotsplothandlername ", axis,pointmetainputhandler) end}\def \pgfplotsplothandlerLUAvisualizerfactory {pgfplots.defaultPlotVisualizerFactory}}\pgfkeysdef {/pgfplots/legend image code}{\draw [/pgfplots/mesh=false,bar width=3pt,bar shift=0pt,mark repeat=2,mark phase=2,] plot coordinates { (0cm,0cm) (0.3cm,0cm) (0.6cm,0cm)};}\pgfkeysdef {/pgfplots/every legend image post}{}\pgfkeyssetvalue {/pgfplots/mark list fill}{.!80!black}\pgfkeysdef {/pgfplots/every crossref picture}{\pgfkeysalso {baseline,yshift=0.3em}}\pgfplots@show@small@legendplots {fnBlue={\pgfkeysnovalue },mark={square*},thick={\pgfkeysnovalue },mark options={fill=fnBlue}}{}}\ifpgfpicture \scope [/pgfplots/every crossref picture]\pgfplots@draw@image \endscope \else \expandafter \ifx \csname tikzappendtofigurename\endcsname \relax \else \begingroup \tikzappendtofigurename {_crossref}\fi \tikz [/pgfplots/every crossref picture]{\pgfplots@draw@image }\expandafter \ifx \csname tikzappendtofigurename\endcsname \relax \else \endgroup \fi \fi \endgroup } +\@writefile{toc}{\contentsline {chapter}{\numberline {11}ECP5 implementation}{34}{chapter.11}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:impl}{{11}{34}{ECP5 implementation}{chapter.11}{}} +\@writefile{toc}{\contentsline {section}{\numberline {11.1}Flow and verification}{34}{section.11.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {11.2}Datapath benchmark (256$\times $4)}{34}{section.11.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {11.2.1}Fmax and throughput versus parallelism}{35}{subsection.11.2.1}\protected@file@percent } +\newlabel{plt:tp}{{\expandafter\protect\csname pgfplots@show@ref@plt:tp\endcsname}{35}{Fmax and throughput versus parallelism}{pgfplotslink.11.2.0}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {11.2.2}Interpretation}{35}{subsection.11.2.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {11.2.3}Critical path and the 100~MHz limit}{35}{subsection.11.2.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {11.3}Full integrated system}{35}{section.11.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {11.3.1}Cause: the saturation/ReLU carry chain}{35}{subsection.11.3.1}\protected@file@percent } +\gdef \LT@xxv {\LT@entry + {1}{142.88284pt}\LT@entry + {1}{85.97733pt}\LT@entry + {1}{80.28644pt}\LT@entry + {1}{163.16934pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {11.3.2}Timing closure (2026-09-03)}{36}{subsection.11.3.2}\protected@file@percent } +\@setckpt{chapters/09-implementazione}{ +\setcounter{page}{37} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{11} +\setcounter{section}{3} +\setcounter{subsection}{2} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{3} +\setcounter{LT@tables}{25} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{62} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{21} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{89} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.tex b/hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.tex new file mode 100644 index 0000000..156d5a6 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/09-implementazione.tex @@ -0,0 +1,169 @@ +\chapter[ECP5 implementation]{ECP5 implementation and characterization} +\label{ch:impl} + +\section{Flow and verification} +The project is verified on two complementary planes: functional \textbf{simulation} with +Icarus Verilog (signed algebra, products, accumulation, groups, bias, ReLU, saturation, +busy/done signals) and real \textbf{implementation} with Yosys (synthesis) $+$ +nextpnr-ecp5 (place\&route, timing) $+$ Project~Trellis (\code{ecppack}). + +\begin{tabularx}{\textwidth}{L{5.0cm} C{3.0cm} Y} +\toprule +\rowh \thd{Verification stage} & \thd{Outcome} & \thd{Covers} \\ +\midrule +Functional RTL & \PASS & datapath correctness \\ +\rowa Parametric simulation & \PASS & configuration sweep \\ +ECP5 synthesis & \PASS & synthesizability, mapping \\ +\rowa Placement / Routing & \PASS & LUT/FF/DSP, timing \\ +Bitstream (\code{ecppack}) & \PASS & full flow, 0 errors (P2 and P8) \\ +\bottomrule +\end{tabularx} + +\begin{fnnote}[End-to-end toolchain through the bitstream] +The full flow RTL $\to$ Yosys $\to$ nextpnr-ecp5 $\to$ \code{ecppack} produces a valid +bitstream for P2 and P8, \textbf{0 errors at every stage}. Header verified byte-by-byte: +\code{Part: LFE5U-45F-8CABGA381}, the target's real part number, not a placeholder. Only +\emph{generation} is verified: no physical-hardware test in this session. +\end{fnnote} + +\section{Datapath benchmark (256$\times$4)} +Configuration: INT8/INT32, \code{N\_INPUTS}=256, \code{N\_NEURONS}=4, variable +\code{PARALLEL}, 80~MHz target, device \code{LFE5U-45F-8BG381C} ($-8$). The test buses +are generated \emph{inside} the benchmark wrapper so as not to expose thousands of I/Os; +the top-level exposes only \code{clk/rst/start/y\_bus/busy/done}. + +\begin{tabularx}{\textwidth}{C{1.4cm} C{1.8cm} C{1.4cm} C{1.6cm} C{1.6cm} C{1.5cm} C{1.4cm}} +\toprule +\rowh \thd{PAR} & \thd{tot MAC} & \thd{DSP} & \thd{Fmax} & \thd{Tcrit} & \thd{80\,MHz} & \thd{LUT4} \\ +\midrule +16 & 64 & 64/72 & 52.13 & 19.18 & \FAIL & $\approx$2531 \\ +\rowa 8 & 32 & 32/72 & 61.71 & 16.20 & \FAIL & --- \\ +4 & 16 & 16/72 & 75.01 & 13.33 & \FAIL & 804 \\ +\rowa 2 & 8 & 8/72 & 87.88 & 11.38 & \PASS & 481 \\ +\bottomrule +\end{tabularx} +\begin{center}\footnotesize\itshape\color{fnGrey} +Fmax and Tcrit in MHz and ns. Total MACs $=$ PARALLEL$\times$4 neurons.\end{center} + +\subsection{Fmax and throughput versus parallelism} +\begin{center} +\begin{tikzpicture} +\begin{axis}[ + width=0.62\textwidth,height=6.0cm, + axis y line*=left, axis x line=bottom, + xlabel={\footnotesize PARALLEL}, ylabel={\footnotesize Fmax [MHz]}, + xtick={2,4,8,16}, xmode=log, log basis x=2, + ymin=40,ymax=95, ytick={40,55,70,85}, + tick label style={font=\scriptsize}, label style={font=\footnotesize}, + grid=major, grid style={fnRule!40}, + legend style={font=\scriptsize,at={(0.5,-0.28)},anchor=north,legend columns=2}] + \addplot[fnTeal,mark=*,thick,mark options={fill=fnTeal}] + coordinates {(2,87.88)(4,75.01)(8,61.71)(16,52.13)}; + \addlegendentry{Fmax} + \draw[fnAmber,dashed,thick] (axis cs:2,80)--(axis cs:16,80); + \node[font=\scriptsize,text=fnAmber] at (axis cs:11,82.5){80 MHz target}; +\end{axis} +\begin{axis}[ + width=0.62\textwidth,height=6.0cm, + axis y line*=right, axis x line=none, + xmode=log, log basis x=2, xmin=2,xmax=16, + ylabel={\footnotesize throughput [G\,MAC/s]}, + ymin=0,ymax=3.6, ytick={0,1,2,3}, + tick label style={font=\scriptsize}, label style={font=\footnotesize}] + \addplot[fnBlue,mark=square*,thick,mark options={fill=fnBlue}] + coordinates {(2,0.703)(4,1.20)(8,1.97)(16,3.34)}; + \label{plt:tp} +\end{axis} +\end{tikzpicture} +\end{center} +\begin{center}\footnotesize\itshape\color{fnGrey} +Fundamental trade-off: as PARALLEL grows, Fmax drops (deeper routing/tree) but the +theoretical throughput rises. The blue line (squares) is the throughput +$\approx$MAC/cycle$\times$Fmax.\end{center} + +\subsection{Interpretation} +Reducing \code{PARALLEL} lowers simultaneous MACs, DSPs, adder-tree depth and routing +congestion, so Fmax rises; but the number of groups increases and hence the latency. +Frequency alone is not enough to choose: what matters is the overall throughput +$\approx$MAC/cycle$\times$frequency. + +\begin{fnnote}[Architectural choices] +\code{PARALLEL=8} is the candidate for the throughput-oriented V1: exactly 32~simultaneous +MACs with 4 neurons, DSP at $\approx$44\%, leaving resources for controller, buffers, SPI +and future pipelines. \code{PARALLEL=2} is the frequency-oriented reference: 87.88~MHz, +the only one to exceed the 80~MHz target, but it requires 128 groups for a 256-input +neuron. +\end{fnnote} + +\subsection{Critical path and the 100~MHz limit} +The 100~MHz target is not met (best result 87.88~MHz with P2). The limit is +\emph{temporal}, not one of occupancy: with P2 the FPGA is barely used (DSP $\approx$11\%, +LUT $\approx$1\%). The critical path runs through weight FF $\to$ \code{MULT18X18D} $\to$ +products $\to$ adder/carry $\to$ \code{acc\_next} $\to$ ReLU/saturation $\to$ output FF. +Exceeding 100~MHz will require one or more internal pipelines, not yet necessary to +proceed. + +\section{Full integrated system} +Real synthesis of \code{spi\_neuron\_top} (SPI + arbiter + \code{neuron\_memory} + +\code{graph\_engine} + PSRAM chain), speed grade $-8$. Before timing closure the integrated +system missed the 80~MHz target (P2 $\approx$55~MHz, P8 $\approx$45~MHz), with a critical +path entirely inside \code{neuron\_parallel}. + +\subsection{Cause: the saturation/ReLU carry chain} +Resource usage is not the cause (device below 10\% everywhere). The integrated system's +critical path is the \textbf{\code{CCU2C} carry chain of the saturation/ReLU comparator} in +\code{neuron\_parallel.v} --- \emph{not} SPI, arbiter, PSRAM, nor the Type~\#2 modules. The +saturation was written as an arithmetic comparison (\code{acc > 127}, \code{acc < -128}), +mapped by the synthesizer onto a 32-bit subtractor with a long carry chain. + +\subsection{Timing closure (2026-09-03)} +An explicit waiver of the ``datapath untouchable'' rule for a separate timing-closure task, +with the single constraint of \textbf{bit-exact equivalence} across the whole regression. +Two steps: +\begin{itemize} +\item \textbf{Step 1 --- saturation/ReLU as bit-test.} A signed 32-bit value fits INT8 iff +\code{acc[31:7]} are all equal: an AND/OR reduction over a bit slice instead of a 32-bit +carry chain. A correct, bit-exact-verified simplification; real logic gain, but on its own +submerged by placement noise. +\item \textbf{Step 2 --- pipeline register} between accumulate and activation (\code{+1} +cycle of latency per neuron, absorbed by the \code{start}/\code{done} handshake, transparent +to callers). This is the decisive step. +\end{itemize} + +\begin{tabularx}{\textwidth}{L{4.6cm} C{2.6cm} C{2.4cm} Y} +\toprule +\rowh \thd{Config} & \thd{Before} & \thd{After} & \thd{$\Delta$} \\ +\midrule +P2, real \code{.lpf} & 54.58 & \textbf{75.30} & $+38\%$ \\ +\rowa P2, 5-seed sweep & 55.59 & 73.38--75.55 & robust \\ +P8, unconstrained & 45.47 & \textbf{60.26} & $+33\%$ \\ +\rowa P8, 5-seed sweep & 43.15--50.48 & 60.26--68.87 & non-overlapping \\ +\bottomrule +\end{tabularx} +\begin{center}\footnotesize\itshape\color{fnGrey} +Fmax in MHz, real place\&route (\code{nextpnr-ecp5}). Robust across 5 seeds, not attributable +to placement luck.\end{center} + +\begin{fnnote}[Stop criterion and real margin] +80~MHz is not reached (75.30~MHz at P2, 94\% of target) but the gain is large and real +($+38\%$/$+33\%$). The next step (the \code{MULT18X18D} output register, which would touch +\code{mac\_unit.v}) was left out: 80~MHz is \emph{headroom} toward the real \code{.lpf}, not +an operating requirement. With the planned 16~MHz oscillator, even the worst measured number +($\approx$45~MHz at P8) has $2.8\times$ of margin. +\textbf{Superseded 2026-09-04}: after adding the flash subsystem (ch.~\ref{ch:spi} +§\ref{sec:flashspi}, ch.~\ref{ch:roadmap}), Fmax for the full system (P2, same real pinout + +3 new flash signals) was 66.68~MHz, critical path still on the same +\code{neuron\_parallel} accumulator chain identified above --- not a new bottleneck, the +difference from 75.30~MHz was placement/routing noise from the added pins/logic. +\textbf{Updated again the same day (Phase F7)}: made the flash SPI bus genuinely +independent (dropped the \code{CCLK}/\code{USRMCLK} reuse, added a 4th ordinary +\code{flash\_sclk} pin), Fmax re-measured \textbf{67.91~MHz} (slight improvement, critical +path confirmed still identical). Margin on the 16~MHz oscillator: $4.2\times$. +\end{fnnote} + +\begin{fnnote}[Separate future optimization] +Independent of timing closure: the \code{x\_mem}/\code{w\_mem} arrays of \code{neuron\_memory} +are still inferred as distributed RAM on LUTs instead of \code{DP16KD}. Moving them to block +RAM would free LUTs and is a Phase~7 candidate --- but it was not on the critical path +resolved here. +\end{fnnote} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/10-hardware.aux b/hardware/v1/docs/DatasheetLatex/chapters/10-hardware.aux new file mode 100644 index 0000000..4ff9588 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/10-hardware.aux @@ -0,0 +1,102 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xxvi {\LT@entry + {1}{131.50148pt}\LT@entry + {1}{340.81447pt}} +\gdef \LT@xxvii {\LT@entry + {1}{397.71999pt}\LT@entry + {1}{74.59596pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {12}Hardware design and pinout}{37}{chapter.12}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:hw}{{12}{37}{Hardware design and pinout}{chapter.12}{}} +\@writefile{toc}{\contentsline {section}{\numberline {12.1}Target device}{37}{section.12.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {12.2}Pin budget}{37}{section.12.2}\protected@file@percent } +\gdef \LT@xxviii {\LT@entry + {1}{97.35826pt}\LT@entry + {1}{40.45274pt}\LT@entry + {1}{66.06006pt}\LT@entry + {1}{40.45274pt}\LT@entry + {1}{248.5392pt}} +\@writefile{toc}{\contentsline {section}{\numberline {12.3}Signal map (top-level \texttt {spi\_neuron\_top}) --- real balls}{38}{section.12.3}\protected@file@percent } +\gdef \LT@xxix {\LT@entry + {1}{277.59943pt}\LT@entry + {1}{57.52458pt}\LT@entry + {1}{137.19194pt}} +\gdef \LT@xxx {\LT@entry + {1}{97.35826pt}\LT@entry + {1}{374.95769pt}} +\gdef \LT@xxxi {\LT@entry + {1}{114.43008pt}\LT@entry + {1}{97.35826pt}\LT@entry + {1}{260.5276pt}} +\@writefile{toc}{\contentsline {section}{\numberline {12.4}Per-bank allocation (real die geometry)}{40}{section.12.4}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {12.5}PSRAM subsystem}{40}{section.12.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {12.5.1}PSRAM connection (FPGA-exclusive)}{40}{subsection.12.5.1}\protected@file@percent } +\gdef \LT@xxxii {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{68.9055pt}\LT@entry + {1}{294.67126pt}} +\gdef \LT@xxxiii {\LT@entry + {1}{97.35826pt}\LT@entry + {1}{74.59596pt}\LT@entry + {1}{300.36172pt}} +\@writefile{toc}{\contentsline {section}{\numberline {12.6}Clock}{41}{section.12.6}\protected@file@percent } +\newlabel{sec:clock}{{12.6}{41}{Clock}{section.12.6}{}} +\@writefile{toc}{\contentsline {section}{\numberline {12.7}Power}{41}{section.12.7}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {12.8}Configuration and programming}{41}{section.12.8}\protected@file@percent } +\newlabel{sec:config}{{12.8}{41}{Configuration and programming}{section.12.8}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {12.8.1}JTAG (development / debug)}{41}{subsection.12.8.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {12.8.2}Config-SPI to boot flash}{41}{subsection.12.8.2}\protected@file@percent } +\gdef \LT@xxxiv {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{74.59596pt}\LT@entry + {1}{288.9808pt}} +\gdef \LT@xxxv {\LT@entry + {1}{125.81102pt}\LT@entry + {1}{125.81102pt}\LT@entry + {1}{220.69391pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {12.8.3}Configuration modes (\texttt {CFGMDN})}{42}{subsection.12.8.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {12.9}Open tasks before schematic capture}{42}{section.12.9}\protected@file@percent } +\@setckpt{chapters/10-hardware}{ +\setcounter{page}{44} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{12} +\setcounter{section}{9} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{10} +\setcounter{LT@tables}{35} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{70} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{21} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{103} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/10-hardware.tex b/hardware/v1/docs/DatasheetLatex/chapters/10-hardware.tex new file mode 100644 index 0000000..8191371 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/10-hardware.tex @@ -0,0 +1,326 @@ +\chapter[Hardware design and pinout]{Hardware design and signal map} +\label{ch:hw} + +\begin{fnnote}[Pinout status --- assigned and verified] +A real \code{.lpf} now exists (\code{synth/ecp5/spi\_neuron\_top.lpf}) with the top-level's +\textbf{57 signals} assigned to concrete CABGA381 balls, \textbf{verified by a full +0-error \code{nextpnr-ecp5} place\&route} (no longer \code{-{}-lpf-allow-unconstrained}). The +balls come from Project~Trellis's device database (\code{iodb.json}, the same nextpnr uses) +and were independently validated against §4.3.2 of the official Lattice datasheet (per-bank +GPIO counts: exact match on 6 of 7 banks, off by 1 ball on bank~3, immaterial since no +assigned signal uses it). \code{TRELLIS\_IO}: 57/245 (23\%). Current-build Fmax (full system +incl. flash subsystem with an independent SPI bus, Phase F7, 2026-09-04) \textbf{67.91~MHz}, +critical path confirmed still on \code{neuron\_parallel}'s accumulator chain, unchanged from +earlier builds (ch.~\ref{ch:impl}). Pin-by-pin summary at the front of the document +(pp.~2--3). The boot config-SPI and JTAG balls do not appear here: they are dedicated +fixed-function pins with no corresponding RTL port, nextpnr never requires them (0 errors), +they matter only for the PCB schematic. +\end{fnnote} + +\section{Target device} +\begin{tabularx}{\textwidth}{L{4.2cm}Y} +\toprule +\rowh \thd{Parameter} & \thd{Value} \\ +\midrule +Device & Lattice ECP5 \code{LFE5U-45F-8BG381C} \\ +\rowa Package & CABGA381 (381 balls) \\ +Speed grade & $-8$ (the fastest of the ECP5 family) \\ +\rowa Resources & $\approx$44k LUT/FF, 72$\times$\code{MULT18X18D}, \code{DP16KD} block RAM \\ +Usable I/O & $\approx$232 balls out of 381 (rest: power/ground/NC) \\ +\bottomrule +\end{tabularx} + +\section{Pin budget} +The project requires about 60 signals out of $\approx$232 usable I/Os: ample margin +($>$170 free pins), so the board is not pin-constrained. + +\begin{tabularx}{\textwidth}{Y C{2.2cm}} +\toprule +\rowh \thd{Function} & \thd{Pins} \\ +\midrule +PSRAM (22 address, 16 data, 6 control) & up to 44 \\ +\rowa Application SPI (\code{sclk/mosi/miso/cs\_n}) & 4 \\ +Clock, reset & 2 \\ +\rowa Host attention pins (\code{irq\_n}, \code{data\_ready\_n}) & 2 \\ +Flash runtime SPI bus (\code{flash\_sclk/flash\_mosi/flash\_miso/flash\_cs\_n}, ordinary GPIO, fully independent bus --- Phase F7) & 4 \\ +\rowa JTAG (bring-up / debug, recommended) & 4 \\ +\midrule +\rowh \thd{Total} & \thd{$\approx$60} \\ +\bottomrule +\end{tabularx} + +\section{Signal map (top-level \texttt{spi\_neuron\_top}) --- real balls} +Real assignment of the top-level's 57 signals, verified by place\&route, \textbf{an +individual ball for every bit} (never a bus range). I/O standard: LVCMOS33 (3.3~V I/O +supply). The balls come from the real place\&route-verified \code{.lpf}. A compact summary +of the same table also appears at the front of the document (pp.~2--3). + +\renewcommand{\arraystretch}{1.1} +\begin{tabularx}{\textwidth}{L{3.0cm} C{1.0cm} C{1.9cm} C{1.0cm} Y} +\toprule +\rowh \thd{Signal} & \thd{Dir} & \thd{Ball} & \thd{Bank} & \thd{Function} \\ +\midrule +\multicolumn{5}{l}{\textit{\color{fnDark}Clock and reset (bank 7, left edge)}}\\ +\code{clk} & IN & H5 & 7 & System clock on pad \code{GR\_PCLK7\_0} (dedicated global clock). \\ +\rowa \code{rst} & IN & B4 & 7 & Global synchronous reset, active high. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}Application SPI (bank 7, opposite the PSRAM bus)}}\\ +\code{sclk} & IN & B5 & 7 & SPI clock (CPOL=0, CPHA=0). \\ +\rowa \code{mosi} & IN & C5 & 7 & Master-Out Slave-In. \\ +\code{miso} & OUT & A3 & 7 & Master-In Slave-Out (driven on the falling edge). \\ +\rowa \code{cs\_n} & IN & B3 & 7 & Active-low chip-select. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}Host attention pins (bank 7, active-low, level)}}\\ +\code{data\_ready\_n} & OUT & C3 & 7 & Low while a result awaits reading (mirrors \code{STATUS.done}, clear on STATUS read). \\ +\rowa \code{irq\_n} & OUT & C4 & 7 & Low if the graph load-time guard has tripped (mirrors \code{STATUS.err}); clears only on \code{RESET} or a fresh \code{run\_start}, \emph{not} on a STATUS read. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}Flash subsystem --- independent SPI bus toward the onboard W25Q128JV (bank 7, Phases F1-F7)}}\\ +\code{flash\_sclk} & OUT & E3 & 7 & SPI clock toward the flash --- ordinary GPIO, no config primitive involved (Phase F7). \\ +\rowa \code{flash\_mosi} & OUT & D3 & 7 & Master-Out Slave-In toward the flash. \\ +\code{flash\_miso} & IN & D5 & 7 & Master-In Slave-Out from the flash. \\ +\rowa \code{flash\_cs\_n} & OUT & E4 & 7 & Flash chip-select, active low. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}PSRAM address bus \code{psram\_a[21:0]} --- 22 individual balls (bank 2)}}\\ +\code{psram\_a[0]} & OUT & E16 & 2 & PSRAM A0 \\ +\rowa \code{psram\_a[1]} & OUT & F16 & 2 & PSRAM A1 \\ +\code{psram\_a[2]} & OUT & D18 & 2 & PSRAM A2 \\ +\rowa \code{psram\_a[3]} & OUT & E17 & 2 & PSRAM A3 \\ +\code{psram\_a[4]} & OUT & E18 & 2 & PSRAM A4 \\ +\rowa \code{psram\_a[5]} & OUT & F18 & 2 & PSRAM A5 \\ +\code{psram\_a[6]} & OUT & F17 & 2 & PSRAM A6 \\ +\rowa \code{psram\_a[7]} & OUT & G16 & 2 & PSRAM A7 \\ +\code{psram\_a[8]} & OUT & G18 & 2 & PSRAM A8 \\ +\rowa \code{psram\_a[9]} & OUT & H16 & 2 & PSRAM A9 \\ +\code{psram\_a[10]} & OUT & H17 & 2 & PSRAM A10 \\ +\rowa \code{psram\_a[11]} & OUT & H18 & 2 & PSRAM A11 \\ +\code{psram\_a[12]} & OUT & J16 & 2 & PSRAM A12 \\ +\rowa \code{psram\_a[13]} & OUT & J17 & 2 & PSRAM A13 \\ +\code{psram\_a[14]} & OUT & C20 & 2 & PSRAM A14 \\ +\rowa \code{psram\_a[15]} & OUT & D19 & 2 & PSRAM A15 \\ +\code{psram\_a[16]} & OUT & E19 & 2 & PSRAM A16 \\ +\rowa \code{psram\_a[17]} & OUT & E20 & 2 & PSRAM A17 \\ +\code{psram\_a[18]} & OUT & F19 & 2 & PSRAM A18 \\ +\rowa \code{psram\_a[19]} & OUT & F20 & 2 & PSRAM A19 \\ +\code{psram\_a[20]} & OUT & G20 & 2 & PSRAM A20 \\ +\rowa \code{psram\_a[21]} & OUT & H20 & 2 & PSRAM A21 \\ +\code{psram\_a[22]} & OUT & P18 & 3 & Always 0 (byte$\to$word shift): NC on the board. \\ +\multicolumn{5}{l}{\textit{\color{fnDark}PSRAM data bus \code{psram\_dq[15:0]} --- 16 individual balls (banks 2 and 3)}}\\ +\rowa \code{psram\_dq[0]} & IO & K18 & 2 & PSRAM DQ0 \\ +\code{psram\_dq[1]} & IO & C18 & 2 & PSRAM DQ1 (dual-function ball, used as ordinary GPIO). \\ +\rowa \code{psram\_dq[2]} & IO & D17 & 2 & PSRAM DQ2 \\ +\code{psram\_dq[3]} & IO & D20 & 2 & PSRAM DQ3 \\ +\rowa \code{psram\_dq[4]} & IO & G19 & 2 & PSRAM DQ4 \\ +\code{psram\_dq[5]} & IO & J18 & 2 & PSRAM DQ5 \\ +\rowa \code{psram\_dq[6]} & IO & J19 & 2 & PSRAM DQ6 \\ +\code{psram\_dq[7]} & IO & J20 & 2 & PSRAM DQ7 \\ +\rowa \code{psram\_dq[8]} & IO & K19 & 2 & PSRAM DQ8 \\ +\code{psram\_dq[9]} & IO & K20 & 2 & PSRAM DQ9 \\ +\rowa \code{psram\_dq[10]} & IO & L17 & 3 & PSRAM DQ10 \\ +\code{psram\_dq[11]} & IO & M18 & 3 & PSRAM DQ11 \\ +\rowa \code{psram\_dq[12]} & IO & M17 & 3 & PSRAM DQ12 \\ +\code{psram\_dq[13]} & IO & N16 & 3 & PSRAM DQ13 \\ +\rowa \code{psram\_dq[14]} & IO & N18 & 3 & PSRAM DQ14 \\ +\code{psram\_dq[15]} & IO & P17 & 3 & PSRAM DQ15 (bidirectional tri-state data bus, \code{dq\_oe} = direction). \\ +\multicolumn{5}{l}{\textit{\color{fnDark}PSRAM control (bank 3)}}\\ +\rowa \code{psram\_ce\_n} & OUT & N17 & 3 & Chip enable, active low. \\ +\code{psram\_oe\_n} & OUT & R16 & 3 & Output enable (read). \\ +\rowa \code{psram\_we\_n} & OUT & R17 & 3 & Write enable (write). \\ +\code{psram\_lb\_n} & OUT & T16 & 3 & Lower-byte enable (DQ[7:0]). \\ +\rowa \code{psram\_ub\_n} & OUT & N19 & 3 & Upper-byte enable (DQ[15:8]). \\ +\code{psram\_zz\_n} & OUT & N20 & 3 & Sleep/snooze (inactive=high in operation). \\ +\bottomrule +\end{tabularx} +\renewcommand{\arraystretch}{1.25} + +\begin{fnnote}[Board signals not exposed as RTL ports] +Not ports of \code{spi\_neuron\_top} but required at board level: the \textbf{configuration +SPI} lines to the onboard NOR flash (\code{PROGRAMN}/\code{INITN}/\code{DONE}/\code{CCLK}\ldots, +the datasheet's ``Miscellaneous Dedicated Pins'') and the 4 \textbf{JTAG} lines +(\code{TCK}/\code{TMS}/\code{TDI}/\code{TDO}), the \textbf{oscillator} on the \code{PCLK} +pad, the \textbf{power supplies}. Their ball numbers are not in the Lattice datasheet +(separate file) but are not needed here: dedicated pins with no RTL port, nextpnr never +requires them (0 errors), they matter only for the PCB schematic. +\end{fnnote} + +\begin{fnwarn}[Application SPI separate from configuration SPI] +The application SPI (\code{sclk/mosi/miso/cs\_n}) must land on ordinary I/Os, +\textbf{never} on the configuration-SPI pins: the config-SPI clock pin is not reusable as +a general-purpose input after configuration without a board-level workaround. Keeping them +physically separate avoids that problem. +\end{fnwarn} + +\section{Per-bank allocation (real die geometry)} +The placement follows the die-edge geometry (from Trellis's \code{globals.json}, +ball~$\to$~(col,row)~$\to$~bank): banks \textbf{2 and 3} sit contiguously along the chip's +\textbf{right} edge and together hold the entire PSRAM bus (44+1 signals) --- exactly the +``one or two adjacent banks'' recommended. Bank \textbf{7} (\textbf{left} edge, physically +opposite the PSRAM bus) holds the application SPI and clock/reset, deliberately on the far +side so the two buses do not cross. \code{clk} is on the dedicated pad \code{H5} +(\code{GR\_PCLK7\_0}). Where a bank ran out of plain balls (part of \code{psram\_dq}), the +next dual-function ball was used as ordinary GPIO, confirmed usable by the real place\&route. + +\begin{tabularx}{\textwidth}{Y C{1.6cm} L{4.4cm}} +\toprule +\rowh \thd{Signal group} & \thd{\# pins} & \thd{Bank (real)} \\ +\midrule +PSRAM addresses \code{psram\_a[21:0]} & 22 & bank 2 (right edge) \\ +\rowa PSRAM data \code{psram\_dq[15:0]} & 16 & banks 2 + 3 (adjacent) \\ +PSRAM control (ce/oe/we/lb/ub/zz) & 6 & bank 3 \\ +\rowa Application SPI & 4 & bank 7 (left edge) \\ +Host attention pins (\code{irq\_n}, \code{data\_ready\_n}) & 2 & bank 7 \\ +\rowa Independent flash SPI bus (\code{flash\_sclk/flash\_mosi/flash\_miso/flash\_cs\_n}) & 4 & bank 7 \\ +Clock / reset & 2 & bank 7, \code{clk} on \code{GR\_PCLK7\_0} \\ +\rowa Boot config SPI / JTAG & --- & dedicated pins (outside RTL, PCB only) \\ +\bottomrule +\end{tabularx} + +\section{PSRAM subsystem} +The \code{psram\_controller.v} controller implements an \textbf{asynchronous parallel} +interface (address bus, 16-bit data, \code{ce\_n/oe\_n/we\_n} and byte-lanes +\code{lb\_n/ub\_n}, plus \code{zz\_n}) with an access latency of \textbf{70~ns} wired as +$\lceil 70\,\text{ns}\times f_{clk}\rceil$. It is an asynchronous-SRAM-style bus, not QSPI. + +\begin{tabularx}{\textwidth}{L{3.0cm}Y} +\toprule +\rowh \thd{Role} & \thd{Component} \\ +\midrule +Working memory & ISSI \code{IS66WVE4M16EBLL-70BLI} --- 64\,Mbit parallel PSRAM (4M$\times$16, 8~MB), async, 70~ns, an exact match to the controller timing. \\ +\rowa Fallback & ISSI \code{IS61WV6416DBLL} / \code{IS61WV102416BLL} (true async SRAM, drop-in on the same signals, \code{zz\_n} inactive, $\sim$10~ns, lower density). \\ +Persistent storage & Winbond \code{W25Q128JV} --- 16~MB SPI NOR flash for bitstream, weights, bias, network metadata. \\ +\bottomrule +\end{tabularx} + +\subsection{PSRAM connection (FPGA-exclusive)} +The PSRAM is driven \textbf{exclusively by the FPGA} through \code{psram\_controller.v}: no +external master touches the bus. The external host (RPi/ESP32/MCU) only speaks SPI to the +FPGA and never touches these lines. Pin-by-pin connection FPGA~$\leftrightarrow$~ISSI +\code{IS66WVE4M16EBLL-70BLI}: + +\begin{tabularx}{\textwidth}{L{3.6cm} L{3.0cm} Y} +\toprule +\rowh \thd{FPGA signal} & \thd{PSRAM pin} & \thd{Function} \\ +\midrule +\code{psram\_a[21:0]} & A0--A21 & Address bus (22 lines, 8~MB word address). \\ +\rowa \code{psram\_dq[15:0]} & DQ0--DQ15 & Bidirectional data bus (tri-state, \code{dq\_oe}=direction). \\ +\code{psram\_ce\_n} & CE\# & Chip enable (active low). \\ +\rowa \code{psram\_oe\_n} & OE\# & Output enable (read). \\ +\code{psram\_we\_n} & WE\# & Write enable (write). \\ +\rowa \code{psram\_lb\_n} & LB\# & Lower-byte enable (DQ[7:0]). \\ +\code{psram\_ub\_n} & UB\# & Upper-byte enable (DQ[15:8]). \\ +\rowa \code{psram\_zz\_n} & ZZ\# & Sleep/snooze (held high in operation). \\ +\bottomrule +\end{tabularx} +PSRAM supply: \textbf{3.3~V} (BLL variant), on the same I/O rail as banks 2/3 to which it is +wired (ch.~\ref{ch:hw}, real balls). Decoupling per supply pin per the ISSI datasheet. + +\section{Clock} +\label{sec:clock} +There is no PLL in the RTL yet: \code{CLK\_FREQ\_MHZ} is a \emph{timing parameter} (it +feeds the PSRAM access formulas), not a clock generator. The mounted oscillator drives +\code{clk} directly. Recommendation: a 16~MHz MEMS oscillator (SiTime SiT2001B family), +well below the 67.91~MHz Fmax of the full integrated system (incl. flash subsystem, +ch.~\ref{ch:impl}). \code{CLK\_FREQ\_MHZ} must +be set to the real value of the mounted oscillator, otherwise the PSRAM timing comes out +wrong. + +\section{Power} +A \textbf{three-rail} tree (the Lattice eval board's SERDES section is not needed and is +omitted: no 1.2~V \code{VCCA}/\code{VCCHTX}): + +\begin{tabularx}{\textwidth}{L{3.4cm} C{2.0cm} Y} +\toprule +\rowh \thd{Rail} & \thd{Voltage} & \thd{Feeds / regulator} \\ +\midrule +\code{VCC} (core) & 1.1~V & FPGA core logic. Buck \code{TLV62568}, $\geq$600~mA. \\ +\rowa \code{VCCIO0/2/3/6/7} & 3.3~V & I/O of all used banks + PSRAM. Buck \code{TLV62568}, 1~A. \\ +\code{VCCAUX} & 2.5~V & FPGA auxiliary. LDO \code{TLV73325}, 10~mA. \\ +\bottomrule +\end{tabularx} +Decoupling: at least one capacitor per supply pin + bulk per rail, per the Lattice ECP5 +hardware checklist. Input: external 12~V (or match the bucks to the source). + +\section{Configuration and programming} +\label{sec:config} +Writing the FPGA ``map'' (bitstream) happens through dedicated silicon pins, \textbf{not} +RTL top-level ports. Default mode: \textbf{MSPI} --- automatic boot from the NOR flash at +power-on (standalone product); JTAG available for development. + +\subsection{JTAG (development / debug)} +\begin{tabularx}{\textwidth}{L{3.0cm} C{2.2cm} Y} +\toprule +\rowh \thd{Signal} & \thd{Ball\textsuperscript{$\dagger$}} & \thd{Function} \\ +\midrule +\code{TCK} & T5 & Test clock. \\ +\rowa \code{TDI} & R5 & Test data in. \\ +\code{TDO} & V4 & Test data out. \\ +\rowa \code{TMS} & U5 & Test mode select. \\ +\bottomrule +\end{tabularx} + +\subsection{Config-SPI to boot flash} +The FPGA loads the bitstream from the \textbf{Winbond \code{W25Q128JV}} (128~Mbit SPI NOR, +Quad read) at power-on. The flash subsystem (\code{rtl/flash\_slot\_manager.v}, Phases +F1-F7, ch.~\ref{ch:impl}) uses the \textbf{same physical flash} for network weights/bias/ +metadata at runtime, FPGA-exclusive access: after configuration, the FPGA regains control +of the chip through a fully independent 4-wire SPI bus, \code{flash\_sclk/flash\_mosi/ +flash\_miso/flash\_cs\_n} (all ordinary GPIO, pp.~2--3 and §``Signal map'' --- no ECP5 +config primitive involved, Phase F7) --- this still implies a board-level dual connection +(the flash's DI/DO/CS/CLK pins wired both to the dedicated boot pins below and to these 4 +ordinary balls, since it is the same physical chip serving both roles), not yet captured in +a schematic (none exists yet, see the checklist below). + +\begin{tabularx}{\textwidth}{L{3.4cm} C{2.2cm} Y} +\toprule +\rowh \thd{Signal} & \thd{Ball\textsuperscript{$\dagger$}} & \thd{Function} \\ +\midrule +\code{CCLK/MCLK/SCK} & U3 & Configuration clock. \\ +\rowa \code{DQ0\_MOSI} & W2 & Config data (MOSI). \\ +\code{DQ1\_MISO} & V2 & Config data (MISO). \\ +\rowa \code{BUSY\_CSSPIN} & R2 & Flash chip-select. \\ +\code{DQ2 / DQ3} & Y2 / W1 & Quad-read lines. \\ +\rowa \code{PROGRAMN} & W3 & Start reconfiguration (button, active low). \\ +\code{INITN} & V3 & Init / configuration error (LED). \\ +\rowa \code{DONE} & Y3 & Configuration complete (LED). \\ +\code{CFGMDN[2:0]} & R4/T4/U4 & Mode select (see below). \\ +\bottomrule +\end{tabularx} + +\subsection{Configuration modes (\texttt{CFGMDN})} +\begin{tabularx}{\textwidth}{L{4.0cm} C{4.0cm} Y} +\toprule +\rowh \thd{Mode} & \thd{CFGMDN[2:0]} & \thd{Use} \\ +\midrule +MSPI (boot from flash) & \code{010} & \textbf{Default} --- standalone. \\ +\rowa SSPI (slave SPI) & \code{001} & Config from external host. \\ +SCM (slave serial) & \code{101} & Serial config. \\ +\rowa SPCM (slave parallel) & \code{111} & 8-bit parallel config. \\ +\bottomrule +\end{tabularx} + +\begin{fnwarn}[Configuration balls to verify on the 45F] +\textsuperscript{$\dagger$}The JTAG and config-SPI balls listed here are the \emph{reference} +from the Lattice eval board (85F device). JTAG and config-SPI are dedicated, largely fixed +pins in the ECP5 family, but the exact positions on the \code{LFE5U-45F-8BG381C} target must +be confirmed against the Lattice 45F pinout file (Diamond/Radiant or the Trellis database) +before committing them to the schematic, as already done for the application signals +(ch.~\ref{ch:hw}). +\textbf{Distinct from this open item} (do not conflate the two): the flash subsystem's own +runtime SPI pins (\code{flash\_sclk}, \code{flash\_mosi}, \code{flash\_miso}, +\code{flash\_cs\_n} --- Phases F1-F6, made fully independent in Phase F7) \textbf{are} real, +pinned, place\&route-verified ordinary GPIO on bank 7 --- \textbf{no pin shared with any +ECP5 config primitive}: an earlier version reused the boot \code{CCLK} pad for SCLK via +\code{USRMCLK}, dropped in Phase F7 (\code{USRMCLK} utilisation in the current full-system +synthesis is 0/1, confirming it is no longer used at all). +\end{fnwarn} + +\section{Open tasks before schematic capture} +\begin{itemize} +\item[\OK] \code{ADDR\_WIDTH}=23 (full 8~MB) across all modules and testbenches. +\item[\OK] Real \code{.lpf} with the CABGA381 ball assignment, place\&route-verified with +0 errors (\code{synth/ecp5/spi\_neuron\_top.lpf}, 57 signals incl. flash subsystem). +\item[\OK] Boot/persistence flash subsystem (Phases F1-F7): SPI master, copy engine, +CRC32 slot catalog, fully independent 4-wire SPI bus, real synthesis at 0 errors, Fmax +67.91~MHz (\code{WORKLOG.md}). +\item[$\square$] Confirm PSRAM/SPI signal integrity at the actually mounted clock. +\item[$\square$] Board-level dual-wiring diagram for the flash's DI/DO/CS/CLK pins (dedicated + boot pins + the flash subsystem's 4 ordinary balls) --- not yet captured in a schematic. +\item[$\square$] Choice of the JTAG connector footprint. +\item[$\square$] Schematic capture (KiCad or other): no schematic exists yet for this +device/package combination. +\end{itemize} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/11-registri.aux b/hardware/v1/docs/DatasheetLatex/chapters/11-registri.aux new file mode 100644 index 0000000..48a1a89 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/11-registri.aux @@ -0,0 +1,58 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xxxvi {\LT@entry + {1}{51.83368pt}\LT@entry + {1}{103.04872pt}\LT@entry + {1}{80.28644pt}\LT@entry + {1}{237.14711pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {13}Quick reference}{44}{chapter.13}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:ref}{{13}{44}{Quick reference}{chapter.13}{}} +\@writefile{toc}{\contentsline {section}{\numberline {13.1}SPI opcodes}{44}{section.13.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {13.2}STATUS byte}{44}{section.13.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {13.3}SET\_BASE selectors}{44}{section.13.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {13.4}Descriptor table (11 bytes/layer, MSB-first)}{44}{section.13.4}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {13.5}Build parameters}{44}{section.13.5}\protected@file@percent } +\@setckpt{chapters/11-registri}{ +\setcounter{page}{45} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{13} +\setcounter{section}{5} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{1} +\setcounter{LT@tables}{36} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{70} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{21} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{109} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/11-registri.tex b/hardware/v1/docs/DatasheetLatex/chapters/11-registri.tex new file mode 100644 index 0000000..ee1cd0f --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/11-registri.tex @@ -0,0 +1,80 @@ +\chapter{Quick reference} +\label{ch:ref} + +\section{SPI opcodes} +\begin{tabularx}{\textwidth}{C{1.4cm} L{3.2cm} C{2.4cm} Y} +\toprule +\rowh \thd{Value} & \thd{Name} & \thd{Response} & \thd{Summary} \\ +\midrule +\op{0x00} & NOP & --- & idle \\ +\rowa \op{0x01} & WRITE\_RAM & --- & PSRAM block write \\ +\op{0x02} & READ\_RAM & \code{len} B & PSRAM block read \\ +\rowa \op{0x0F} & RESET & --- & engine reset + STATUS latch \\ +\op{0x10} & SET\_BASE & --- & set base/register (sel 0..10) \\ +\rowa \op{0x20} & START & --- & single-layer start \\ +\op{0x21} & STATUS & 1 B & busy(live)/done(sticky) \\ +\rowa \op{0x22} & READ\_OUTPUT & N\_NEURONS B & \code{y\_bus} \\ +\op{0x23} & RUN\_NETWORK & --- & multi-layer start \\ +\rowa \op{0x30} & READ\_CONFIG & 11 B & configuration record \\ +\bottomrule +\end{tabularx} + +\section{STATUS byte} +\begin{center} +\begin{tikzpicture}[font=\scriptsize] +\foreach \i/\lbl [count=\x from 0] in {7/0,6/0,5/0,4/0,3/0,2/0,1/{done},0/{busy}}{ + \node[fnreg,minimum width=13mm,minimum height=9mm] (b\x) at (\x*13mm,0) {\lbl}; + \node[font=\tiny,text=fnGrey,above=0.5mm of b\x] {bit \i}; +} +\node[fill=fnAmber,text=white,rounded corners=1pt,inner sep=1.5pt,font=\tiny] + at (b7.center){reserved = 0}; +\node[fill=fnTeal,text=white,rounded corners=1pt,inner sep=1.5pt,font=\tiny] + at (b6.center){}; +\end{tikzpicture} +\end{center} +\code{done} is sticky, clear-on-read; \code{busy} is live. + +\section{SET\_BASE selectors} +\begin{multicols}{2}\footnotesize +\begin{itemize} +\item 0 --- \code{x\_base} +\item 1 --- \code{w\_base} +\item 2 --- \code{bias\_addr} +\item 3 --- \code{table\_base} +\item 4 --- \code{buf\_a\_base} +\columnbreak +\item 5 --- \code{buf\_b\_base} +\item 6 --- \code{activation} (single-layer) +\item 7 --- \code{n\_inputs\_real} (single-layer) +\item 8 --- \code{n\_neurons\_real} (single-layer) +\item 9 --- \code{num\_neurons\_graph} (Type \#2) +\item 10 --- \code{n\_out} (Type \#2) +\end{itemize} +\end{multicols} + +\section{Descriptor table (11 bytes/layer, MSB-first)} +\begin{center} +\begin{tikzpicture}[font=\scriptsize,node distance=0mm] + \node[fnreg,minimum width=20mm,minimum height=8mm](a){\code{w\_base}\\3B}; + \node[fnreg,minimum width=20mm,minimum height=8mm,right=0mm of a](b){\code{bias\_addr}\\3B}; + \node[fnreg,minimum width=14mm,minimum height=8mm,right=0mm of b](c){\code{act}\\1B}; + \node[fnreg,minimum width=22mm,minimum height=8mm,right=0mm of c](d){\code{n\_inputs\_real}\\2B}; + \node[fnreg,minimum width=22mm,minimum height=8mm,right=0mm of d](e){\code{n\_neurons\_real}\\2B}; +\end{tikzpicture} +\end{center} + +\section{Build parameters} +\begin{multicols}{2}\footnotesize +\begin{itemize} +\item \code{DATA\_WIDTH} --- 8 (INT8) +\item \code{ACC\_WIDTH} --- 32 (INT32) +\item \code{N\_INPUTS} --- max inputs +\item \code{N\_NEURONS} --- max neurons +\item \code{PARALLEL} --- simultaneous MACs +\columnbreak +\item \code{N\_LAYERS} --- max layers +\item \code{ADDR\_WIDTH} --- 23 (8 MB) +\item \code{MEM\_DATA\_WIDTH} --- 16 +\item \code{CLK\_FREQ\_MHZ} --- PSRAM timing +\end{itemize} +\end{multicols} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.aux b/hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.aux new file mode 100644 index 0000000..f5abfa0 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.aux @@ -0,0 +1,60 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xxxvii {\LT@entry + {1}{46.14322pt}\LT@entry + {1}{142.88284pt}\LT@entry + {1}{63.21504pt}\LT@entry + {1}{220.07484pt}} +\gdef \LT@xxxviii {\LT@entry + {1}{340.81447pt}\LT@entry + {1}{131.50148pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {14}Roadmap and development status}{45}{chapter.14}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:roadmap}{{14}{45}{Roadmap and development status}{chapter.14}{}} +\@writefile{toc}{\contentsline {section}{\numberline {14.1}Development phases}{45}{section.14.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {14.2}Component status}{45}{section.14.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {14.3}Architectural principle (summary)}{46}{section.14.3}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {14.4}Long-term vision}{46}{section.14.4}\protected@file@percent } +\@setckpt{chapters/12-roadmap}{ +\setcounter{page}{47} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{14} +\setcounter{section}{4} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{2} +\setcounter{LT@tables}{38} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{72} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{21} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{114} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.tex b/hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.tex new file mode 100644 index 0000000..f9e80b0 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/12-roadmap.tex @@ -0,0 +1,64 @@ +\chapter{Roadmap and development status} +\label{ch:roadmap} + +\section{Development phases} +\begin{tabularx}{\textwidth}{C{1.2cm} L{4.6cm} C{1.8cm} Y} +\toprule +\rowh \thd{Phase} & \thd{Title} & \thd{Status} & \thd{Content} \\ +\midrule +1 & Parametric layer & \OK & inputs/neurons/parallelism, accumulation, bias, ReLU; test 32$\times$4/P=8. \\ +\rowa 2 & Parameter sweep & \OK & multiple configurations incl. non-multiple and degenerate; elaboration guard added. \\ +3 & Memory architecture & \OK & \code{neuron\_memory} single/multi-neuron, real PSRAM tested; multi-layer buffers $\to$ Phase~5. \\ +\rowa 4 & SPI interface & \OK & \code{spi\_slave}+\code{spi\_engine}, 17 opcodes incl. flash subsystem, Fmax checked at full-system level. \\ +5 & Multi-layer network & \OK$^\dagger$ & \code{layer\_sequencer}, configurable activations, runtime width; real toolchain checked. \\ +\rowa 6 & Host software & planned & Linux and ESP32 drivers on the same protocol. \\ +7 & Optimization & in progress & timing closure done (55$\to$75~MHz); PSRAM page-mode done (gather bandwidth +42\%); $x$/$w$ block RAM remains. \\ +\rowa 8 & Hardware training (opt.) & future & backprop, gradients, weight update. \\ +9 & Flash subsystem (F1-F7) & \OK & dedicated SPI master, flash$\leftrightarrow$PSRAM copy engine, 16-slot catalog with CRC32, fully independent 4-wire SPI bus (F7), 8 opcodes (\op{0x40}--\op{0x47}, ch.~\ref{ch:spi} §\ref{sec:flashspi}); real synthesis 0 errors. \\ +\bottomrule +\end{tabularx} +\begin{center}\footnotesize\itshape\color{fnGrey} +$\dagger$ RTL, unit tests and end-to-end over simulated SPI complete; timing closure done: +75.30~MHz (P2) / 60.26~MHz (P8) at the time of Phase~5, bit-exact across the whole +regression; Fmax of the full system after Phase~9 (incl. independent flash subsystem): +\textbf{67.91~MHz} (ch.~\ref{ch:impl}).\end{center} + +\section{Component status} +\begin{tabularx}{\textwidth}{Y C{4.2cm}} +\toprule +\rowh \thd{Component} & \thd{Status} \\ +\midrule +Parametric neural layer & \OK{} working \\ +\rowa Parametric inputs/neurons/parallelism & \OK \\ +Accumulation, bias, ReLU & \OK \\ +\rowa 32$\times$4 / P=8 validation & \OK \\ +Dedicated RAM (interface + controller + INT8 access) & \OK{} tested on real PSRAM \\ +\rowa SPI interface (17 opcodes incl. RUN\_NETWORK + flash) & \OK{} Fmax at full-system level \\ +Dual SPI & future \\ +\rowa Multi-layer engine & \OK{} timing closure 75.30~MHz (P2) at the time of Phase~5 \\ +Configurable activations (ACT\_NONE/ACT\_RELU) & \OK \\ +\rowa Runtime network width (one bitstream, any topology) & \OK{} measured savings \\ +Type \#2 graph network (act\_buffer, graph\_engine, netasm) & \OK{} RTL + tests + synthesis \\ +\rowa CABGA381 pinout (real \code{.lpf}, 57 signals incl. flash) & \OK{} place\&route-verified, 0 errors \\ +PSRAM page-mode (G7) & \OK{} done (37.53 cycles/edge, bandwidth +42\%) \\ +\rowa Flash subsystem (SPI master, copy engine, CRC32 catalog, independent bus F7) & \OK{} real synthesis 0 errors, Fmax 67.91~MHz \\ +Real bitstream (\code{ecppack}, P2/P8) & \OK{} 0 errors, part LFE5U-45F-8CABGA381 \\ +\rowa Linux / ESP32 host driver & planned \\ +Hardware training & future \\ +\bottomrule +\end{tabularx} + +\section{Architectural principle (summary)} +\begin{fnspec}[Foundation of the project] +The FPGA implements the neural machine and owns its own RAM; the host configures and uses +the machine. A build fixes the \emph{ceiling} (max layers, max width, PARALLEL); the host +configures the \emph{actual} network --- number of layers, per-layer width, per-layer +activation, trained parameters --- entirely at runtime, over SPI, into the FPGA's local +memory. A single bitstream serves any topology up to that ceiling. +\end{fnspec} + +\section{Long-term vision} +The final goal is a reusable hardware block integrable into different future projects: +the host platform can change (Linux, ESP32, MCU, PC) without changing the fundamental +architecture of the engine. The FPGA becomes a dedicated neural computation peripheral, +optimized for the topology required by each application. diff --git a/hardware/v1/docs/DatasheetLatex/chapters/A-moduli.aux b/hardware/v1/docs/DatasheetLatex/chapters/A-moduli.aux new file mode 100644 index 0000000..5e588c1 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/A-moduli.aux @@ -0,0 +1,65 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\gdef \LT@xxxix {\LT@entry + {1}{108.73918pt}\LT@entry + {1}{68.9055pt}\LT@entry + {1}{294.67126pt}} +\gdef \LT@xl {\LT@entry + {1}{114.43008pt}\LT@entry + {1}{108.73918pt}\LT@entry + {1}{249.14668pt}} +\@writefile{toc}{\contentsline {chapter}{\numberline {A}Modules and toolchain}{47}{appendix.A}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\newlabel{ch:appmod}{{A}{47}{Modules and toolchain}{appendix.A}{}} +\@writefile{toc}{\contentsline {section}{\numberline {A.1}List of RTL modules}{47}{section.A.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {A.2}Ports of the top-level \texttt {spi\_neuron\_top}}{47}{section.A.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {A.3}Toolchain}{47}{section.A.3}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {A.3.1}Main nextpnr parameters}{47}{subsection.A.3.1}\protected@file@percent } +\gdef \LT@xli {\LT@entry + {1}{165.6447pt}\LT@entry + {1}{306.67125pt}} +\@writefile{toc}{\contentsline {subsection}{\numberline {A.3.2}Simulation example}{48}{subsection.A.3.2}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {A.4}Main testbenches}{48}{section.A.4}\protected@file@percent } +\@setckpt{chapters/A-moduli}{ +\setcounter{page}{49} +\setcounter{equation}{0} +\setcounter{enumi}{0} +\setcounter{enumii}{0} +\setcounter{enumiii}{0} +\setcounter{enumiv}{0} +\setcounter{footnote}{0} +\setcounter{mpfootnote}{0} +\setcounter{part}{0} +\setcounter{chapter}{1} +\setcounter{section}{4} +\setcounter{subsection}{0} +\setcounter{subsubsection}{0} +\setcounter{paragraph}{0} +\setcounter{subparagraph}{0} +\setcounter{figure}{0} +\setcounter{table}{3} +\setcounter{LT@tables}{41} +\setcounter{LT@chunks}{1} +\setcounter{parentequation}{0} +\setcounter{tcbbreakpart}{1} +\setcounter{tcblayer}{0} +\setcounter{tcolorbox@number}{72} +\setcounter{tcbrastercolumn}{1} +\setcounter{tcbrasterrow}{1} +\setcounter{tcbrasternum}{1} +\setcounter{tcbraster}{0} +\setcounter{lstnumber}{5} +\setcounter{tcblisting}{0} +\setcounter{caption@flags}{0} +\setcounter{continuedfloat}{0} +\setcounter{tikztiming@nrows}{4} +\setcounter{tikztimingrows}{0} +\setcounter{tikztimingtrans}{-1} +\setcounter{tikztimingtranspos}{0} +\setcounter{section@level}{0} +\setcounter{Item}{0} +\setcounter{Hfootnote}{0} +\setcounter{bookmark@seq@number}{121} +\setcounter{lstlisting}{0} +} diff --git a/hardware/v1/docs/DatasheetLatex/chapters/A-moduli.tex b/hardware/v1/docs/DatasheetLatex/chapters/A-moduli.tex new file mode 100644 index 0000000..2c798a0 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/chapters/A-moduli.tex @@ -0,0 +1,96 @@ +\chapter[Modules and toolchain]{Modules, ports and toolchain} +\label{ch:appmod} + +\section{List of RTL modules} +\begin{tabularx}{\textwidth}{L{3.4cm} C{2.0cm} Y} +\toprule +\rowh \thd{File} & \thd{Type} & \thd{Role} \\ +\midrule +\code{rtl/mac\_unit.v} & combinational & single multiply-accumulator \\ +\rowa \code{rtl/mac8.v} & combinational & parallel MAC + balanced adder tree \\ +\code{rtl/neuron\_parallel.v} & FSM & neuron: groups, bias, activation, saturation \\ +\rowa \code{rtl/layer.v} & structural & N\_NEURONS neurons in parallel \\ +\code{rtl/neuron\_memory.v} & FSM & memory/neuron bridge, neuron loop \\ +\rowa \code{rtl/layer\_sequencer.v} & FSM & multi-layer sequencing, ping-pong \\ +\code{rtl/int8\_memory\_access.v} & FSM & byte $\leftrightarrow$ word conversion \\ +\rowa \code{rtl/memory\_interface.v} & FSM & req/ready handshake \\ +\code{rtl/psram\_controller.v} & FSM & async 70~ns physical PSRAM bus \\ +\rowa \code{rtl/mem\_arbiter.v} & arbiter & 3 ports, priority B$>$C$>$A \\ +\code{rtl/spi\_slave.v} & FSM & SPI Mode 0 physical layer + CDC \\ +\rowa \code{rtl/spi\_engine.v} & FSM & opcode + register bank \\ +\code{rtl/act\_buffer.v} & block RAM & DP16KD activation buffer (Type \#2) \\ +\rowa \code{rtl/graph\_engine.v} & FSM & graph-network engine (Type \#2) \\ +\code{rtl/spi\_neuron\_top.v} & top & full integration \\ +\rowa \code{rtl/memory\_model.v} & model & behavioral RAM (sim) \\ +\bottomrule +\end{tabularx} + +\section{Ports of the top-level \texttt{spi\_neuron\_top}} +See the complete signal-by-signal table in ch.~\ref{ch:hw}. In summary: clock and reset +(\code{clk}, \code{rst}); application SPI (\code{sclk}, \code{mosi}, \code{miso}, +\code{cs\_n}); PSRAM bus (\code{psram\_a[22:0]}, \code{psram\_dq[15:0]}, +\code{psram\_ce\_n/oe\_n/we\_n/lb\_n/ub\_n/zz\_n}). + +\section{Toolchain} +\begin{tabularx}{\textwidth}{L{3.6cm} L{3.4cm} Y} +\toprule +\rowh \thd{Tool} & \thd{Version} & \thd{Use} \\ +\midrule +Yosys & 0.68+post & RTL synthesis $\to$ JSON netlist, ECP5 mapping \\ +\rowa nextpnr-ecp5 & 0.11.1-19-g8dbcee5 & placement, routing, timing \\ +Project Trellis & install & \code{ecppack}/\code{ecppll}/\code{ecpbram} \\ +\rowa Icarus Verilog & \code{-g2012} & functional simulation \\ +\bottomrule +\end{tabularx} + +\subsection{Main nextpnr parameters} +\begin{lstlisting}[language=,basicstyle=\ttfamily\scriptsize] +--45k selects LFE5U-45F +--package CABGA381 package +--speed 8 speed grade -8 +--json netlist from Yosys +--lpf pin constraints (currently empty) +--lpf-allow-unconstrained allows unconstrained I/Os (benchmark) +--freq 80 80 MHz timing target +\end{lstlisting} + +\subsection{Simulation example} +\begin{lstlisting}[language=,basicstyle=\ttfamily\scriptsize] +iverilog -g2012 -Ptb.PARALLEL=16 -o sim/parametric_256x4_p16 \ + sim/parametric_tb.v rtl/mac_unit.v rtl/mac8.v \ + rtl/neuron_parallel.v rtl/layer.v +vvp sim/parametric_256x4_p16 +\end{lstlisting} + +\section{Main testbenches} +\begin{tabularx}{\textwidth}{L{5.4cm} Y} +\toprule +\rowh \thd{Testbench} & \thd{Coverage} \\ +\midrule +\code{parametric\_tb.v} & 256$\times$4 datapath, accumulate/bias/ReLU/saturation cases \\ +\rowa \code{parameter\_sweep\_tb.v} & sweep of valid configurations \\ +\code{neuron\_parallel\_tb.v} & activations, runtime width (T7) \\ +\rowa \code{neuron\_memory\_tb.v} / \code{\_multi\_tb.v} & single/multi-neuron memory integration, real PSRAM (T5) \\ +\code{psram\_controller\_tb.v} & PSRAM controller \\ +\rowa \code{psram\_page\_mode\_tb.v} & page bursts, page crossing, close on WRITE/$t_{CEM}$ timeout, byte-enable changes (§~5.5) \\ +\code{spi\_slave\_tb.v} & SPI physical layer (4 tests) \\ +\rowa \code{spi\_engine\_tb.v} & opcodes, registers (10+ tests) \\ +\code{spi\_neuron\_top\_tb.v} & end-to-end, real PSRAM over simulated SPI \\ +\rowa \code{spi\_neuron\_top\_runnetwork\_tb.v} & RUN\_NETWORK 2-layer end-to-end \\ +\code{layer\_sequencer\_tb.v} & 2-layer sequence, ping-pong, byte-exact copy \\ +\bottomrule +\end{tabularx} + +\vfill +\begin{center} +\begin{tikzpicture} +\node[draw=fnRule,rounded corners=3pt,inner sep=8pt,fill=fnLight,text width=15.5cm]{ +\footnotesize\color{fnGrey} +This datasheet is generated from the RTL code, the documentation and the benchmarks +present in the repository \texttt{github.com/manvalan/FPGA-Neural} as of \datasheetdate. +The Fmax, resource usage and throughput values are those reported in the repository +measurements (real \texttt{.lpf} already assigned and place\&route-verified, +ch.~\ref{ch:hw}) and must be re-verified on any substantial RTL change or as the +Phase~7 timing closure, still in progress, continues (ch.~\ref{ch:roadmap}).}; +\end{tikzpicture} +\end{center} diff --git a/hardware/v1/docs/DatasheetLatex/preamble.tex b/hardware/v1/docs/DatasheetLatex/preamble.tex new file mode 100644 index 0000000..0efcef3 --- /dev/null +++ b/hardware/v1/docs/DatasheetLatex/preamble.tex @@ -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}