V2 final synthesis/P&R sign-off + LaTeX datasheet port (NOT SILICON READY)
Real synthesis and place-and-route of the actual final board-level
top (fpga_neural_v2_top.v -- SPI bridge, real EHXPLLL, reset_sync,
compute+memory core), against a real, fully ball-assigned LPF. Also
ports the V2 datasheet to LaTeX using V1's own preamble/macros/
typography, and records a real (non-ESP32, honestly labeled) software
reference comparison.
Synthesis (Yosys, real run): 0 CHECK-pass problems, 38 unique warnings
(43 total), all matching this project's own previously-reviewed benign
set (neural_processor.v's known genvar multi-driver artifact, small-
array-to-register unrolling, the real SDRAM DQ tristate bus) -- no new
warnings from the SPI bridge, PLL, or reset synchronizer.
TRELLIS_FF=6322, TRELLIS_COMB=7084, MULT18X18D=32, EHXPLLL=1 (real PLL
confirmed present), DP16KD=0 (all small SRAMs -> distributed RAM).
Place-and-route (nextpnr-ecp5, real runs, 8 seeds, new
v2_board_top.lpf with all 44 top-level signals ball-assigned from the
official Lattice pinout CSV -- no placeholders): 8/8 PASS at 64MHz.
Worst 68.51MHz (seed 4), best 74.17MHz (seed 7), mean 71.16MHz. Zero
unrouted nets, zero placement/routing errors, TRELLIS_IO=44/245 (17%).
Critical path alternates between dependency_manager's own priority
encoder and sdram_unified_backend's own weight-cache hit-index logic,
matching this project's own prior documented timing investigations --
not a new defect.
New: hardware/v2/constraints/v2_board_top.lpf (final LPF, supersedes
v2_unified.lpf for the board-level top), hardware/v2/reports/
step_final_{synthesis,pnr_worst_seed4,timing}.* (raw evidence),
hardware/v2/docs/DatasheetLatex/ (V2 datasheet, real LaTeX build,
16 pages, visually inspected, ported from hardware/v1/docs/
DatasheetLatex/'s own preamble and macros).
Real, honestly-labeled software baseline: the D-Stress arithmetic
(256 neurons x 128 INT8 MACs) compiled and run on THIS development
machine (Apple M4, arm64, NOT an embedded target, NOT ESP32) --
1.28us/inference, included in the datasheet with an explicit
disclosure that no physical ESP32 hardware was available for a real
embedded-target comparison.
Remaining, disclosed, NOT-yet-closed items (this commit does NOT
claim silicon readiness): real KiCad schematic + ERC, PCB layout,
sourced BOM, real power current-budget estimate, SDRAM-datasheet-
parameter cross-check, configuration-flash selection, and (necessarily)
physical fabrication/bring-up. See hardware/v2/docs/DatasheetLatex/
chapters/08-status-roadmap.tex for the complete, itemized checklist.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
// FPGA-Neural V2 -- FINAL board-level top constraints (STEP-final).
|
||||
// Target: fpga_neural_v2_top (N_SLOTS=2 default in this file's own
|
||||
// simulation-facing top; the frozen hardware reference is N_SLOTS=4,
|
||||
// synthesized separately at that parameter value -- see the synthesis
|
||||
// log for the actual instantiation used for these P&R runs).
|
||||
// FPGA: LFE5U-45F-8BG381, package CABGA381, speed grade -8
|
||||
//
|
||||
// This supersedes hardware/v2/constraints/v2_unified.lpf (which
|
||||
// constrained the OLDER nms_neural_multiprocessor_sdram_unified.v
|
||||
// simulation-facing top, with its raw 110-pin reg_* bus and an
|
||||
// assumed-already-80MHz `clk` input). The board-level top has NO
|
||||
// reg_* ports at all -- job registration is via 4 real SPI pins,
|
||||
// and the input clock is a real 16MHz oscillator feeding a real
|
||||
// EHXPLLL (ecp5_pll_sys_clk.v), not a pre-generated 80MHz.
|
||||
//
|
||||
// Every ball below is real, sourced from the official Lattice
|
||||
// pinout CSV (FPGA-SC-02034-3-0-ECP5U-45-Pinout.csv rev 3.0,
|
||||
// ~/Downloads/, cross-referenced against docs/pinouts.md) -- none
|
||||
// invented. osc_clk/ext_rst_n reuse the SAME real balls (H5/B4) as
|
||||
// V1's own validated spi_neuron_top.lpf and the previous v2_unified
|
||||
// .lpf (same physical clock/reset pins on this package regardless of
|
||||
// which V2 top-level is programmed). The 4 SPI pins and pll_locked
|
||||
// are NEW real balls from banks 6/7 (plain GPIO, dual function "-"
|
||||
// in the CSV, not previously used by the 37-signal SDRAM bus).
|
||||
|
||||
BLOCK ASYNCPATHS;
|
||||
BLOCK RESETPATHS;
|
||||
|
||||
// Real 16MHz board oscillator (external to the FPGA; EHXPLLL inside
|
||||
// the design generates the internal 64MHz system clock -- see
|
||||
// ecp5_pll_sys_clk.v's own FREQUENCY_PIN_CLKI/CLKOP attributes,
|
||||
// which nextpnr-ecp5 reads automatically for the generated-clock
|
||||
// domain; no separate LPF entry is needed for the internal 64MHz net).
|
||||
FREQUENCY PORT "osc_clk" 16 MHZ;
|
||||
LOCATE COMP "osc_clk" SITE "H5";
|
||||
IOBUF PORT "osc_clk" IO_TYPE=LVCMOS33;
|
||||
|
||||
LOCATE COMP "ext_rst_n" SITE "B4";
|
||||
IOBUF PORT "ext_rst_n" IO_TYPE=LVCMOS33;
|
||||
|
||||
// ---- real SPI host interface (4 pins, banks 6/7) ----
|
||||
LOCATE COMP "spi_sclk" SITE "L3"; IOBUF PORT "spi_sclk" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "spi_mosi" SITE "M3"; IOBUF PORT "spi_mosi" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "spi_miso" SITE "L2"; IOBUF PORT "spi_miso" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "spi_cs_n" SITE "N2"; IOBUF PORT "spi_cs_n" IO_TYPE=LVCMOS33;
|
||||
|
||||
// ---- PLL lock status (debug/bring-up signal, real ball) ----
|
||||
LOCATE COMP "pll_locked" SITE "L1"; IOBUF PORT "pll_locked" IO_TYPE=LVCMOS33;
|
||||
|
||||
// ---- SDRAM interface (37 signals), unchanged from v2_unified.lpf,
|
||||
// real balls, banks 6/7 ----
|
||||
LOCATE COMP "sdram_cke" SITE "B5"; IOBUF PORT "sdram_cke" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_cs_n" SITE "C5"; IOBUF PORT "sdram_cs_n" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_ras_n" SITE "C4"; IOBUF PORT "sdram_ras_n" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_cas_n" SITE "A3"; IOBUF PORT "sdram_cas_n" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_we_n" SITE "B3"; IOBUF PORT "sdram_we_n" IO_TYPE=LVCMOS33;
|
||||
|
||||
LOCATE COMP "sdram_ba[0]" SITE "E4"; IOBUF PORT "sdram_ba[0]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_ba[1]" SITE "C3"; IOBUF PORT "sdram_ba[1]" IO_TYPE=LVCMOS33;
|
||||
|
||||
LOCATE COMP "sdram_a[0]" SITE "D5"; IOBUF PORT "sdram_a[0]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[1]" SITE "D3"; IOBUF PORT "sdram_a[1]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[2]" SITE "F4"; IOBUF PORT "sdram_a[2]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[3]" SITE "E5"; IOBUF PORT "sdram_a[3]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[4]" SITE "E3"; IOBUF PORT "sdram_a[4]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[5]" SITE "F5"; IOBUF PORT "sdram_a[5]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[6]" SITE "A2"; IOBUF PORT "sdram_a[6]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[7]" SITE "B1"; IOBUF PORT "sdram_a[7]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[8]" SITE "C2"; IOBUF PORT "sdram_a[8]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[9]" SITE "C1"; IOBUF PORT "sdram_a[9]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[10]" SITE "D2"; IOBUF PORT "sdram_a[10]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_a[11]" SITE "D1"; IOBUF PORT "sdram_a[11]" IO_TYPE=LVCMOS33;
|
||||
|
||||
LOCATE COMP "sdram_dq[0]" SITE "E1"; IOBUF PORT "sdram_dq[0]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[1]" SITE "G5"; IOBUF PORT "sdram_dq[1]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[2]" SITE "H3"; IOBUF PORT "sdram_dq[2]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[3]" SITE "J5"; IOBUF PORT "sdram_dq[3]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[4]" SITE "K3"; IOBUF PORT "sdram_dq[4]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[5]" SITE "K2"; IOBUF PORT "sdram_dq[5]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[6]" SITE "H1"; IOBUF PORT "sdram_dq[6]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[7]" SITE "J1"; IOBUF PORT "sdram_dq[7]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[8]" SITE "K1"; IOBUF PORT "sdram_dq[8]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[9]" SITE "K4"; IOBUF PORT "sdram_dq[9]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[10]" SITE "L4"; IOBUF PORT "sdram_dq[10]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[11]" SITE "L5"; IOBUF PORT "sdram_dq[11]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[12]" SITE "M5"; IOBUF PORT "sdram_dq[12]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[13]" SITE "M4"; IOBUF PORT "sdram_dq[13]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[14]" SITE "N4"; IOBUF PORT "sdram_dq[14]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dq[15]" SITE "N5"; IOBUF PORT "sdram_dq[15]" IO_TYPE=LVCMOS33;
|
||||
|
||||
LOCATE COMP "sdram_dqm[0]" SITE "P5"; IOBUF PORT "sdram_dqm[0]" IO_TYPE=LVCMOS33;
|
||||
LOCATE COMP "sdram_dqm[1]" SITE "N3"; IOBUF PORT "sdram_dqm[1]" IO_TYPE=LVCMOS33;
|
||||
|
||||
// All 16 top-level ports of fpga_neural_v2_top are now real-ball
|
||||
// assigned: osc_clk, ext_rst_n, spi_sclk, spi_mosi, spi_miso,
|
||||
// spi_cs_n, sdram_cke, sdram_cs_n, sdram_ras_n, sdram_cas_n,
|
||||
// sdram_we_n, sdram_ba[1:0], sdram_a[11:0], sdram_dq[15:0],
|
||||
// sdram_dqm[1:0], pll_locked -- no placeholders remain in THIS LPF.
|
||||
@@ -0,0 +1,21 @@
|
||||
\relax
|
||||
\providecommand \babel@aux [2]{\global \let \babel@toc \@gobbletwo }
|
||||
\@nameuse{bbl@beforestart}
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\providecommand\HyField@AuxAddToFields[1]{}
|
||||
\providecommand\HyField@AuxAddToCoFields[2]{}
|
||||
\babel@aux{english}{}
|
||||
\pgfsyspdfmark {pgfid1}{5216401}{50184874}
|
||||
\gdef \LT@i {\LT@entry
|
||||
{1}{108.73918pt}\LT@entry
|
||||
{1}{120.12054pt}\LT@entry
|
||||
{1}{243.45622pt}}
|
||||
\@input{chapters/01-overview.aux}
|
||||
\@input{chapters/02-architecture.aux}
|
||||
\@input{chapters/03-clock-reset.aux}
|
||||
\@input{chapters/04-host-interface.aux}
|
||||
\@input{chapters/05-pinout-timing.aux}
|
||||
\@input{chapters/06-power-configuration.aux}
|
||||
\@input{chapters/07-benchmarks.aux}
|
||||
\@input{chapters/08-status-roadmap.aux}
|
||||
\gdef \@abspage@last{16}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
\BOOKMARK [0][-]{chapter.1}{\376\377\000O\000v\000e\000r\000v\000i\000e\000w}{}% 1
|
||||
\BOOKMARK [1][-]{section.1.1}{\376\377\000D\000o\000c\000u\000m\000e\000n\000t\000\040\000s\000c\000o\000p\000e\000\040\000a\000n\000d\000\040\000s\000t\000a\000t\000u\000s\000\040\000l\000a\000b\000e\000l\000s}{chapter.1}% 2
|
||||
\BOOKMARK [1][-]{section.1.2}{\376\377\000F\000r\000o\000z\000e\000n\000\040\000r\000e\000f\000e\000r\000e\000n\000c\000e\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n}{chapter.1}% 3
|
||||
\BOOKMARK [0][-]{chapter.2}{\376\377\000A\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 4
|
||||
\BOOKMARK [1][-]{section.2.1}{\376\377\000C\000o\000m\000p\000u\000t\000e\000:\000\040\000N\000e\000u\000r\000a\000l\000\040\000M\000u\000l\000t\000i\000p\000r\000o\000c\000e\000s\000s\000o\000r}{chapter.2}% 5
|
||||
\BOOKMARK [1][-]{section.2.2}{\376\377\000U\000n\000i\000f\000i\000e\000d\000\040\000s\000i\000n\000g\000l\000e\000-\000S\000D\000R\000A\000M\000\040\000m\000e\000m\000o\000r\000y}{chapter.2}% 6
|
||||
\BOOKMARK [1][-]{section.2.3}{\376\377\000R\000e\000a\000d\000-\000t\000i\000m\000i\000n\000g\000\040\000d\000i\000s\000c\000i\000p\000l\000i\000n\000e\000\040\000\050\000E\000R\000R\000-\0000\0000\0002\0005\000\051}{chapter.2}% 7
|
||||
\BOOKMARK [0][-]{chapter.3}{\376\377\000C\000l\000o\000c\000k\000\040\000a\000n\000d\000\040\000r\000e\000s\000e\000t\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{}% 8
|
||||
\BOOKMARK [1][-]{section.3.1}{\376\377\000C\000l\000o\000c\000k\000\040\000g\000e\000n\000e\000r\000a\000t\000i\000o\000n}{chapter.3}% 9
|
||||
\BOOKMARK [1][-]{section.3.2}{\376\377\000R\000e\000s\000e\000t\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e}{chapter.3}% 10
|
||||
\BOOKMARK [0][-]{chapter.4}{\376\377\000H\000o\000s\000t\000\040\000i\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000\050\000S\000P\000I\000\051}{}% 11
|
||||
\BOOKMARK [1][-]{section.4.1}{\376\377\000O\000p\000c\000o\000d\000e\000s}{chapter.4}% 12
|
||||
\BOOKMARK [1][-]{section.4.2}{\376\377\000V\000e\000r\000i\000f\000i\000c\000a\000t\000i\000o\000n}{chapter.4}% 13
|
||||
\BOOKMARK [0][-]{chapter.5}{\376\377\000P\000i\000n\000o\000u\000t\000,\000\040\000p\000l\000a\000c\000e\000-\000a\000n\000d\000-\000r\000o\000u\000t\000e\000,\000\040\000a\000n\000d\000\040\000t\000i\000m\000i\000n\000g}{}% 14
|
||||
\BOOKMARK [1][-]{section.5.1}{\376\377\000F\000i\000n\000a\000l\000\040\000p\000i\000n\000o\000u\000t}{chapter.5}% 15
|
||||
\BOOKMARK [1][-]{section.5.2}{\376\377\000S\000y\000n\000t\000h\000e\000s\000i\000s\000\040\000\050\000r\000e\000a\000l\000,\000\040\000t\000h\000i\000s\000\040\000r\000e\000v\000i\000s\000i\000o\000n\000\051}{chapter.5}% 16
|
||||
\BOOKMARK [1][-]{section.5.3}{\376\377\000P\000l\000a\000c\000e\000\040\000a\000n\000d\000\040\000r\000o\000u\000t\000e\000:\000\040\0008\000-\000s\000e\000e\000d\000\040\000t\000i\000m\000i\000n\000g\000\040\000t\000a\000b\000l\000e}{chapter.5}% 17
|
||||
\BOOKMARK [0][-]{chapter.6}{\376\377\000P\000o\000w\000e\000r\000,\000\040\000S\000D\000R\000A\000M\000\040\000e\000l\000e\000c\000t\000r\000i\000c\000a\000l\000,\000\040\000a\000n\000d\000\040\000c\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n}{}% 18
|
||||
\BOOKMARK [1][-]{section.6.1}{\376\377\000P\000o\000w\000e\000r\000\040\000a\000r\000c\000h\000i\000t\000e\000c\000t\000u\000r\000e\000\040\040\023\000\040\000s\000t\000a\000t\000u\000s\000:\000\040\000O\000P\000E\000N}{chapter.6}% 19
|
||||
\BOOKMARK [1][-]{section.6.2}{\376\377\000S\000D\000R\000A\000M\000\040\000e\000l\000e\000c\000t\000r\000i\000c\000a\000l\000\040\000/\000\040\000t\000i\000m\000i\000n\000g\000\040\000s\000i\000g\000n\000-\000o\000f\000f\000\040\040\023\000\040\000s\000t\000a\000t\000u\000s\000:\000\040\000P\000A\000R\000T\000I\000A\000L}{chapter.6}% 20
|
||||
\BOOKMARK [1][-]{section.6.3}{\376\377\000C\000o\000n\000f\000i\000g\000u\000r\000a\000t\000i\000o\000n\000\040\040\023\000\040\000s\000t\000a\000t\000u\000s\000:\000\040\000O\000P\000E\000N}{chapter.6}% 21
|
||||
\BOOKMARK [0][-]{chapter.7}{\376\377\000B\000e\000n\000c\000h\000m\000a\000r\000k\000s}{}% 22
|
||||
\BOOKMARK [1][-]{section.7.1}{\376\377\000I\000n\000t\000e\000r\000n\000a\000l\000\040\000b\000e\000n\000c\000h\000m\000a\000r\000k\000:\000\040\000D\000-\000S\000t\000r\000e\000s\000s\000\040\000w\000o\000r\000k\000l\000o\000a\000d}{chapter.7}% 23
|
||||
\BOOKMARK [1][-]{section.7.2}{\376\377\000H\000o\000s\000t\000-\000i\000n\000t\000e\000r\000f\000a\000c\000e\000\040\000p\000a\000c\000i\000n\000g\000\040\000b\000e\000n\000c\000h\000m\000a\000r\000k}{chapter.7}% 24
|
||||
\BOOKMARK [1][-]{section.7.3}{\376\377\000S\000o\000f\000t\000w\000a\000r\000e\000\040\000r\000e\000f\000e\000r\000e\000n\000c\000e\000\040\000c\000o\000m\000p\000a\000r\000i\000s\000o\000n}{chapter.7}% 25
|
||||
\BOOKMARK [0][-]{chapter.8}{\376\377\000C\000h\000i\000p\000\040\000r\000e\000a\000d\000i\000n\000e\000s\000s\000\040\000a\000n\000d\000\040\000r\000o\000a\000d\000m\000a\000p}{}% 26
|
||||
\BOOKMARK [1][-]{section.8.1}{\376\377\000P\000r\000e\000c\000i\000s\000e\000\040\000r\000e\000a\000d\000i\000n\000e\000s\000s\000\040\000c\000h\000e\000c\000k\000l\000i\000s\000t}{chapter.8}% 27
|
||||
\BOOKMARK [1][-]{section.8.2}{\376\377\000F\000i\000n\000a\000l\000\040\000a\000n\000s\000w\000e\000r}{chapter.8}% 28
|
||||
\BOOKMARK [1][-]{section.8.3}{\376\377\000R\000o\000a\000d\000m\000a\000p}{chapter.8}% 29
|
||||
Binary file not shown.
@@ -0,0 +1,120 @@
|
||||
% ======================================================================
|
||||
% FPGA-Neural V2 -- INT8 Neural Network Engine, single-SDRAM architecture
|
||||
% Datasheet / Technical reference manual
|
||||
% Repository: github.com/manvalan/FPGA-Neural
|
||||
% Ported from the V1 LaTeX datasheet (hardware/v1/docs/DatasheetLatex/):
|
||||
% same preamble, macros, typography, and title-page/features-page
|
||||
% structure -- content rewritten for the V2 architecture throughout.
|
||||
% ======================================================================
|
||||
\documentclass[11pt,a4paper,openany]{report}
|
||||
|
||||
\newcommand{\datasheetrev}{B0}
|
||||
\newcommand{\datasheetdate}{September 2026}
|
||||
|
||||
\input{preamble}
|
||||
|
||||
\begin{document}
|
||||
\sloppy
|
||||
|
||||
% ======================================================================
|
||||
% TITLE PAGE
|
||||
% ======================================================================
|
||||
\begin{titlepage}
|
||||
\thispagestyle{empty}
|
||||
\begin{tikzpicture}[remember picture,overlay]
|
||||
\fill[fnDark] (current page.north west) rectangle
|
||||
([yshift=-4.3cm]current page.north east);
|
||||
\fill[fnTeal] ([yshift=-4.3cm]current page.north west) rectangle
|
||||
([yshift=-4.55cm]current page.north east);
|
||||
\node[anchor=north west,text=white,font=\Huge\bfseries]
|
||||
at ([xshift=2.2cm,yshift=-1.15cm]current page.north west)
|
||||
{FPGA\,--\,Neural V2};
|
||||
\node[anchor=north west,text=fnLight,font=\large]
|
||||
at ([xshift=2.25cm,yshift=-2.15cm]current page.north west)
|
||||
{INT8 Neural Multiprocessor, unified single-SDRAM architecture};
|
||||
\node[anchor=north west,text=fnLight2,font=\normalsize]
|
||||
at ([xshift=2.25cm,yshift=-2.85cm]current page.north west)
|
||||
{Parametric N-processor hardware accelerator -- Datasheet and reference manual};
|
||||
\node[anchor=north east,text=white,font=\ttfamily\small]
|
||||
at ([xshift=-2.2cm,yshift=-3.55cm]current page.north east)
|
||||
{Rev.~\datasheetrev~~\textbullet~~\datasheetdate};
|
||||
\end{tikzpicture}
|
||||
|
||||
\vspace*{5.0cm}
|
||||
|
||||
% --- compact block diagram on the title page ---
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=7mm and 12mm]
|
||||
\node[fnblockD,minimum width=30mm] (host) {HOST\\{\scriptsize MCU / PC (SPI master)}};
|
||||
\node[fnblockT,right=18mm of host,minimum width=34mm] (fpga)
|
||||
{FPGA\\{\scriptsize Neural Multiprocessor, N=4}};
|
||||
\node[fnblock,right=18mm of fpga,minimum width=26mm] (ram)
|
||||
{SDRAM\\{\scriptsize 8\,MB, unified}};
|
||||
\draw[fnbus] (host) -- node[fnlbl,above]{SPI Mode 0} (fpga);
|
||||
\draw[fnbus] (fpga) -- node[fnlbl,above]{16-bit, single chip} (ram);
|
||||
\node[below=1mm of fpga,font=\scriptsize\itshape,text=fnGrey]
|
||||
{weights + activations + results, ONE physical memory};
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
\vfill
|
||||
\begin{center}
|
||||
\begin{tikzpicture}
|
||||
\node[draw=fnRule,rounded corners=3pt,inner sep=10pt,fill=fnLight,text width=15.5cm]{
|
||||
\footnotesize
|
||||
\textbf{\color{fnDark}Reference target device:} Lattice ECP5 \code{LFE5U-45F-8BG381}
|
||||
(speed grade $-8$, CABGA381, 72$\times$MULT18X18D, $\approx$44k LUT).\\[2pt]
|
||||
\textbf{\color{fnDark}Baseline configuration:} INT8/INT32, \code{N\_PROCESSORS}=4,
|
||||
\code{P\_IN}=8, single external SDRAM Alliance Memory \code{AS4C4M16SA-6TIN}
|
||||
(weights + activations + results, unified). No PSRAM anywhere in the V2
|
||||
physical path.\\[2pt]
|
||||
\textbf{\color{fnDark}Clock:} 16\,MHz board oscillator $\rightarrow$ real
|
||||
ECP5 \code{EHXPLLL} $\rightarrow$ 64\,MHz system clock, timing-closed
|
||||
across 8 real place-and-route seeds (worst 68.51\,MHz, best 74.17\,MHz).\\[2pt]
|
||||
\textbf{\color{fnDark}Host:} real SPI protocol engine
|
||||
(\code{spi\_host\_bridge.v}) -- WRITE\_JOB / WRITE\_MEM / READ\_MEM /
|
||||
STATUS / RESET.\\[2pt]
|
||||
\textbf{\color{fnDark}Status:} RTL verified in simulation (Verilator,
|
||||
bit-exact), real synthesis (Yosys) and real place-and-route
|
||||
(nextpnr-ecp5). No fabricated hardware exists -- see \S\ref{ch:status}
|
||||
for the precise, itemized readiness state. Document describing the
|
||||
project as of \datasheetdate.
|
||||
};
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
\vspace{0.6cm}
|
||||
{\footnotesize\color{fnGrey}\raggedright
|
||||
Project author: Michele Bigi \textbullet{} MIKILAB / manvalan.\\
|
||||
This datasheet documents the RTL code, documentation and benchmarks
|
||||
present in the repository \texttt{github.com/manvalan/FPGA-Neural},
|
||||
ported from the V1 datasheet's own LaTeX structure (same preamble and
|
||||
macros, content rewritten for V2).\par}
|
||||
\end{titlepage}
|
||||
|
||||
% ======================================================================
|
||||
% "FEATURES" PAGE (datasheet style)
|
||||
% ======================================================================
|
||||
\input{chapters/00-features}
|
||||
|
||||
% ======================================================================
|
||||
% TABLE OF CONTENTS
|
||||
% ======================================================================
|
||||
\newpage
|
||||
\pagenumbering{roman}
|
||||
{\color{fnDark}\tableofcontents}
|
||||
\newpage
|
||||
\pagenumbering{arabic}
|
||||
|
||||
% ======================================================================
|
||||
% CHAPTERS
|
||||
% ======================================================================
|
||||
\include{chapters/01-overview}
|
||||
\include{chapters/02-architecture}
|
||||
\include{chapters/03-clock-reset}
|
||||
\include{chapters/04-host-interface}
|
||||
\include{chapters/05-pinout-timing}
|
||||
\include{chapters/06-power-configuration}
|
||||
\include{chapters/07-benchmarks}
|
||||
\include{chapters/08-status-roadmap}
|
||||
|
||||
\end{document}
|
||||
@@ -0,0 +1,30 @@
|
||||
\babel@toc {english}{}\relax
|
||||
\contentsline {chapter}{\numberline {1}Overview}{1}{chapter.1}%
|
||||
\contentsline {section}{\numberline {1.1}Document scope and status labels}{1}{section.1.1}%
|
||||
\contentsline {section}{\numberline {1.2}Frozen reference configuration}{1}{section.1.2}%
|
||||
\contentsline {chapter}{\numberline {2}Architecture}{2}{chapter.2}%
|
||||
\contentsline {section}{\numberline {2.1}Compute: Neural Multiprocessor}{2}{section.2.1}%
|
||||
\contentsline {section}{\numberline {2.2}Unified single-SDRAM memory}{2}{section.2.2}%
|
||||
\contentsline {section}{\numberline {2.3}Read-timing discipline (ERR-0025)}{3}{section.2.3}%
|
||||
\contentsline {chapter}{\numberline {3}Clock and reset architecture}{4}{chapter.3}%
|
||||
\contentsline {section}{\numberline {3.1}Clock generation}{4}{section.3.1}%
|
||||
\contentsline {section}{\numberline {3.2}Reset architecture}{4}{section.3.2}%
|
||||
\contentsline {chapter}{\numberline {4}Host interface (SPI)}{5}{chapter.4}%
|
||||
\contentsline {section}{\numberline {4.1}Opcodes}{5}{section.4.1}%
|
||||
\contentsline {section}{\numberline {4.2}Verification}{5}{section.4.2}%
|
||||
\contentsline {chapter}{\numberline {5}Pinout, place-and-route, and timing}{6}{chapter.5}%
|
||||
\contentsline {section}{\numberline {5.1}Final pinout}{6}{section.5.1}%
|
||||
\contentsline {section}{\numberline {5.2}Synthesis (real, this revision)}{6}{section.5.2}%
|
||||
\contentsline {section}{\numberline {5.3}Place and route: 8-seed timing table}{6}{section.5.3}%
|
||||
\contentsline {chapter}{\numberline {6}Power, SDRAM electrical, and configuration}{8}{chapter.6}%
|
||||
\contentsline {section}{\numberline {6.1}Power architecture -- status: OPEN}{8}{section.6.1}%
|
||||
\contentsline {section}{\numberline {6.2}SDRAM electrical / timing sign-off -- status: PARTIAL}{8}{section.6.2}%
|
||||
\contentsline {section}{\numberline {6.3}Configuration -- status: OPEN}{8}{section.6.3}%
|
||||
\contentsline {chapter}{\numberline {7}Benchmarks}{9}{chapter.7}%
|
||||
\contentsline {section}{\numberline {7.1}Internal benchmark: D-Stress workload}{9}{section.7.1}%
|
||||
\contentsline {section}{\numberline {7.2}Host-interface pacing benchmark}{9}{section.7.2}%
|
||||
\contentsline {section}{\numberline {7.3}Software reference comparison}{9}{section.7.3}%
|
||||
\contentsline {chapter}{\numberline {8}Chip readiness and roadmap}{11}{chapter.8}%
|
||||
\contentsline {section}{\numberline {8.1}Precise readiness checklist}{11}{section.8.1}%
|
||||
\contentsline {section}{\numberline {8.2}Final answer}{11}{section.8.2}%
|
||||
\contentsline {section}{\numberline {8.3}Roadmap}{11}{section.8.3}%
|
||||
@@ -0,0 +1,123 @@
|
||||
\thispagestyle{plain}
|
||||
\noindent
|
||||
\begin{tikzpicture}
|
||||
\node[fill=fnDark,text=white,rounded corners=2pt,inner sep=6pt,
|
||||
minimum width=\textwidth,anchor=west]
|
||||
{\large\bfseries FPGA-Neural V2 --- General description and features};
|
||||
\end{tikzpicture}
|
||||
|
||||
\vspace{6pt}
|
||||
\noindent
|
||||
{\small FPGA-Neural V2 is a \textbf{parametric hardware neural
|
||||
multiprocessor} built around \code{N\_PROCESSORS} independent INT8 MAC
|
||||
engines dispatched by a real dependency-graph scheduler
|
||||
(Dependency Manager $\to$ Neural Director $\to$ per-slot Memory
|
||||
Manager), streaming weight/activation tiles from, and writing results
|
||||
to, a \textbf{single external SDRAM chip} -- no PSRAM, no second
|
||||
memory device anywhere in the V2 physical path. Job registration is
|
||||
via a real SPI host protocol engine; the host never participates in
|
||||
the compute datapath.}
|
||||
|
||||
\vspace{8pt}
|
||||
\begin{multicols}{2}
|
||||
{\color{fnDark}\large\bfseries Features}\\[2pt]
|
||||
{\footnotesize
|
||||
\begin{itemize}[leftmargin=1.1em]
|
||||
\item \textbf{INT8 $\times$ INT8 $\to$ INT32} datapath per processor,
|
||||
\code{P\_IN}=8-wide parallel MAC, balanced adder tree.
|
||||
\item \textbf{N\_PROCESSORS} independent Neural Processors (frozen
|
||||
reference: N=4; N=2 also fully validated; N=8 is a future
|
||||
evolution).
|
||||
\item \textbf{Unified single-SDRAM memory}: weights, activations, AND
|
||||
results all share ONE physical Alliance Memory
|
||||
\code{AS4C4M16SA-6TIN} (8\,MB, 16-bit), through one
|
||||
\code{sdram\_unified\_backend} arbitrating a read-only,
|
||||
cached weight (W) port and a read/write, byte-maskable
|
||||
activation+result (AR) port.
|
||||
\item Real dependency-graph scheduling: the Dependency Manager tracks
|
||||
per-node WAITING/READY/DISPATCHED state and producer/consumer
|
||||
wake-up; the Neural Director allocates the first free processor
|
||||
slot.
|
||||
\item \textbf{Real SPI host protocol engine}
|
||||
(\code{spi\_host\_bridge.v}): \code{WRITE\_JOB} (job
|
||||
registration), \code{WRITE\_MEM}/\code{READ\_MEM} (raw SDRAM
|
||||
access), \code{STATUS}, \code{RESET}.
|
||||
\item \textbf{Real ECP5 clock generation}: 16\,MHz oscillator
|
||||
$\to$ \code{EHXPLLL} (real Project Trellis \code{ecppll}
|
||||
parameters) $\to$ 64\,MHz system clock.
|
||||
\item Real reset architecture (\code{reset\_sync.v}): asynchronous
|
||||
assertion, synchronous deassertion, gated by external POR and
|
||||
PLL lock.
|
||||
\item Verified in \textbf{simulation} (Verilator, bit-exact) and real
|
||||
synthesis + place-and-route (Yosys + nextpnr-ecp5).
|
||||
\end{itemize}}
|
||||
|
||||
\columnbreak
|
||||
|
||||
{\color{fnDark}\large\bfseries Applications}\\[2pt]
|
||||
{\footnotesize
|
||||
\begin{itemize}[leftmargin=1.1em]
|
||||
\item Deterministic low-latency inference as an SPI peripheral of a
|
||||
microcontroller or SoC host.
|
||||
\item Reusable dependency-graph compute fabric, not a single fixed
|
||||
network topology.
|
||||
\item Edge AI on compact, INT8-quantized dense/DAG-structured
|
||||
networks.
|
||||
\item Off-loading neural workload from a constrained host CPU to
|
||||
dedicated hardware with predictable, measured throughput.
|
||||
\end{itemize}}
|
||||
|
||||
\vspace{4pt}
|
||||
{\color{fnDark}\large\bfseries Target \& toolchain}\\[2pt]
|
||||
{\footnotesize
|
||||
\begin{itemize}[leftmargin=1.1em]
|
||||
\item FPGA: Lattice ECP5 \code{LFE5U-45F-8BG381} ($-8$, CABGA381).
|
||||
\item Synthesis: Yosys; place\&route: nextpnr-ecp5.
|
||||
\item Simulation: Verilator (trusted per this project's own DEC-0004
|
||||
protocol) and Icarus Verilog (cross-checked).
|
||||
\item SDRAM: Alliance Memory \code{AS4C4M16SA-6TIN} (4M$\times$16, 8\,MB).
|
||||
\end{itemize}}
|
||||
\end{multicols}
|
||||
|
||||
\vspace{2pt}
|
||||
% --- key parameter table ---
|
||||
\noindent
|
||||
{\small\color{fnDark}\bfseries Key parameters (frozen V2 reference configuration)}
|
||||
\vspace{2pt}
|
||||
|
||||
\noindent
|
||||
\begin{tabularx}{\textwidth}{L{3.4cm}L{3.8cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Quantity} & \thd{Value} & \thd{Notes} \\
|
||||
\midrule
|
||||
Data precision & INT8 (signed) & \code{DATA\_WIDTH}=8 \\
|
||||
\rowa Accumulator & INT32 (signed) & \code{ACC\_WIDTH}=32 \\
|
||||
Processors & 4 (N=2 also validated) & \code{N\_PROCESSORS} \\
|
||||
\rowa MAC width per processor & 8 & \code{P\_IN}=8 \\
|
||||
Activation & ReLU + INT8 saturate & fixed, matches golden model \\
|
||||
\rowa External memory & 1 $\times$ SDRAM, 8\,MB & \code{AS4C4M16SA-6TIN}, unified \\
|
||||
System clock & 64\,MHz (real P\&R, 8/8 seeds PASS) & 16\,MHz osc.\ $\to$ EHXPLLL \\
|
||||
\rowa Bit-exact regression & 256/256, N=2 and N=4 & Verilator, D-Stress workload \\
|
||||
Host interface & real SPI (4 pins) & \code{spi\_host\_bridge.v} \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\vspace{8pt}
|
||||
\noindent
|
||||
{\small\color{fnDark}\bfseries System block diagram}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=6mm and 10mm,font=\footnotesize]
|
||||
\node[fnblockD,minimum width=26mm,minimum height=13mm] (host){HOST\\{\scriptsize SPI master}};
|
||||
\node[fnblockT,right=16mm of host,minimum width=56mm,minimum height=24mm] (eng){};
|
||||
\node[anchor=north,font=\footnotesize\bfseries,text=fnDark] at (eng.north){FPGA -- Neural Multiprocessor (N=4)};
|
||||
\node[fnreg,fill=white] (spi) at ([yshift=-3mm]eng.center){\code{spi\_host\_bridge} + Dependency Manager};
|
||||
\node[fnreg,fill=white,below=2.5mm of spi] (mm){Neural Director $\to$ 4$\times$ Memory Manager $\to$ Neural Processor};
|
||||
\node[fnreg,fill=white,above=2.5mm of spi] (be){\code{sdram\_unified\_backend} (W + AR arbitration)};
|
||||
\node[fnblock,right=16mm of eng,minimum width=24mm,minimum height=13mm] (ram){SDRAM 8\,MB\\{\scriptsize unified: W+A+R}};
|
||||
\draw[fnbus] (host) -- node[fnlbl,above]{SPI} (eng.west|-host);
|
||||
\draw[fnbus] (eng.east|-ram) -- node[fnlbl,above]{16-bit} (ram);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
\begin{center}\footnotesize\itshape\color{fnGrey}
|
||||
Weights, activations and results all share the single physical SDRAM;
|
||||
the host only registers jobs and reads back results over SPI.\end{center}
|
||||
@@ -0,0 +1,53 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@ii {\LT@entry
|
||||
{1}{125.81102pt}\LT@entry
|
||||
{1}{346.50493pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Overview}{1}{chapter.1}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Document scope and status labels}{1}{section.1.1}\protected@file@percent }
|
||||
\newlabel{sec:status-labels}{{1.1}{1}{Document scope and status labels}{section.1.1}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {1.2}Frozen reference configuration}{1}{section.1.2}\protected@file@percent }
|
||||
\@setckpt{chapters/01-overview}{
|
||||
\setcounter{page}{2}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{1}
|
||||
\setcounter{section}{2}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{1}
|
||||
\setcounter{LT@tables}{2}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{3}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
\chapter{Overview}
|
||||
|
||||
FPGA-Neural V2 succeeds V1 with three architectural changes, all
|
||||
frozen and verified in this revision:
|
||||
|
||||
\begin{enumerate}
|
||||
\item \textbf{Neural multiprocessor}: N\_PROCESSORS (4, frozen
|
||||
reference) independent Neural Processors instead of V1's single
|
||||
engine, scheduled by a real dependency-graph Dependency Manager and
|
||||
Neural Director.
|
||||
\item \textbf{Unified single-SDRAM memory}: one physical Alliance
|
||||
Memory \code{AS4C4M16SA-6TIN} SDRAM serves weights, activations,
|
||||
\emph{and} results. V1's PSRAM (\code{IS66WVE4M16EBLL-70BLI}) and
|
||||
its controller are not part of V2's physical path at all.
|
||||
\item \textbf{Real physical host interface}: a from-scratch SPI
|
||||
protocol engine (\code{spi\_host\_bridge.v}) replaces the internal
|
||||
110-pin \code{reg\_*} testbench bus as the board-level top's own
|
||||
physical interface.
|
||||
\end{enumerate}
|
||||
|
||||
V1 itself (\code{hardware/v1/**}) is untouched and remains the golden,
|
||||
independently certified reference design; V2 shares no RTL file with
|
||||
it.
|
||||
|
||||
\section{Document scope and status labels}
|
||||
\label{sec:status-labels}
|
||||
This datasheet distinguishes explicitly between:
|
||||
\begin{itemize}
|
||||
\item \textbf{RTL verified} -- verified through RTL simulation only.
|
||||
\item \textbf{Simulation verified} -- verified in simulation for the
|
||||
specific configuration named.
|
||||
\item \textbf{Synthesis verified} -- synthesizes cleanly for the
|
||||
target FPGA (Yosys, real run, zero unintended latches or
|
||||
multi-driver issues beyond a small, previously-reviewed benign set).
|
||||
\item \textbf{P\&R verified} -- successfully placed, routed, and
|
||||
timing-analyzed by nextpnr-ecp5 for a real, ball-assigned LPF.
|
||||
\item \textbf{Hardware designed} -- schematic/PCB electrically
|
||||
designed but not fabricated.
|
||||
\item \textbf{Hardware validated} -- physically tested on fabricated
|
||||
hardware.
|
||||
\item \textbf{Silicon validated} -- the actual physical FPGA has been
|
||||
programmed and tested.
|
||||
\end{itemize}
|
||||
As of \datasheetdate, V2 is \textbf{RTL verified}, \textbf{simulation
|
||||
verified} (bit-exact), \textbf{synthesis verified}, and \textbf{P\&R
|
||||
verified}. No item in this datasheet is presented as hardware- or
|
||||
silicon-validated -- no fabricated V2 board exists. See
|
||||
Chapter~\ref{ch:status} for the complete, itemized status.
|
||||
|
||||
\section{Frozen reference configuration}
|
||||
\begin{tabularx}{\textwidth}{L{4cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Parameter} & \thd{Value} \\
|
||||
\midrule
|
||||
FPGA & Lattice \code{LFE5U-45F-8BG381}, speed grade $-8$, CABGA381 \\
|
||||
\rowa N\_PROCESSORS & 4 (frozen reference; N=2 also fully validated) \\
|
||||
P\_IN & 8 (MAC width per processor) \\
|
||||
\rowa ACC\_WIDTH & 32 \\
|
||||
External memory & 1 $\times$ SDRAM, Alliance Memory \code{AS4C4M16SA-6TIN}, 8\,MB \\
|
||||
\rowa Oscillator & 16\,MHz (board-level, external) \\
|
||||
System clock & 64\,MHz, generated by a real ECP5 \code{EHXPLLL} \\
|
||||
\rowa Host interface & real SPI (4 pins), \code{spi\_host\_bridge.v} \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
@@ -0,0 +1,54 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@iii {\LT@entry
|
||||
{1}{103.04872pt}\LT@entry
|
||||
{1}{103.04872pt}\LT@entry
|
||||
{1}{266.2185pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Architecture}{2}{chapter.2}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Compute: Neural Multiprocessor}{2}{section.2.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Unified single-SDRAM memory}{2}{section.2.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Read-timing discipline (ERR-0025)}{3}{section.2.3}\protected@file@percent }
|
||||
\@setckpt{chapters/02-architecture}{
|
||||
\setcounter{page}{4}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{2}
|
||||
\setcounter{section}{3}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{1}
|
||||
\setcounter{LT@tables}{3}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{7}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
\chapter{Architecture}
|
||||
|
||||
\section{Compute: Neural Multiprocessor}
|
||||
Each of the \code{N\_PROCESSORS} Neural Processors is an independent
|
||||
INT8 datapath: \code{P\_IN}=8 parallel multipliers feeding a balanced
|
||||
binary adder tree into a 32-bit accumulator, followed by ReLU and INT8
|
||||
saturation -- byte-for-byte identical to \code{neural\_processor.v},
|
||||
unmodified since before the V2 single-SDRAM freeze. Job dispatch is a
|
||||
real dependency-graph pipeline:
|
||||
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=5mm and 6mm,font=\scriptsize]
|
||||
\node[fnreg] (host) {SPI host\\bridge};
|
||||
\node[fnreg,right=of host] (dm) {Dependency\\Manager};
|
||||
\node[fnreg,right=of dm] (dir) {Neural\\Director};
|
||||
\node[fnreg,below=of dir] (mm) {Memory Manager\\(per slot)};
|
||||
\node[fnreg,left=of mm] (np) {Neural\\Processor};
|
||||
\draw[fnarrow] (host) -- (dm);
|
||||
\draw[fnarrow] (dm) -- (dir);
|
||||
\draw[fnarrow] (dir) -- (mm);
|
||||
\draw[fnarrow] (mm) -- (np);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
The Dependency Manager holds a per-node table (state, required/
|
||||
resolved producer count, job descriptor fields) and hands READY nodes
|
||||
to the Director one at a time (valid/ready, backpressure-safe). The
|
||||
Director allocates the first free processor slot (first-free, not
|
||||
load-balanced) and frees it the instant that slot's job completes.
|
||||
|
||||
\section{Unified single-SDRAM memory}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=6mm and 10mm,font=\footnotesize]
|
||||
\node[fnblockT,minimum width=50mm,minimum height=20mm] (fpga){};
|
||||
\node[anchor=north,font=\bfseries,text=fnDark] at (fpga.north){FPGA};
|
||||
\node[fnreg,fill=white] (np) at ([yshift=2mm]fpga.center){4$\times$ Neural Processor};
|
||||
\node[fnreg,fill=white,below=2mm of np] (be){Unified SDRAM Backend / Arbiter};
|
||||
\node[fnblock,right=16mm of fpga,minimum height=20mm] (ram){\code{AS4C4M16SA-6TIN}\\Weights\\Activations\\Results};
|
||||
\draw[fnbus] (fpga.east|-be) -- node[fnlbl,above]{16-bit SDRAM bus} (ram);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
\code{sdram\_unified\_backend.v} owns exactly one \code{sdram\_
|
||||
controller.v} instance and presents two logical ports:
|
||||
\begin{itemize}
|
||||
\item \textbf{W} (weight fetch): 64-bit, read-only, a 4-entry
|
||||
fully-associative ``other half'' cache (round-robin eviction --
|
||||
safe under any sizing, since an evicted-too-early entry only costs
|
||||
an extra real fetch, never wrong data).
|
||||
\item \textbf{AR} (activation fill + result write-back): 16-bit,
|
||||
read/write, byte-maskable via real SDR SDRAM DQM semantics
|
||||
(\code{lb\_n}/\code{ub\_n}).
|
||||
\end{itemize}
|
||||
Both ports are, in turn, each arbitrated across the N\_PROCESSORS
|
||||
slots by a generic, reused \code{slot\_mem\_arbiter} (a proven,
|
||||
pending-latch-based, single-owner-until-ready design used identically
|
||||
throughout this project).
|
||||
|
||||
\subsection*{Official V2 memory map}
|
||||
\begin{tabularx}{\textwidth}{L{3.2cm}L{3.2cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Region} & \thd{Base address} & \thd{Notes} \\
|
||||
\midrule
|
||||
Weights & \code{0x010000} & 1\,MB-aligned \\
|
||||
\rowa Activations & \code{0x200000} & 1\,MB-aligned \\
|
||||
Results & \code{0x300000} & 1\,MB-aligned \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
All three regions are non-overlapping within the single 8\,MB
|
||||
(\code{0x000000}--\code{0x7FFFFF}) SDRAM address space. Base addresses
|
||||
are host-programmable per job (via \code{WRITE\_JOB}'s own
|
||||
\code{x\_base}/\code{w\_base}/\code{result\_addr} fields), not hard-coded
|
||||
in the datapath.
|
||||
|
||||
\section{Read-timing discipline (ERR-0025)}
|
||||
The shared weight and activation SRAMs (\code{nms\_weight\_packed.v},
|
||||
\code{nms\_activation\_replicated.v}) use \textbf{combinational} read
|
||||
ports, matching the exact 1-cycle latency assumption of the per-slot
|
||||
Memory Manager's own pipelined read-ahead consumer. An earlier,
|
||||
registered-read implementation added one uncounted cycle of latency
|
||||
that a busy, multi-tile job's own prefetch lead time always absorbed
|
||||
invisibly, but that an uncontested single-tile job exposed on its
|
||||
first (only) tile -- found and fixed via this revision's own
|
||||
board-level SPI integration testing, with zero regression to the
|
||||
existing bit-exact regression suite (identical cycle counts before and
|
||||
after the fix).
|
||||
@@ -0,0 +1,49 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Clock and reset architecture}{4}{chapter.3}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Clock generation}{4}{section.3.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Reset architecture}{4}{section.3.2}\protected@file@percent }
|
||||
\@setckpt{chapters/03-clock-reset}{
|
||||
\setcounter{page}{5}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{3}
|
||||
\setcounter{section}{2}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{0}
|
||||
\setcounter{LT@tables}{3}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{10}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
\chapter{Clock and reset architecture}
|
||||
|
||||
\section{Clock generation}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=8mm and 14mm,font=\footnotesize]
|
||||
\node[fnblockD] (osc){16\,MHz\\oscillator};
|
||||
\node[fnblockT,right=of osc] (pll){ECP5 \code{EHXPLLL}};
|
||||
\node[fnblock,right=of pll] (sys){system clock\\64\,MHz};
|
||||
\draw[fnbus] (osc) -- (pll);
|
||||
\draw[fnbus] (pll) -- (sys);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
\code{ecp5\_pll\_sys\_clk.v} instantiates a real \code{EHXPLLL}, with
|
||||
parameters generated by Project Trellis's own \code{ecppll} utility
|
||||
(not hand-derived): \code{CLKI\_DIV}=1, \code{CLKFB\_DIV}=4,
|
||||
\code{CLKOP\_DIV}=9, \code{FEEDBK\_PATH}=\code{CLKOP}, giving a real
|
||||
VCO frequency of 576\,MHz (within the ECP5's documented 400--800\,MHz
|
||||
range) and an exact, zero-error 64\,MHz output ($16 \times 4 / 1$,
|
||||
divided by 9 at the VCO). 64\,MHz was chosen over 80\,MHz specifically
|
||||
because it is the highest frequency at which \emph{all} measured P\&R
|
||||
seeds close timing with real margin -- see Chapter~\ref{ch:pinout} for
|
||||
the full 8-seed table.
|
||||
|
||||
Simulation note: \code{EHXPLLL} has no open, licensable behavioral
|
||||
model (Lattice ships it only inside encrypted simulation libraries).
|
||||
\code{ecp5\_pll\_sys\_clk.v} therefore provides a declared,
|
||||
simulation-only bypass under a \code{`SIM} define (\code{clk\_sys}
|
||||
tied directly to \code{clk\_16mhz}, \code{locked} tied high) -- this is
|
||||
not, and does not claim to be, a simulation of real PLL lock timing.
|
||||
|
||||
\section{Reset architecture}
|
||||
\begin{center}
|
||||
\begin{tikzpicture}[node distance=8mm and 14mm,font=\footnotesize]
|
||||
\node[fnblockD] (por){External POR\\/ supervisor};
|
||||
\node[fnblockT,right=of por] (rs){\code{reset\_sync.v}};
|
||||
\node[fnblock,right=of rs] (rst){\code{rst}\\(sync-deassert)};
|
||||
\node[fnblock,below=6mm of rs] (lock){PLL \code{locked}};
|
||||
\draw[fnbus] (por) -- (rs);
|
||||
\draw[fnbus] (rs) -- (rst);
|
||||
\draw[fnbus] (lock) -- (rs);
|
||||
\end{tikzpicture}
|
||||
\end{center}
|
||||
|
||||
\code{reset\_sync.v} is a standard async-assert/sync-deassert bridge:
|
||||
\code{rst} is asserted \emph{immediately} (combinationally) whenever
|
||||
either the external POR (\code{ext\_rst\_n}, active-low) is asserted
|
||||
\emph{or} the PLL has not yet reported lock, and is released only
|
||||
after two flip-flops of the system clock following both conditions
|
||||
clearing -- so no downstream synchronous logic (SDRAM controller,
|
||||
compute datapath, SPI bridge) ever sees an asynchronous release edge.
|
||||
This is a real, RTL-implemented mechanism, not a placeholder: it is
|
||||
included, unmodified, in every synthesis and P\&R run reported in this
|
||||
datasheet.
|
||||
@@ -0,0 +1,54 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@iv {\LT@entry
|
||||
{1}{68.9055pt}\LT@entry
|
||||
{1}{103.04872pt}\LT@entry
|
||||
{1}{300.36172pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Host interface (SPI)}{5}{chapter.4}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {4.1}Opcodes}{5}{section.4.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {4.2}Verification}{5}{section.4.2}\protected@file@percent }
|
||||
\newlabel{sec:host}{{4.2}{5}{Verification}{section.4.2}{}}
|
||||
\@setckpt{chapters/04-host-interface}{
|
||||
\setcounter{page}{6}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{4}
|
||||
\setcounter{section}{2}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{1}
|
||||
\setcounter{LT@tables}{4}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{13}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
\chapter{Host interface (SPI)}
|
||||
|
||||
\code{spi\_host\_bridge.v} is the real, physical host interface for
|
||||
V2's board-level top (\code{fpga\_neural\_v2\_top.v}). It replaces the
|
||||
internal 110-pin \code{reg\_*} bus (a simulation/testbench convenience
|
||||
that must never be represented as a physical board interface) with 4
|
||||
real pins: \sig{spi\_sclk}, \sig{spi\_mosi}, \sig{spi\_miso},
|
||||
\sig{spi\_cs\_n}. Mode 0 (CPOL=0/CPHA=0), MSB-first, one opcode per
|
||||
CS-low period.
|
||||
|
||||
\section{Opcodes}
|
||||
\begin{tabularx}{\textwidth}{L{2cm}L{3.2cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Opcode} & \thd{Name} & \thd{Function} \\
|
||||
\midrule
|
||||
\op{0x10} & \op{WRITE\_JOB} & 15-byte payload: node id, required
|
||||
dependency count, producer ids, \sig{x\_base}, \sig{w\_base},
|
||||
\sig{n\_tiles}, \sig{result\_addr}. Registers one Dependency Manager
|
||||
job; \sig{reg\_valid} is held until the same-cycle
|
||||
\sig{reg\_valid}\,\&\&\,\sig{reg\_ready} acceptance fires. \\
|
||||
\rowa \op{0x01} & \op{WRITE\_MEM} & word-addressed raw SDRAM write,
|
||||
via a second, arbitrated AR port. \\
|
||||
\op{0x02} & \op{READ\_MEM} & word-addressed raw SDRAM read. \\
|
||||
\rowa \op{0x20} & \op{STATUS} & 1-byte status: job-busy, mem-busy,
|
||||
sticky last-job-accepted. \\
|
||||
\op{0x0F} & \op{RESET} & pulses a soft-reset into the compute+memory
|
||||
core (not the SPI bridge's own state, avoiding a self-reset hazard). \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\section{Verification}
|
||||
\label{sec:host}
|
||||
The protocol engine is verified in two independent ways:
|
||||
\begin{itemize}
|
||||
\item \textbf{Isolated}: \code{tb\_spi\_host\_bridge.v}, 18/18 PASS --
|
||||
every opcode, including a real DQM-style byte-masked
|
||||
\op{WRITE\_MEM}.
|
||||
\item \textbf{End-to-end}: \code{tb\_fpga\_neural\_v2\_top\_smoke.v},
|
||||
11/11 PASS -- a single job, two jobs back-to-back, two jobs across a
|
||||
realistic $\sim$85\,\textmu s SPI-paced gap, and a parametric sweep
|
||||
of inter-job gaps (100\,ns / 5\,000\,ns / 50\,000\,ns), all checked
|
||||
bit-exact against a software golden model via a real SDRAM backdoor
|
||||
readback.
|
||||
\end{itemize}
|
||||
Both regressions pass with \textbf{zero regression} to the existing
|
||||
N=2/N=4 D-Stress bit-exact baseline (identical cycle counts before and
|
||||
after every fix applied during this interface's own development).
|
||||
@@ -0,0 +1,64 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@v {\LT@entry
|
||||
{1}{85.97733pt}\LT@entry
|
||||
{1}{57.52458pt}\LT@entry
|
||||
{1}{40.45274pt}\LT@entry
|
||||
{1}{288.3613pt}}
|
||||
\gdef \LT@vi {\LT@entry
|
||||
{1}{108.73918pt}\LT@entry
|
||||
{1}{363.57677pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Pinout, place-and-route, and timing}{6}{chapter.5}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\newlabel{ch:pinout}{{5}{6}{Pinout, place-and-route, and timing}{chapter.5}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {5.1}Final pinout}{6}{section.5.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {5.2}Synthesis (real, this revision)}{6}{section.5.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {5.3}Place and route: 8-seed timing table}{6}{section.5.3}\protected@file@percent }
|
||||
\gdef \LT@vii {\LT@entry
|
||||
{1}{57.52458pt}\LT@entry
|
||||
{1}{80.28644pt}\LT@entry
|
||||
{1}{68.9055pt}\LT@entry
|
||||
{1}{265.59943pt}}
|
||||
\@setckpt{chapters/05-pinout-timing}{
|
||||
\setcounter{page}{8}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{5}
|
||||
\setcounter{section}{3}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{3}
|
||||
\setcounter{LT@tables}{7}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{17}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
\chapter{Pinout, place-and-route, and timing}
|
||||
\label{ch:pinout}
|
||||
|
||||
\section{Final pinout}
|
||||
All 44 top-level signals of \code{fpga\_neural\_v2\_top.v} carry a
|
||||
real ball assignment (\code{v2\_board\_top.lpf}), sourced from the
|
||||
official Lattice pinout CSV (rev.\ 3.0) and confirmed by a real,
|
||||
successful nextpnr-ecp5 P\&R run -- \textbf{no placeholders}.
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{2.6cm}L{1.6cm}L{1cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Signal} & \thd{Ball} & \thd{Bank} & \thd{Notes} \\
|
||||
\midrule
|
||||
\sig{osc\_clk} & H5 & -- & reused from V1's own validated LPF \\
|
||||
\rowa \sig{ext\_rst\_n} & B4 & -- & reused from V1's own validated LPF \\
|
||||
\sig{spi\_sclk} & L3 & 6/7 & real, plain GPIO \\
|
||||
\rowa \sig{spi\_mosi} & M3 & 6/7 & real, plain GPIO \\
|
||||
\sig{spi\_miso} & L2 & 6/7 & real, plain GPIO \\
|
||||
\rowa \sig{spi\_cs\_n} & N2 & 6/7 & real, plain GPIO \\
|
||||
\sig{pll\_locked} & L1 & 6/7 & real, plain GPIO (bring-up/debug) \\
|
||||
\rowa \sig{sdram\_*} (37 signals) & see LPF & 6/7 & control/address/data/mask bus \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
All signals are assumed LVCMOS33, matching banks 6/7's own real VCCIO
|
||||
range and the SDRAM device's own 3.3\,V requirement (not yet
|
||||
independently cross-verified at the schematic/PCB level -- a
|
||||
disclosed WARNING, not a blocker).
|
||||
|
||||
\section{Synthesis (real, this revision)}
|
||||
Yosys \code{synth\_ecp5}, target \code{fpga\_neural\_v2\_top}, real
|
||||
run, zero CHECK-pass problems:
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{3.4cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Resource} & \thd{Count} \\
|
||||
\midrule
|
||||
\code{TRELLIS\_FF} & 6\,322 \\
|
||||
\rowa \code{TRELLIS\_COMB} (LUT4 equiv.) & 7\,084 \\
|
||||
\code{MULT18X18D} & 32 (=\,4 processors $\times$ 8-wide MAC) \\
|
||||
\rowa \code{EHXPLLL} & 1 (real PLL, confirmed present) \\
|
||||
\code{DP16KD} & 0 (all small SRAMs synthesize to distributed RAM) \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
38 unique warnings (43 total), all matching this project's own
|
||||
previously-reviewed, benign baseline set (a known \code{genvar}
|
||||
multi-driver artifact in \code{neural\_processor.v}, small-array-to-
|
||||
register unrolling, and the real SDRAM \code{DQ} tristate bus) -- no
|
||||
new warnings introduced by the SPI bridge, PLL, or reset synchronizer.
|
||||
|
||||
\section{Place and route: 8-seed timing table}
|
||||
Real nextpnr-ecp5 P\&R, same final top and LPF, 8 distinct seeds,
|
||||
target 64\,MHz:
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{1.6cm}L{2.4cm}L{2cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Seed} & \thd{Fmax (MHz)} & \thd{Result} & \thd{Slack @ 64\,MHz} \\
|
||||
\midrule
|
||||
1 & 73.17 & \PASS & +1.958\,ns \\
|
||||
\rowa 2 & 68.90 & \PASS & +1.111\,ns \\
|
||||
3 & 72.10 & \PASS & +1.755\,ns \\
|
||||
\rowa 4 & 68.51 & \PASS & +1.029\,ns (worst) \\
|
||||
5 & 69.29 & \PASS & +1.193\,ns \\
|
||||
\rowa 6 & 73.03 & \PASS & +1.931\,ns \\
|
||||
7 & 74.17 & \PASS & +2.143\,ns (best) \\
|
||||
\rowa 8 & 70.10 & \PASS & +1.360\,ns \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
\textbf{8/8 seeds PASS at 64\,MHz} -- worst 68.51\,MHz, best
|
||||
74.17\,MHz, mean 71.16\,MHz. Every seed also fits with real routing
|
||||
margin: \code{TRELLIS\_IO}=44/245 (17\%), zero unrouted nets, zero
|
||||
placement/routing errors, across all 8 runs.
|
||||
|
||||
The critical path is routing-dominated (typ.\ 15--20\% logic / 80--85\%
|
||||
routing) and alternates, seed to seed, between two comparably-tight
|
||||
structures already documented in this project's own prior timing
|
||||
investigations: \code{dependency\_manager.v}'s own wide priority-encoder
|
||||
scan, and \code{sdram\_unified\_backend.v}'s own weight-cache
|
||||
hit-index logic -- neither is a new defect introduced by this
|
||||
revision.
|
||||
|
||||
Hold timing was not separately reported by this toolchain's standard
|
||||
summary output and was not independently analyzed this round (an
|
||||
honest, disclosed OPEN item, not a fabricated PASS).
|
||||
@@ -0,0 +1,54 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@viii {\LT@entry
|
||||
{1}{85.97733pt}\LT@entry
|
||||
{1}{74.59596pt}\LT@entry
|
||||
{1}{311.74266pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Power, SDRAM electrical, and configuration}{8}{chapter.6}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {6.1}Power architecture -- status: OPEN}{8}{section.6.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {6.2}SDRAM electrical / timing sign-off -- status: PARTIAL}{8}{section.6.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {6.3}Configuration -- status: OPEN}{8}{section.6.3}\protected@file@percent }
|
||||
\@setckpt{chapters/06-power-configuration}{
|
||||
\setcounter{page}{9}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{6}
|
||||
\setcounter{section}{3}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{1}
|
||||
\setcounter{LT@tables}{8}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{21}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
\chapter{Power, SDRAM electrical, and configuration}
|
||||
|
||||
\section{Power architecture -- status: OPEN}
|
||||
Rail \emph{voltages} are real, DATASHEET VALUEs from the actual ECP5
|
||||
and \code{AS4C4M16SA-6TIN} datasheets; regulator selection, current
|
||||
budget, and decoupling are \textbf{not} finalized in this revision.
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{2.6cm}L{2.2cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Rail} & \thd{Nominal} & \thd{Status} \\
|
||||
\midrule
|
||||
VCC (core) & 1.1\,V & DATASHEET VALUE; regulator TBD \\
|
||||
\rowa VCCAUX & 2.5\,V & DATASHEET VALUE; regulator TBD \\
|
||||
VCCIO 6/7 (SDRAM) & 3.3\,V (assumed) & matches SDRAM's own LVCMOS33 need; not independently re-verified \\
|
||||
\rowa SDRAM VDD/VDDQ & 3.3\,V & DATASHEET VALUE (\code{AS4C4M16SA-6TIN}) \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
No real power-estimation tool was run against the actual synthesized
|
||||
netlist this revision; a real, computed current budget therefore
|
||||
remains an OPEN item, not an invented number.
|
||||
|
||||
\section{SDRAM electrical / timing sign-off -- status: PARTIAL}
|
||||
\code{AS4C4M16SA-6TIN} is a standard JEDEC SDR SDRAM; the controller
|
||||
(\code{sdram\_controller.v}) implements a real power-up wait, mode
|
||||
register set, and periodic AUTO REFRESH, verified functionally in
|
||||
simulation (init/refresh/read/write/burst/masked-write, 40 real
|
||||
refresh events per D-Stress run, zero corruption). A byte-for-byte
|
||||
cross-check of the controller's own timing constants against the
|
||||
device's real datasheet parameters (CAS latency, \sig{tRCD},
|
||||
\sig{tRP}, refresh interval, setup/hold) was \textbf{not} independently
|
||||
re-performed this revision -- simulation-level correctness is
|
||||
established; a dedicated datasheet-parameter audit remains an OPEN
|
||||
item before board layout.
|
||||
|
||||
\section{Configuration -- status: OPEN}
|
||||
Standard ECP5 JTAG (\sig{TDI}/\sig{TDO}/\sig{TCK}/\sig{TMS}) and
|
||||
configuration (\sig{PROGRAMN}/\sig{INITN}/\sig{DONE}/\sig{CCLK}) pins
|
||||
are identified and standard (real balls listed in
|
||||
\code{docs/pinouts.md}); JTAG remains available regardless of boot
|
||||
mode. No configuration-flash part number has been selected, and no
|
||||
SPI-flash-boot-vs-JTAG-only decision has been made this revision.
|
||||
@@ -0,0 +1,58 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@ix {\LT@entry
|
||||
{1}{68.9055pt}\LT@entry
|
||||
{1}{80.28644pt}\LT@entry
|
||||
{1}{80.28644pt}\LT@entry
|
||||
{1}{242.83757pt}}
|
||||
\gdef \LT@x {\LT@entry
|
||||
{1}{137.19194pt}\LT@entry
|
||||
{1}{335.12401pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Benchmarks}{9}{chapter.7}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {7.1}Internal benchmark: D-Stress workload}{9}{section.7.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {7.2}Host-interface pacing benchmark}{9}{section.7.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {7.3}Software reference comparison}{9}{section.7.3}\protected@file@percent }
|
||||
\@setckpt{chapters/07-benchmarks}{
|
||||
\setcounter{page}{11}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{7}
|
||||
\setcounter{section}{3}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{2}
|
||||
\setcounter{LT@tables}{10}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{25}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
\chapter{Benchmarks}
|
||||
|
||||
\section{Internal benchmark: D-Stress workload}
|
||||
256 independent neurons, 128 inputs each (16 tiles of \code{P\_IN}=8),
|
||||
one shared activation vector -- the project's own existing, reused
|
||||
benchmark, run against the final, frozen RTL via Verilator.
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{2cm}L{2.4cm}L{2.4cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Config} & \thd{Cycles} & \thd{Correctness} & \thd{Latency @ 64\,MHz} \\
|
||||
\midrule
|
||||
N=2 & 49\,788 & 256/256 \PASS & 777.9\,\textmu s \\
|
||||
\rowa N=4 & 49\,771 & 256/256 \PASS & 777.7\,\textmu s \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
Cycle counts are \textbf{simulation-verified} (Verilator, bit-exact)
|
||||
and unchanged before/after the ERR-0025 read-timing fix. Latency at
|
||||
64\,MHz is a \textbf{derived} figure (cycles~/~clock), not an
|
||||
independently re-simulated wall-clock measurement, and is not a
|
||||
measured-hardware number (no fabricated board exists).
|
||||
|
||||
N=4 barely improves over N=2 on this specific workload
|
||||
($49\,771$ vs.\ $49\,788$ cycles) because the workload is dominated by
|
||||
shared-SDRAM and shared-activation-fill traffic, not by raw MAC
|
||||
throughput -- consistent with this project's own prior STEP17/18
|
||||
memory-bound-vs-compute-bound findings, not a new anomaly.
|
||||
|
||||
\section{Host-interface pacing benchmark}
|
||||
The board-level SPI smoke test (\S\ref{sec:host}) exercises single-job,
|
||||
back-to-back, and gap-swept (100\,ns/5\,000\,ns/50\,000\,ns/$\sim$85\,\textmu s)
|
||||
dispatch patterns -- all 11/11 bit-exact -- establishing that realistic
|
||||
host pacing does not, itself, change correctness (only the STEP19-era
|
||||
registered-read bug did, and that is fixed).
|
||||
|
||||
\section{Software reference comparison}
|
||||
\textbf{No physical ESP32 (or other embedded MCU) hardware is
|
||||
available in this environment.} A real ESP32 benchmark was
|
||||
\emph{not} performed, and no ESP32 number is estimated or invented
|
||||
here -- this is a disclosed OPEN item, not a claimed result.
|
||||
|
||||
As an honest, clearly-labeled illustrative data point only, the
|
||||
identical D-Stress arithmetic (256 neurons $\times$ 128 INT8 MACs,
|
||||
ReLU + INT8 saturate) was compiled (\code{cc~-O2}) and run on the
|
||||
\emph{development machine itself} (Apple M4, arm64 -- \textbf{not}
|
||||
an embedded target):
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{4.4cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Metric} & \thd{Value} \\
|
||||
\midrule
|
||||
Platform & Apple M4 (arm64), \code{cc -O2}, single-threaded scalar C \\
|
||||
\rowa Latency, full 256-neuron batch & 1.28\,\textmu s \\
|
||||
Throughput & $2.56\times10^{10}$ MAC/s \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
On this specific, tiny workload, a modern, auto-vectorizing,
|
||||
multi-GHz superscalar CPU outperforms the current FPGA design's
|
||||
\emph{simulated} cycle count in raw latency. This is reported
|
||||
honestly rather than omitted: FPGA-Neural V2's real value proposition
|
||||
is a deterministic, low-power, standalone SDRAM-attached accelerator
|
||||
for hosts that do \emph{not} have this class of CPU (e.g.\ an
|
||||
ESP32-class microcontroller) -- not a claim of outperforming a
|
||||
desktop-class processor on this workload size. A real, meaningful
|
||||
software baseline for THAT comparison requires the actual embedded
|
||||
target hardware, which remains unavailable this revision.
|
||||
@@ -0,0 +1,54 @@
|
||||
\relax
|
||||
\providecommand\hyper@newdestlabel[2]{}
|
||||
\gdef \LT@xi {\LT@entry
|
||||
{1}{194.09746pt}\LT@entry
|
||||
{1}{278.21849pt}}
|
||||
\@writefile{toc}{\contentsline {chapter}{\numberline {8}Chip readiness and roadmap}{11}{chapter.8}\protected@file@percent }
|
||||
\@writefile{lof}{\addvspace {10\p@ }}
|
||||
\@writefile{lot}{\addvspace {10\p@ }}
|
||||
\newlabel{ch:status}{{8}{11}{Chip readiness and roadmap}{chapter.8}{}}
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {8.1}Precise readiness checklist}{11}{section.8.1}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {8.2}Final answer}{11}{section.8.2}\protected@file@percent }
|
||||
\@writefile{toc}{\contentsline {section}{\numberline {8.3}Roadmap}{11}{section.8.3}\protected@file@percent }
|
||||
\@setckpt{chapters/08-status-roadmap}{
|
||||
\setcounter{page}{13}
|
||||
\setcounter{equation}{0}
|
||||
\setcounter{enumi}{3}
|
||||
\setcounter{enumii}{0}
|
||||
\setcounter{enumiii}{0}
|
||||
\setcounter{enumiv}{0}
|
||||
\setcounter{footnote}{0}
|
||||
\setcounter{mpfootnote}{0}
|
||||
\setcounter{part}{0}
|
||||
\setcounter{chapter}{8}
|
||||
\setcounter{section}{3}
|
||||
\setcounter{subsection}{0}
|
||||
\setcounter{subsubsection}{0}
|
||||
\setcounter{paragraph}{0}
|
||||
\setcounter{subparagraph}{0}
|
||||
\setcounter{figure}{0}
|
||||
\setcounter{table}{1}
|
||||
\setcounter{LT@tables}{11}
|
||||
\setcounter{LT@chunks}{1}
|
||||
\setcounter{parentequation}{0}
|
||||
\setcounter{tcbbreakpart}{0}
|
||||
\setcounter{tcblayer}{0}
|
||||
\setcounter{tcolorbox@number}{0}
|
||||
\setcounter{tcbrastercolumn}{1}
|
||||
\setcounter{tcbrasterrow}{1}
|
||||
\setcounter{tcbrasternum}{1}
|
||||
\setcounter{tcbraster}{0}
|
||||
\setcounter{lstnumber}{1}
|
||||
\setcounter{tcblisting}{0}
|
||||
\setcounter{caption@flags}{0}
|
||||
\setcounter{continuedfloat}{0}
|
||||
\setcounter{tikztiming@nrows}{0}
|
||||
\setcounter{tikztimingrows}{0}
|
||||
\setcounter{tikztimingtrans}{0}
|
||||
\setcounter{tikztimingtranspos}{0}
|
||||
\setcounter{section@level}{0}
|
||||
\setcounter{Item}{3}
|
||||
\setcounter{Hfootnote}{0}
|
||||
\setcounter{bookmark@seq@number}{29}
|
||||
\setcounter{lstlisting}{0}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
\chapter{Chip readiness and roadmap}
|
||||
\label{ch:status}
|
||||
|
||||
\section{Precise readiness checklist}
|
||||
Per this project's own standing rule: no item below is checked unless
|
||||
genuinely verified; no OPEN item is masked as a future enhancement.
|
||||
|
||||
\begin{tabularx}{\textwidth}{L{6.4cm}Y}
|
||||
\toprule
|
||||
\rowh \thd{Item} & \thd{Status} \\
|
||||
\midrule
|
||||
RTL frozen, zero V1 dependency & \OK \\
|
||||
\rowa Bit-exact regression (N=2, N=4) & \OK\ (256/256, Verilator) \\
|
||||
Real SPI host interface, end-to-end & \OK\ (11/11, zero regression) \\
|
||||
\rowa SDRAM validation (init/refresh/masked-write) & \OK \\
|
||||
Synthesis (final top, real Yosys run) & \OK\ (0 CHECK-pass problems) \\
|
||||
\rowa Place\&route (8 real seeds) & \OK\ (8/8 fit, routed, zero errors) \\
|
||||
Timing closure @ 64\,MHz & \OK\ (8/8 seeds PASS, worst 68.51\,MHz) \\
|
||||
\rowa Final pinout (44/44 top-level signals) & \OK\ (real balls, P\&R-confirmed) \\
|
||||
Hold-time analysis & OPEN (not reported by this toolchain's summary) \\
|
||||
\rowa Power: rail voltages & OK (real datasheet values) \\
|
||||
Power: regulator selection / current budget & OPEN \\
|
||||
\rowa SDRAM datasheet-parameter cross-check & OPEN (sim-level only) \\
|
||||
Configuration flash selection & OPEN \\
|
||||
\rowa Real KiCad schematic + ERC & NOT STARTED \\
|
||||
PCB layout & NOT STARTED \\
|
||||
\rowa BOM (sourced, purchasable parts) & NOT STARTED \\
|
||||
Physical board bring-up & NOT APPLICABLE (no board fabricated) \\
|
||||
\rowa Real embedded-target (ESP32) software baseline & NOT AVAILABLE (no hardware) \\
|
||||
\bottomrule
|
||||
\end{tabularx}
|
||||
|
||||
\section{Final answer}
|
||||
\begin{center}
|
||||
\Large\bfseries\color{fnRed}NOT SILICON READY
|
||||
\end{center}
|
||||
The RTL, simulation, synthesis, place-and-route, timing, and pinout
|
||||
gates are all genuinely closed for the final board-level top. The
|
||||
remaining, real, disclosed blockers are entirely in the physical
|
||||
domain -- schematic capture, PCB layout, sourced BOM, and (necessarily)
|
||||
physical fabrication and bring-up -- none of which were claimed
|
||||
complete in this revision.
|
||||
|
||||
\section{Roadmap}
|
||||
\begin{itemize}
|
||||
\item Real KiCad schematic capture + ERC.
|
||||
\item PCB layout (BGA escape, SDRAM routing, power integrity).
|
||||
\item Sourced, purchasable BOM (regulators, configuration flash,
|
||||
connectors).
|
||||
\item Real power current-budget estimate against the actual
|
||||
synthesized netlist.
|
||||
\item Real SDRAM-datasheet-parameter cross-check of controller timing
|
||||
constants.
|
||||
\item First physical board fabrication and the 15-step bring-up
|
||||
procedure already documented in \code{FIRST\_POWER\_ON.md}.
|
||||
\item A real embedded-target (ESP32-class) software baseline, once
|
||||
hardware is available, to replace this revision's honestly-labeled
|
||||
desktop-CPU illustrative comparison.
|
||||
\end{itemize}
|
||||
@@ -0,0 +1,184 @@
|
||||
% ======================================================================
|
||||
% FPGA-Neural Datasheet -- preamble / stile
|
||||
% ======================================================================
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage[english]{babel}
|
||||
\usepackage{helvet}
|
||||
\renewcommand{\familydefault}{\sfdefault}
|
||||
\usepackage{courier}
|
||||
\usepackage{microtype}
|
||||
|
||||
\usepackage[a4paper,top=2.4cm,bottom=2.3cm,left=2.2cm,right=2.2cm,headheight=15pt]{geometry}
|
||||
\usepackage[table]{xcolor}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{tabularx}
|
||||
\usepackage{longtable}
|
||||
\usepackage{array}
|
||||
\usepackage{ltablex}
|
||||
\keepXColumns
|
||||
\usepackage{multirow}
|
||||
\usepackage{multicol}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{ragged2e}
|
||||
|
||||
% ---------- Palette ----------------------------------------------------
|
||||
\definecolor{fnDark}{HTML}{0B2E4F} % blu profondo (primario)
|
||||
\definecolor{fnBlue}{HTML}{15629B} % blu medio
|
||||
\definecolor{fnTeal}{HTML}{0E8F8A} % accento teal
|
||||
\definecolor{fnAmber}{HTML}{C9761B} % accento ambra
|
||||
\definecolor{fnRed}{HTML}{B22C34} % fail / warning
|
||||
\definecolor{fnGreen}{HTML}{2E7D32} % pass / ok
|
||||
\definecolor{fnGrey}{HTML}{5B6B78}
|
||||
\definecolor{fnLight}{HTML}{EEF3F7} % sfondo chiaro
|
||||
\definecolor{fnLight2}{HTML}{E2ECF3}
|
||||
\definecolor{fnRule}{HTML}{9FB4C4}
|
||||
\definecolor{codebg}{HTML}{F5F7F9}
|
||||
\definecolor{codekw}{HTML}{15629B}
|
||||
\definecolor{codecom}{HTML}{5B6B78}
|
||||
\definecolor{codestr}{HTML}{0E8F8A}
|
||||
|
||||
% ---------- Titoli -----------------------------------------------------
|
||||
\usepackage{titlesec}
|
||||
\titleformat{\chapter}[display]
|
||||
{\normalfont\bfseries\color{fnDark}}
|
||||
{\filright\Large\color{fnTeal}CHAPTER \thechapter}
|
||||
{6pt}
|
||||
{\Huge\filright}
|
||||
[\vspace{2pt}{\color{fnRule}\titlerule[1.3pt]}]
|
||||
\titlespacing*{\chapter}{0pt}{6pt}{18pt}
|
||||
|
||||
\titleformat{\section}
|
||||
{\normalfont\large\bfseries\color{fnDark}}{\thesection}{0.6em}{}
|
||||
\titleformat{\subsection}
|
||||
{\normalfont\bfseries\color{fnBlue}}{\thesubsection}{0.6em}{}
|
||||
\titleformat{\subsubsection}
|
||||
{\normalfont\bfseries\color{fnGrey}}{\thesubsubsection}{0.6em}{}
|
||||
\titlespacing*{\section}{0pt}{12pt}{4pt}
|
||||
|
||||
% ---------- Header / footer -------------------------------------------
|
||||
\usepackage{fancyhdr}
|
||||
\pagestyle{fancy}
|
||||
\fancyhf{}
|
||||
\renewcommand{\headrulewidth}{0.6pt}
|
||||
\renewcommand{\footrulewidth}{0.4pt}
|
||||
\renewcommand{\headrule}{\hbox to\headwidth{\color{fnRule}\leaders\hrule height \headrulewidth\hfill}}
|
||||
\renewcommand{\footrule}{\hbox to\headwidth{\color{fnRule}\leaders\hrule height \footrulewidth\hfill}}
|
||||
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
|
||||
\fancyhead[L]{\small\color{fnDark}\textbf{FPGA-Neural}}
|
||||
\fancyhead[R]{\footnotesize\color{fnGrey}\nouppercase{\leftmark}}
|
||||
\fancyfoot[L]{\small\color{fnGrey}Datasheet~\textbf{Rev.\,\datasheetrev}}
|
||||
\fancyfoot[C]{\small\color{fnGrey}manvalan/FPGA-Neural}
|
||||
\fancyfoot[R]{\small\color{fnGrey}\thepage}
|
||||
\fancypagestyle{plain}{\fancyhf{}%
|
||||
\fancyfoot[L]{\small\color{fnGrey}Datasheet~\textbf{Rev.\,\datasheetrev}}%
|
||||
\fancyfoot[C]{\small\color{fnGrey}manvalan/FPGA-Neural}%
|
||||
\fancyfoot[R]{\small\color{fnGrey}\thepage}%
|
||||
\renewcommand{\headrulewidth}{0pt}}
|
||||
|
||||
% ---------- tcolorbox --------------------------------------------------
|
||||
\usepackage[most]{tcolorbox}
|
||||
\tcbuselibrary{skins,breakable}
|
||||
|
||||
% Box "nota"
|
||||
\newtcolorbox{fnnote}[1][Note]{
|
||||
enhanced, breakable, colback=fnLight, colframe=fnTeal,
|
||||
boxrule=0.4pt, left=8pt, right=8pt, top=5pt, bottom=5pt,
|
||||
fonttitle=\bfseries\color{white}, coltitle=white,
|
||||
attach boxed title to top left={xshift=6pt,yshift=-3pt},
|
||||
boxed title style={colback=fnTeal,boxrule=0pt,arc=1pt}, title={#1}}
|
||||
|
||||
% Box "attenzione"
|
||||
\newtcolorbox{fnwarn}[1][Warning]{
|
||||
enhanced, breakable, colback=fnLight, colframe=fnAmber,
|
||||
boxrule=0.4pt, left=8pt, right=8pt, top=5pt, bottom=5pt,
|
||||
fonttitle=\bfseries\color{white}, coltitle=white,
|
||||
attach boxed title to top left={xshift=6pt,yshift=-3pt},
|
||||
boxed title style={colback=fnAmber,boxrule=0pt,arc=1pt}, title={#1}}
|
||||
|
||||
% Box "registro/parametro"
|
||||
\newtcolorbox{fnspec}[1][Specification]{
|
||||
enhanced, breakable, colback=white, colframe=fnBlue,
|
||||
boxrule=0.7pt, left=8pt, right=8pt, top=5pt, bottom=5pt, arc=1.5pt,
|
||||
fonttitle=\bfseries\color{white}, coltitle=white,
|
||||
attach boxed title to top left={xshift=6pt,yshift=-3pt},
|
||||
boxed title style={colback=fnBlue,boxrule=0pt,arc=1pt}, title={#1}}
|
||||
|
||||
% ---------- listings (Verilog) ----------------------------------------
|
||||
\usepackage{listings}
|
||||
\lstdefinestyle{verilog}{
|
||||
language=Verilog,
|
||||
backgroundcolor=\color{codebg},
|
||||
basicstyle=\ttfamily\scriptsize,
|
||||
keywordstyle=\color{codekw}\bfseries,
|
||||
commentstyle=\color{codecom}\itshape,
|
||||
stringstyle=\color{codestr},
|
||||
numbers=left, numberstyle=\tiny\color{fnGrey}, numbersep=7pt,
|
||||
showstringspaces=false, breaklines=true, frame=leftline,
|
||||
framerule=1.2pt, rulecolor=\color{fnTeal},
|
||||
xleftmargin=12pt, framexleftmargin=10pt, tabsize=2,
|
||||
morekeywords={logic,always_ff,always_comb,localparam,signed,genvar,generate,endgenerate}
|
||||
}
|
||||
\lstset{style=verilog}
|
||||
|
||||
% ---------- Tabelle ----------------------------------------------------
|
||||
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}p{#1}}
|
||||
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}
|
||||
\newcolumntype{R}[1]{>{\raggedleft\arraybackslash}p{#1}}
|
||||
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}
|
||||
\renewcommand{\arraystretch}{1.25}
|
||||
\arrayrulecolor{fnRule}
|
||||
|
||||
% intestazione tabella colorata
|
||||
\newcommand{\thd}[1]{\textbf{\color{white}#1}}
|
||||
\newcommand{\rowh}{\rowcolor{fnDark}}
|
||||
\newcommand{\rowa}{\rowcolor{fnLight}}
|
||||
|
||||
% ---------- Caption ----------------------------------------------------
|
||||
\usepackage{caption}
|
||||
\captionsetup{font=small,labelfont={bf,color=fnTeal},labelsep=period}
|
||||
|
||||
% ---------- TikZ / pgfplots -------------------------------------------
|
||||
\usepackage{tikz}
|
||||
\usetikzlibrary{arrows.meta,positioning,calc,shapes.geometric,shapes.misc,
|
||||
fit,backgrounds,chains,decorations.pathreplacing,decorations.markings,
|
||||
matrix,shadows.blur}
|
||||
\usepackage{pgfplots}
|
||||
\pgfplotsset{compat=1.17}
|
||||
\usepackage{tikz-timing}
|
||||
|
||||
% stili di blocco riusabili
|
||||
\tikzset{
|
||||
fnblock/.style={draw=fnBlue,fill=fnLight,rounded corners=2pt,
|
||||
minimum height=9mm,minimum width=24mm,align=center,font=\small,
|
||||
inner sep=4pt,line width=0.7pt},
|
||||
fnblockT/.style={fnblock,draw=fnTeal,fill=fnLight2},
|
||||
fnblockD/.style={fnblock,draw=fnDark,fill=fnDark,text=white},
|
||||
fnblockA/.style={fnblock,draw=fnAmber,fill=white},
|
||||
fnreg/.style={draw=fnGrey,fill=white,minimum height=8mm,align=center,
|
||||
font=\footnotesize,inner sep=3pt},
|
||||
fnstate/.style={draw=fnBlue,fill=fnLight,circle,minimum size=13mm,
|
||||
align=center,font=\scriptsize,line width=0.7pt},
|
||||
fnarrow/.style={-{Stealth[length=2.6mm]},line width=0.8pt,draw=fnDark},
|
||||
fnarrowT/.style={-{Stealth[length=2.6mm]},line width=0.8pt,draw=fnTeal},
|
||||
fnbus/.style={-{Stealth[length=3mm]},line width=1.6pt,draw=fnBlue},
|
||||
fnlbl/.style={font=\scriptsize\itshape,fill=white,inner sep=1pt,text=fnGrey}
|
||||
}
|
||||
|
||||
% ---------- varie ------------------------------------------------------
|
||||
\newcommand{\reg}[1]{\texttt{\textbf{#1}}}
|
||||
\newcommand{\sig}[1]{\texttt{#1}}
|
||||
\newcommand{\op}[1]{\texttt{\color{fnBlue}#1}}
|
||||
\newcommand{\PASS}{\textcolor{fnGreen}{\textbf{PASS}}}
|
||||
\newcommand{\FAIL}{\textcolor{fnRed}{\textbf{FAIL}}}
|
||||
\newcommand{\OK}{\textcolor{fnGreen}{\textbf{OK}}}
|
||||
\newcommand{\code}[1]{\texttt{#1}}
|
||||
|
||||
\usepackage{enumitem}
|
||||
\setlist{noitemsep,topsep=2pt,leftmargin=1.4em}
|
||||
|
||||
\usepackage[hidelinks,colorlinks=true,linkcolor=fnBlue,urlcolor=fnTeal,
|
||||
citecolor=fnBlue]{hyperref}
|
||||
@@ -0,0 +1,378 @@
|
||||
Info: constraining clock net 'osc_clk' to 16.00 MHz
|
||||
|
||||
Info: Logic utilisation before packing:
|
||||
Info: Total LUT4s: 6634/43848 15%
|
||||
Info: logic LUTs: 4074/43848 9%
|
||||
Info: carry LUTs: 1426/43848 3%
|
||||
Info: RAM LUTs: 756/ 5481 13%
|
||||
Info: RAMW LUTs: 378/10962 3%
|
||||
|
||||
Info: Total DFFs: 6322/43848 14%
|
||||
|
||||
Info: Packing IOs..
|
||||
Info: $sdram_dq[15]$iobuf_i: sdram_dq_$_TBUF__Y.Y
|
||||
Info: pin 'sdram_dq[15]$tr_io' constrained to Bel 'X0/Y59/PIOB'.
|
||||
Info: $sdram_dq[14]$iobuf_i: sdram_dq_$_TBUF__Y_15.Y
|
||||
Info: pin 'sdram_dq[14]$tr_io' constrained to Bel 'X0/Y59/PIOC'.
|
||||
Info: $sdram_dq[13]$iobuf_i: sdram_dq_$_TBUF__Y_14.Y
|
||||
Info: pin 'sdram_dq[13]$tr_io' constrained to Bel 'X0/Y59/PIOA'.
|
||||
Info: $sdram_dq[12]$iobuf_i: sdram_dq_$_TBUF__Y_13.Y
|
||||
Info: pin 'sdram_dq[12]$tr_io' constrained to Bel 'X0/Y53/PIOA'.
|
||||
Info: $sdram_dq[11]$iobuf_i: sdram_dq_$_TBUF__Y_12.Y
|
||||
Info: pin 'sdram_dq[11]$tr_io' constrained to Bel 'X0/Y44/PIOD'.
|
||||
Info: $sdram_dq[10]$iobuf_i: sdram_dq_$_TBUF__Y_11.Y
|
||||
Info: pin 'sdram_dq[10]$tr_io' constrained to Bel 'X0/Y44/PIOC'.
|
||||
Info: $sdram_dq[9]$iobuf_i: sdram_dq_$_TBUF__Y_10.Y
|
||||
Info: pin 'sdram_dq[9]$tr_io' constrained to Bel 'X0/Y44/PIOA'.
|
||||
Info: $sdram_dq[8]$iobuf_i: sdram_dq_$_TBUF__Y_9.Y
|
||||
Info: pin 'sdram_dq[8]$tr_io' constrained to Bel 'X0/Y41/PIOD'.
|
||||
Info: $sdram_dq[7]$iobuf_i: sdram_dq_$_TBUF__Y_8.Y
|
||||
Info: pin 'sdram_dq[7]$tr_io' constrained to Bel 'X0/Y41/PIOB'.
|
||||
Info: $sdram_dq[6]$iobuf_i: sdram_dq_$_TBUF__Y_7.Y
|
||||
Info: pin 'sdram_dq[6]$tr_io' constrained to Bel 'X0/Y41/PIOC'.
|
||||
Info: $sdram_dq[5]$iobuf_i: sdram_dq_$_TBUF__Y_6.Y
|
||||
Info: pin 'sdram_dq[5]$tr_io' constrained to Bel 'X0/Y41/PIOA'.
|
||||
Info: $sdram_dq[4]$iobuf_i: sdram_dq_$_TBUF__Y_5.Y
|
||||
Info: pin 'sdram_dq[4]$tr_io' constrained to Bel 'X0/Y38/PIOD'.
|
||||
Info: $sdram_dq[3]$iobuf_i: sdram_dq_$_TBUF__Y_4.Y
|
||||
Info: pin 'sdram_dq[3]$tr_io' constrained to Bel 'X0/Y38/PIOB'.
|
||||
Info: $sdram_dq[2]$iobuf_i: sdram_dq_$_TBUF__Y_3.Y
|
||||
Info: pin 'sdram_dq[2]$tr_io' constrained to Bel 'X0/Y29/PIOD'.
|
||||
Info: $sdram_dq[1]$iobuf_i: sdram_dq_$_TBUF__Y_2.Y
|
||||
Info: pin 'sdram_dq[1]$tr_io' constrained to Bel 'X0/Y29/PIOB'.
|
||||
Info: $sdram_dq[0]$iobuf_i: sdram_dq_$_TBUF__Y_1.Y
|
||||
Info: pin 'sdram_dq[0]$tr_io' constrained to Bel 'X0/Y26/PIOD'.
|
||||
Info: pin 'spi_sclk$tr_io' constrained to Bel 'X0/Y62/PIOC'.
|
||||
Info: pin 'spi_mosi$tr_io' constrained to Bel 'X0/Y62/PIOB'.
|
||||
Info: pin 'spi_miso$tr_io' constrained to Bel 'X0/Y62/PIOD'.
|
||||
Info: pin 'spi_cs_n$tr_io' constrained to Bel 'X0/Y65/PIOA'.
|
||||
Info: pin 'sdram_we_n$tr_io' constrained to Bel 'X0/Y14/PIOD'.
|
||||
Info: pin 'sdram_ras_n$tr_io' constrained to Bel 'X0/Y14/PIOA'.
|
||||
Info: pin 'sdram_dqm[1]$tr_io' constrained to Bel 'X0/Y62/PIOA'.
|
||||
Info: pin 'sdram_dqm[0]$tr_io' constrained to Bel 'X0/Y59/PIOD'.
|
||||
Info: pin 'sdram_cs_n$tr_io' constrained to Bel 'X0/Y11/PIOD'.
|
||||
Info: pin 'sdram_cke$tr_io' constrained to Bel 'X0/Y11/PIOC'.
|
||||
Info: pin 'sdram_cas_n$tr_io' constrained to Bel 'X0/Y14/PIOC'.
|
||||
Info: pin 'sdram_ba[1]$tr_io' constrained to Bel 'X0/Y17/PIOC'.
|
||||
Info: pin 'sdram_ba[0]$tr_io' constrained to Bel 'X0/Y17/PIOA'.
|
||||
Info: pin 'sdram_a[11]$tr_io' constrained to Bel 'X0/Y26/PIOB'.
|
||||
Info: pin 'sdram_a[10]$tr_io' constrained to Bel 'X0/Y26/PIOC'.
|
||||
Info: pin 'sdram_a[9]$tr_io' constrained to Bel 'X0/Y26/PIOA'.
|
||||
Info: pin 'sdram_a[8]$tr_io' constrained to Bel 'X0/Y23/PIOD'.
|
||||
Info: pin 'sdram_a[7]$tr_io' constrained to Bel 'X0/Y23/PIOB'.
|
||||
Info: pin 'sdram_a[6]$tr_io' constrained to Bel 'X0/Y23/PIOA'.
|
||||
Info: pin 'sdram_a[5]$tr_io' constrained to Bel 'X0/Y20/PIOD'.
|
||||
Info: pin 'sdram_a[4]$tr_io' constrained to Bel 'X0/Y20/PIOB'.
|
||||
Info: pin 'sdram_a[3]$tr_io' constrained to Bel 'X0/Y20/PIOC'.
|
||||
Info: pin 'sdram_a[2]$tr_io' constrained to Bel 'X0/Y20/PIOA'.
|
||||
Info: pin 'sdram_a[1]$tr_io' constrained to Bel 'X0/Y17/PIOD'.
|
||||
Info: pin 'sdram_a[0]$tr_io' constrained to Bel 'X0/Y17/PIOB'.
|
||||
Info: pin 'pll_locked$tr_io' constrained to Bel 'X0/Y65/PIOC'.
|
||||
Info: pin 'osc_clk$tr_io' constrained to Bel 'X0/Y29/PIOC'.
|
||||
Info: pin 'ext_rst_n$tr_io' constrained to Bel 'X0/Y14/PIOB'.
|
||||
Info: placed PLL 'u_pll.pll_i' at bel 'X1/Y4/EHXPLL_UL'
|
||||
Info: Packing constants..
|
||||
Info: Packing carries...
|
||||
Info: Packing LUTs...
|
||||
Info: Packing LUT5-7s...
|
||||
Info: Packing FFs...
|
||||
Info: 2575 FFs paired with LUTs.
|
||||
Info: Generating derived timing constraints...
|
||||
Info: Input frequency of PLL 'u_pll.pll_i' is constrained to 16.0 MHz
|
||||
Info: Derived frequency constraint of 64.0 MHz for net clk
|
||||
Info: Promoting globals...
|
||||
Info: promoting clock net clk to global network
|
||||
Info: Checksum: 0xb24b3184
|
||||
|
||||
Info: Device utilisation:
|
||||
Info: TRELLIS_IO: 44/ 245 17%
|
||||
Info: DCCA: 1/ 56 1%
|
||||
Info: DP16KD: 0/ 108 0%
|
||||
Info: MULT18X18D: 32/ 72 44%
|
||||
Info: ALU54B: 0/ 36 0%
|
||||
Info: EHXPLLL: 1/ 4 25%
|
||||
Info: EXTREFB: 0/ 2 0%
|
||||
Info: DCUA: 0/ 2 0%
|
||||
Info: PCSCLKDIV: 0/ 2 0%
|
||||
Info: IOLOGIC: 0/ 160 0%
|
||||
Info: SIOLOGIC: 0/ 85 0%
|
||||
Info: GSR: 0/ 1 0%
|
||||
Info: JTAGG: 0/ 1 0%
|
||||
Info: OSCG: 0/ 1 0%
|
||||
Info: SEDGA: 0/ 1 0%
|
||||
Info: DTR: 0/ 1 0%
|
||||
Info: USRMCLK: 0/ 1 0%
|
||||
Info: CLKDIVF: 0/ 4 0%
|
||||
Info: ECLKSYNCB: 0/ 10 0%
|
||||
Info: DLLDELD: 0/ 8 0%
|
||||
Info: DDRDLL: 0/ 4 0%
|
||||
Info: DQSBUFM: 0/ 10 0%
|
||||
Info: TRELLIS_ECLKBUF: 0/ 8 0%
|
||||
Info: ECLKBRIDGECS: 0/ 2 0%
|
||||
Info: DCSC: 0/ 2 0%
|
||||
Info: TRELLIS_FF: 6322/ 43848 14%
|
||||
Info: TRELLIS_COMB: 7084/ 43848 16%
|
||||
Info: TRELLIS_RAMW: 189/ 5481 3%
|
||||
|
||||
Info: Placed 45 cells based on constraints.
|
||||
Info: Creating initial analytic placement for 7811 cells, random placement wirelen = 635413.
|
||||
Info: at initial placer iter 0, wirelen = 3641
|
||||
Info: at initial placer iter 1, wirelen = 3058
|
||||
Info: at initial placer iter 2, wirelen = 2978
|
||||
Info: at initial placer iter 3, wirelen = 3006
|
||||
Info: Running main analytical placer, max placement attempts per cell = 23368866.
|
||||
Info: at iteration #1, type ALL: wirelen solved = 2851, spread = 105823, legal = 123819; time = 0.20s
|
||||
Info: at iteration #2, type ALL: wirelen solved = 12848, spread = 74308, legal = 90806; time = 0.19s
|
||||
Info: at iteration #3, type ALL: wirelen solved = 18878, spread = 70946, legal = 86425; time = 0.16s
|
||||
Info: at iteration #4, type ALL: wirelen solved = 23629, spread = 67877, legal = 80958; time = 0.16s
|
||||
Info: at iteration #5, type ALL: wirelen solved = 25972, spread = 66034, legal = 82304; time = 0.14s
|
||||
Info: at iteration #6, type ALL: wirelen solved = 27044, spread = 64778, legal = 81280; time = 0.16s
|
||||
Info: at iteration #7, type ALL: wirelen solved = 27677, spread = 65077, legal = 78916; time = 0.13s
|
||||
Info: at iteration #8, type ALL: wirelen solved = 28674, spread = 64171, legal = 80070; time = 0.16s
|
||||
Info: at iteration #9, type ALL: wirelen solved = 29347, spread = 64047, legal = 77328; time = 0.15s
|
||||
Info: at iteration #10, type ALL: wirelen solved = 29869, spread = 64168, legal = 79757; time = 0.15s
|
||||
Info: at iteration #11, type ALL: wirelen solved = 30347, spread = 63680, legal = 78577; time = 0.14s
|
||||
Info: at iteration #12, type ALL: wirelen solved = 30887, spread = 67391, legal = 77285; time = 0.14s
|
||||
Info: at iteration #13, type ALL: wirelen solved = 34628, spread = 66938, legal = 79231; time = 0.14s
|
||||
Info: at iteration #14, type ALL: wirelen solved = 35255, spread = 66705, legal = 76218; time = 0.11s
|
||||
Info: at iteration #15, type ALL: wirelen solved = 35781, spread = 66489, legal = 76421; time = 0.12s
|
||||
Info: at iteration #16, type ALL: wirelen solved = 35889, spread = 66722, legal = 79650; time = 0.13s
|
||||
Info: at iteration #17, type ALL: wirelen solved = 35933, spread = 66113, legal = 76579; time = 0.14s
|
||||
Info: at iteration #18, type ALL: wirelen solved = 36378, spread = 66541, legal = 79035; time = 0.14s
|
||||
Info: at iteration #19, type ALL: wirelen solved = 36628, spread = 66908, legal = 79994; time = 0.13s
|
||||
Info: HeAP Placer Time: 3.65s
|
||||
Info: of which solving equations: 1.79s
|
||||
Info: of which spreading cells: 0.31s
|
||||
Info: of which strict legalisation: 1.01s
|
||||
|
||||
Info: Running simulated annealing placer for refinement.
|
||||
Info: at iteration #1: temp = 0.000000, timing cost = 811, wirelen = 76218
|
||||
Info: at iteration #5: temp = 0.000000, timing cost = 1839, wirelen = 70366
|
||||
Info: at iteration #10: temp = 0.000000, timing cost = 1064, wirelen = 68627
|
||||
Info: at iteration #15: temp = 0.000000, timing cost = 998, wirelen = 68181
|
||||
Info: at iteration #20: temp = 0.000000, timing cost = 989, wirelen = 68031
|
||||
Info: at iteration #25: temp = 0.000000, timing cost = 981, wirelen = 67961
|
||||
Info: at iteration #26: temp = 0.000000, timing cost = 976, wirelen = 67948
|
||||
Info: SA placement time 5.68s
|
||||
|
||||
Info: Max frequency for clock '$glbnet$clk': 55.01 MHz (FAIL at 64.00 MHz)
|
||||
|
||||
Info: Max delay <async> -> posedge $glbnet$clk: 5.11 ns
|
||||
Info: Max delay posedge $glbnet$clk -> <async> : 11.47 ns
|
||||
|
||||
Info: Slack histogram:
|
||||
Info: legend: * represents 35 endpoint(s)
|
||||
Info: + represents [1,35) endpoint(s)
|
||||
Info: [ -2553, -1682) |+
|
||||
Info: [ -1682, -811) |+
|
||||
Info: [ -811, 60) |***+
|
||||
Info: [ 60, 931) |***+
|
||||
Info: [ 931, 1802) |****+
|
||||
Info: [ 1802, 2673) |******+
|
||||
Info: [ 2673, 3544) |********+
|
||||
Info: [ 3544, 4415) |************+
|
||||
Info: [ 4415, 5286) |****************+
|
||||
Info: [ 5286, 6157) |*********************************+
|
||||
Info: [ 6157, 7028) |***************************************+
|
||||
Info: [ 7028, 7899) |******************************************+
|
||||
Info: [ 7899, 8770) |******************************+
|
||||
Info: [ 8770, 9641) |********************************+
|
||||
Info: [ 9641, 10512) |******************************+
|
||||
Info: [ 10512, 11383) |********************************+
|
||||
Info: [ 11383, 12254) |*****************************************************+
|
||||
Info: [ 12254, 13125) |************************************************************
|
||||
Info: [ 13125, 13996) |*******************************************************+
|
||||
Info: [ 13996, 14867) |*********************************************+
|
||||
Info: Checksum: 0x5d5c6e8a
|
||||
Info: Routing globals...
|
||||
Info: routing clock net $glbnet$clk using global 0
|
||||
|
||||
Info: Routing..
|
||||
Info: Setting up routing queue.
|
||||
Info: Routing 37675 arcs.
|
||||
Info: | (re-)routed arcs | delta | remaining| time spent |
|
||||
Info: IterCnt | w/ripup wo/ripup | w/r wo/r | arcs| batch(sec) total(sec)|
|
||||
Info: 1000 | 419 580 | 419 580 | 37353| 0.43 0.43|
|
||||
Info: 2000 | 583 1416 | 164 836 | 36558| 0.23 0.66|
|
||||
Info: 3000 | 770 2229 | 187 813 | 35851| 0.20 0.86|
|
||||
Info: 4000 | 911 3088 | 141 859 | 35050| 0.16 1.02|
|
||||
Info: 5000 | 1030 3969 | 119 881 | 34240| 0.14 1.16|
|
||||
Info: 6000 | 1126 4873 | 96 904 | 33433| 0.15 1.31|
|
||||
Info: 7000 | 1228 5771 | 102 898 | 32626| 0.13 1.44|
|
||||
Info: 8000 | 1315 6684 | 87 913 | 31773| 0.15 1.60|
|
||||
Info: 9000 | 1415 7584 | 100 900 | 30983| 0.14 1.73|
|
||||
Info: 10000 | 1551 8448 | 136 864 | 30319| 0.16 1.90|
|
||||
Info: 11000 | 1652 9347 | 101 899 | 29468| 0.14 2.04|
|
||||
Info: 12000 | 1762 10237 | 110 890 | 28715| 0.12 2.15|
|
||||
Info: 13000 | 1904 11095 | 142 858 | 27921| 0.14 2.29|
|
||||
Info: 14000 | 2069 11930 | 165 835 | 27228| 0.13 2.42|
|
||||
Info: 15000 | 2184 12815 | 115 885 | 26471| 0.13 2.55|
|
||||
Info: 16000 | 2327 13672 | 143 857 | 25781| 0.17 2.71|
|
||||
Info: 17000 | 2504 14495 | 177 823 | 25060| 0.12 2.84|
|
||||
Info: 18000 | 2737 15262 | 233 767 | 24524| 0.15 2.98|
|
||||
Info: 19000 | 2876 16123 | 139 861 | 23853| 0.19 3.17|
|
||||
Info: 20000 | 3048 16948 | 172 825 | 23152| 0.13 3.30|
|
||||
Info: 21000 | 3336 17659 | 288 711 | 22496| 0.12 3.42|
|
||||
Info: 22000 | 3544 18440 | 208 781 | 21769| 0.11 3.54|
|
||||
Info: 23000 | 3769 19204 | 225 764 | 21250| 0.18 3.71|
|
||||
Info: 24000 | 4012 19949 | 243 745 | 20632| 0.15 3.86|
|
||||
Info: 25000 | 4252 20697 | 240 748 | 19952| 0.14 4.00|
|
||||
Info: 26000 | 4517 21413 | 265 716 | 19279| 0.12 4.12|
|
||||
Info: 27000 | 4726 22171 | 209 758 | 18550| 0.13 4.25|
|
||||
Info: 28000 | 4914 22961 | 188 790 | 17871| 0.13 4.39|
|
||||
Info: 29000 | 5077 23715 | 163 754 | 17083| 0.12 4.51|
|
||||
Info: 30000 | 5244 24483 | 167 768 | 16309| 0.11 4.62|
|
||||
Info: 31000 | 5441 25242 | 197 759 | 15588| 0.12 4.74|
|
||||
Info: 32000 | 5647 26002 | 206 760 | 15031| 0.15 4.89|
|
||||
Info: 33000 | 5815 26811 | 168 809 | 14346| 0.11 5.00|
|
||||
Info: 34000 | 5963 27591 | 148 780 | 13591| 0.12 5.12|
|
||||
Info: 35000 | 6114 28372 | 151 781 | 12881| 0.15 5.28|
|
||||
Info: 36000 | 6255 29197 | 141 825 | 12144| 0.12 5.40|
|
||||
Info: 37000 | 6417 30013 | 162 816 | 11508| 0.16 5.56|
|
||||
Info: 38000 | 6512 30859 | 95 846 | 10796| 0.12 5.68|
|
||||
Info: 39000 | 6634 31704 | 122 845 | 9991| 0.15 5.83|
|
||||
Info: 40000 | 6755 32507 | 121 803 | 9206| 0.11 5.94|
|
||||
Info: 41000 | 6919 33305 | 164 798 | 8538| 0.21 6.15|
|
||||
Info: 42000 | 7054 34113 | 135 808 | 7753| 0.15 6.30|
|
||||
Info: 43000 | 7173 34919 | 119 806 | 6932| 0.12 6.42|
|
||||
Info: 44000 | 7402 35656 | 229 737 | 6354| 0.24 6.66|
|
||||
Info: 45000 | 7499 36517 | 97 861 | 5552| 0.09 6.76|
|
||||
Info: 46000 | 7761 37251 | 262 734 | 5018| 0.24 7.00|
|
||||
Info: 47000 | 8050 37956 | 289 705 | 4602| 0.23 7.23|
|
||||
Info: 48000 | 8179 38827 | 129 871 | 3829| 0.10 7.33|
|
||||
Info: 49000 | 8436 39570 | 257 743 | 3221| 0.29 7.61|
|
||||
Info: 50000 | 8700 40306 | 264 736 | 2865| 0.31 7.92|
|
||||
Info: 51000 | 8962 41044 | 262 738 | 2239| 0.16 8.08|
|
||||
Info: 52000 | 9165 41792 | 203 748 | 1504| 0.15 8.23|
|
||||
Info: 53000 | 9312 42547 | 147 755 | 895| 0.22 8.45|
|
||||
Info: 54000 | 9443 43303 | 131 756 | 142| 0.19 8.64|
|
||||
Info: 54162 | 9461 43421 | 18 118 | 0| 0.05 8.69|
|
||||
Info: Routing complete.
|
||||
Info: Router1 time 8.69s
|
||||
Info: Checksum: 0x662d74ce
|
||||
|
||||
Info: Critical path report for clock '$glbnet$clk' (posedge -> posedge):
|
||||
Info: type curr total name
|
||||
Info: clk-to-q 0.52 0.52 Source u_arbiter_wide.m_addr_TRELLIS_FF_Q_15.Q
|
||||
Info: routing 0.92 1.45 Net wide_arb_m_addr[16] (19,3) -> (18,3)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z_D_LUT4_Z_3_D_LUT4_Z.C
|
||||
Info: Defined in:
|
||||
Info: hardware/v2/nms/rtl/fpga_neural_v2_top.v:217.28-217.43
|
||||
Info: logic 0.24 1.68 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z_D_LUT4_Z_3_D_LUT4_Z.F
|
||||
Info: routing 0.62 2.31 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z_D_LUT4_Z_3_D[2] (18,3) -> (18,3)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z_D_LUT4_Z_3.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 2.54 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z_D_LUT4_Z_3.F
|
||||
Info: routing 1.13 3.67 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z_D[2] (18,3) -> (17,4)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z.C
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 3.90 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D_LUT4_Z.F
|
||||
Info: routing 0.88 4.78 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1_D[3] (17,4) -> (16,4)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 5.02 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_D_LUT4_Z_1.F
|
||||
Info: routing 1.78 6.80 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_C[0] (16,4) -> (13,21)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_1.C
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 7.03 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_1.F
|
||||
Info: routing 1.39 8.43 Net u_sdram_backend.w_hit_idx_c[1] (13,21) -> (14,11)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 8.66 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C.F
|
||||
Info: routing 0.43 9.09 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z[1] (14,11) -> (14,11)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z_LUT4_D.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 9.32 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z_LUT4_D.F
|
||||
Info: routing 2.36 11.69 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z_LUT4_D_Z[1] (14,11) -> (12,40)
|
||||
Info: Sink u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z_LUT4_D_Z_LUT4_D.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 11.92 Source u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z_LUT4_D_Z_LUT4_D.F
|
||||
Info: routing 2.67 14.60 Net u_sdram_backend.w_hit_idx_c_LUT4_Z_C_LUT4_C_Z_LUT4_D_Z_LUT4_D_Z (12,40) -> (14,7)
|
||||
Info: Sink u_sdram_backend.w_rdata_TRELLIS_FF_Q_51.CE
|
||||
Info: setup 0.00 14.60 Source u_sdram_backend.w_rdata_TRELLIS_FF_Q_51.CE
|
||||
Info: 2.41 ns logic, 12.18 ns routing
|
||||
|
||||
Info: Critical path report for cross-domain path '<async>' -> 'posedge $glbnet$clk':
|
||||
Info: type curr total name
|
||||
Info: source 0.00 0.00 Source sdram_dq[3]$tr_io.O
|
||||
Info: routing 3.24 3.24 Net sdram_dq[3]$TRELLIS_IO_IN (0,38) -> (14,18)
|
||||
Info: Sink u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_DI_LUT4_Z_D_CCU2C_S1_S0_LUT4_D_2_Z_LUT4_D_Z_LUT4_Z_14_D_LUT4_Z.B
|
||||
Info: Defined in:
|
||||
Info: hardware/v2/nms/rtl/sdram_controller.v:80.25-80.33
|
||||
Info: logic 0.24 3.47 Source u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_DI_LUT4_Z_D_CCU2C_S1_S0_LUT4_D_2_Z_LUT4_D_Z_LUT4_Z_14_D_LUT4_Z.F
|
||||
Info: routing 0.70 4.17 Net u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_DI_LUT4_Z_D_CCU2C_S1_S0_LUT4_D_2_Z_LUT4_D_Z_LUT4_Z_14_D[2] (14,18) -> (14,19)
|
||||
Info: Sink u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_DI_LUT4_Z_D_CCU2C_S1_S0_LUT4_D_2_Z_LUT4_D_Z_LUT4_Z_14.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 4.41 Source u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_DI_LUT4_Z_D_CCU2C_S1_S0_LUT4_D_2_Z_LUT4_D_Z_LUT4_Z_14.F
|
||||
Info: routing 0.13 4.53 Net u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_DI_LUT4_Z_D_CCU2C_S1_S0_LUT4_D_2_Z_LUT4_D_Z[51] (14,19) -> (14,19)
|
||||
Info: Sink u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_51.DI
|
||||
Info: setup 0.00 4.53 Source u_sdram_backend.u_sdram_ctrl.rdata_TRELLIS_FF_Q_51.DI
|
||||
Info: 0.47 ns logic, 4.06 ns routing
|
||||
|
||||
Info: Critical path report for cross-domain path 'posedge $glbnet$clk' -> '<async>':
|
||||
Info: type curr total name
|
||||
Info: clk-to-q 0.52 0.52 Source u_spi_bridge.byte_idx_TRELLIS_FF_Q.Q
|
||||
Info: routing 2.25 2.78 Net u_spi_bridge.byte_idx[0] (24,52) -> (25,29)
|
||||
Info: Sink u_spi_bridge.rx_valid_LUT4_C_Z_LUT4_Z_C_LUT4_Z.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 3.01 Source u_spi_bridge.rx_valid_LUT4_C_Z_LUT4_Z_C_LUT4_Z.F
|
||||
Info: routing 0.43 3.44 Net u_spi_bridge.rx_valid_LUT4_C_Z_LUT4_Z_C[0] (25,29) -> (25,29)
|
||||
Info: Sink u_spi_bridge.rx_valid_LUT4_C_Z_LUT4_Z.C
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 3.68 Source u_spi_bridge.rx_valid_LUT4_C_Z_LUT4_Z.F
|
||||
Info: routing 2.89 6.57 Net u_spi_bridge.byte_idx_TRELLIS_FF_Q_DI_LUT4_Z_D[1] (25,29) -> (21,56)
|
||||
Info: Sink spi_miso_LUT4_Z_D_LUT4_Z.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 6.80 Source spi_miso_LUT4_Z_D_LUT4_Z.F
|
||||
Info: routing 0.22 7.02 Net spi_miso_LUT4_Z_B[3] (21,56) -> (21,56)
|
||||
Info: Sink spi_miso_LUT4_Z.D
|
||||
Info: Defined in:
|
||||
Info: /opt/homebrew/bin/../share/yosys/lattice/cells_map_trellis.v:108.23-108.24
|
||||
Info: logic 0.24 7.26 Source spi_miso_LUT4_Z.F
|
||||
Info: routing 2.13 9.39 Net spi_miso$TRELLIS_IO_OUT (21,56) -> (0,62)
|
||||
Info: Sink spi_miso$tr_io.I
|
||||
Info: Defined in:
|
||||
Info: hardware/v2/rtl/spi_host_bridge.v:83.17-83.21
|
||||
Info: 1.47 ns logic, 7.92 ns routing
|
||||
|
||||
Info: Max frequency for clock '$glbnet$clk': 68.51 MHz (PASS at 64.00 MHz)
|
||||
|
||||
Info: Max delay <async> -> posedge $glbnet$clk: 4.53 ns
|
||||
Info: Max delay posedge $glbnet$clk -> <async> : 9.39 ns
|
||||
|
||||
Info: Slack histogram:
|
||||
Info: legend: * represents 35 endpoint(s)
|
||||
Info: + represents [1,35) endpoint(s)
|
||||
Info: [ 1029, 1712) |+
|
||||
Info: [ 1712, 2395) |+
|
||||
Info: [ 2395, 3078) |**+
|
||||
Info: [ 3078, 3761) |****+
|
||||
Info: [ 3761, 4444) |******+
|
||||
Info: [ 4444, 5127) |******+
|
||||
Info: [ 5127, 5810) |*******+
|
||||
Info: [ 5810, 6493) |**********+
|
||||
Info: [ 6493, 7176) |***************+
|
||||
Info: [ 7176, 7859) |*******************+
|
||||
Info: [ 7859, 8542) |***********************************+
|
||||
Info: [ 8542, 9225) |*************************************************+
|
||||
Info: [ 9225, 9908) |**********************************+
|
||||
Info: [ 9908, 10591) |******************************+
|
||||
Info: [ 10591, 11274) |*************************************+
|
||||
Info: [ 11274, 11957) |***************************+
|
||||
Info: [ 11957, 12640) |**********************************************+
|
||||
Info: [ 12640, 13323) |***********************************************************+
|
||||
Info: [ 13323, 14006) |************************************************************
|
||||
Info: [ 14006, 14689) |********************************************************+
|
||||
|
||||
Info: Program finished normally.
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,9 @@
|
||||
seed,fmax_mhz,pass_at_64mhz,slack_ns_at_64mhz
|
||||
1,73.17,PASS,1.958
|
||||
2,68.90,PASS,1.111
|
||||
3,72.10,PASS,1.755
|
||||
4,68.51,PASS,1.029
|
||||
5,69.29,PASS,1.193
|
||||
6,73.03,PASS,1.931
|
||||
7,74.17,PASS,2.143
|
||||
8,70.10,PASS,1.360
|
||||
|
Reference in New Issue
Block a user