hardware/v1/ was created (dc0b331) as a frozen snapshot of the V1
project that then lived at the repo root (rtl/, sim/, synth/, tools/,
docs/). Root received zero further commits to those files after the
freeze -- confirmed byte-identical to the hardware/v1/ copy for every
file removed here. Root was the "before", hardware/v1/ is the
curated, canonical "after".
Removed (all verified exact-hash duplicates of hardware/v1/ content):
- rtl/ (20 files, 100% covered by hardware/v1/rtl/)
- tools/{netasm,pinout,run_regression.py,flash_catalog,validation,
fpga_benchmark.py} (19 files, 100% covered by hardware/v1/tools/;
tools/neural_sim/ kept -- unique, post-freeze, no counterpart)
- sim/*.v (47 testbenches, 100% covered by hardware/v1/sim/; the
~38 remaining sim/ entries are compiled binaries and .vcd
waveform dumps, left as a separate cleanup decision)
- synth/ecp5/{p2,p4,p8,post_fix_verify} (25 files, exact duplicates
of hardware/v1/synthesis/; the other ~84 synth/ecp5/* experiment
build directories are historical artifacts never carried into the
freeze, left as a separate decision)
- WORKLOG.md (duplicate of hardware/v1/docs/WORKLOG.md)
- docs/{FPGA-Neural-Datapatch-Benchmark,FPGA-Neural-Hardware-Design,
FPGA-NeuralNetwork-Engine}.md, docs/validation/*.md (18 files),
docs/FPGA-Neural-Datasheet-{EN,IT}.pdf -- all exact duplicates of
hardware/v1/docs/ content
- hardware/v1/docs/DatasheetLatex/ (24 files) -- exact duplicate of
hardware/v2/docs/datasheet/files/docs/datasheet/en/ (discovered
during this audit; not the same DatasheetLatex already removed
from hardware/v2/docs/ in an earlier commit)
Moved (genuine, unique, post-freeze V2 content -- not duplicated
anywhere, just living in the wrong/legacy root docs/ location):
- docs/architecture/*.md -> hardware/v2/docs/architecture/
- docs/pinouts.md, docs/FPGA_NEURAL_V2_DATASHEET.md,
docs/FPGA_NEURAL_V2_SCHEMATIC.md,
docs/FPGA-Neural-V2-Datasheet-EN.pdf -> hardware/v2/docs/
Left untouched (separate decisions, not part of this cleanup):
- docs/FPGA-Neural-Flash-Subsystem-Verification.md, docs/
v2-description.md -- orphaned root-only content, no duplicate
found anywhere, but also not part of the reviewed plan
- synth/ecp5/* experiment dirs and sim/*_sim + sim/*.vcd build
artifacts -- not literal duplicates, flagged as candidates for a
future, separate cleanup pass
Verified no functional breakage: grepped all remaining scripts/docs
for references to every removed path -- only prose/comment mentions
found, no executable imports or build-script paths broken.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013xXuuRUWZScuo1DeYJxs3v
187 lines
9.1 KiB
Markdown
187 lines
9.1 KiB
Markdown
# FPGA-Neural V2 — Datasheet
|
|
|
|
**Status: DRAFT / PRE-RELEASE.** This datasheet documents the INTENDED
|
|
V2 board architecture as of STEP20. It does **not** certify a finished,
|
|
release-ready design — see §11 Limitations and
|
|
`hardware/v2/docs/OPEN_ITEMS.md` for the current, real blocker list.
|
|
Do not read any statement here as "physically validated" unless it
|
|
says so explicitly.
|
|
|
|
## 1. General
|
|
|
|
FPGA-Neural V2 is an embedded neural-network accelerator built around a
|
|
Lattice ECP5 FPGA and a single external SDRAM. It executes small,
|
|
dependency-graph-structured INT8 neural networks (dense layers, DAGs)
|
|
using a Neural Multiprocessor of parallel MAC engines, streaming
|
|
weight/activation tiles from one external SDRAM chip that also holds
|
|
results.
|
|
|
|
Architecture stack (top to bottom): SPI host interface → job
|
|
registration → Dependency Manager / Neural Director → N parallel
|
|
Neural Processors → Memory Manager / streaming tile delivery → Unified
|
|
SDRAM Backend → one physical SDRAM.
|
|
|
|
## 2. FPGA
|
|
|
|
| Item | Value | Basis |
|
|
|---|---|---|
|
|
| Part | Lattice LFE5U-45F | DESIGN DECISION |
|
|
| Package | CABGA381 | DESIGN DECISION |
|
|
| Speed grade | -8 | DESIGN DECISION |
|
|
| Ordering part number | LFE5U-45F-8BG381C | DESIGN DECISION (standard Lattice ordering suffix for this grade/package; not independently cross-checked against a live distributor listing this session) |
|
|
| Logic (post-synthesis, N=4, frozen STEP19 compute core) | TRELLIS_FF=6425, TRELLIS_COMB=6023, MULT18X18D=32, DP16KD=0 | VERIFIED (real Yosys synthesis, STEP19) |
|
|
| I/O used (frozen STEP19 top, no physical host bus) | 149/245 TRELLIS_IO | VERIFIED (real nextpnr-ecp5 P&R, STEP19) |
|
|
| I/O used (this step's new board-level top, SPI + osc + reset + SDRAM) | not yet synthesized this round | OPEN — see §11 |
|
|
|
|
Operating assumption: single clock domain, no CDC beyond the SPI
|
|
bridge's own double-flop synchronizers and the reset synchronizer
|
|
(§5).
|
|
|
|
## 3. Neural accelerator
|
|
|
|
| Parameter | Value |
|
|
|---|---|
|
|
| N_PROCESSORS | 4 (frozen reference; N=2 also validated; N=8 is a future evolution) |
|
|
| P_IN (MAC width) | 8 |
|
|
| Data representation | INT8 operands |
|
|
| Accumulator | INT32, ReLU + INT8 saturate on output |
|
|
| MAC architecture | 8-wide parallel MAC, balanced adder tree (`neural_processor.v`, unchanged since before this freeze) |
|
|
| Processor parallelism | N independent Neural Processors, one dependency-graph node in flight per processor |
|
|
| Supported memory traffic | weights (read-only, 64-bit packed fetch, cached), activations (read, byte-maskable), results (write, byte-maskable) — all through the SAME single SDRAM |
|
|
|
|
**RTL capability vs. software/API capability:** the RTL executes one
|
|
pre-compiled dependency graph (nodes with producer/consumer edges,
|
|
fixed tile counts) registered via 108 bits of per-job configuration
|
|
(node id, dependency list, activation/weight/result base addresses,
|
|
tile count). There is no on-chip graph compiler, no floating point, no
|
|
training — job graphs and addresses are computed off-chip and loaded
|
|
via the host interface (§9).
|
|
|
|
## 4. Unified memory
|
|
|
|
```
|
|
┌─────────────────────┐
|
|
│ FPGA ECP5 │
|
|
│ │
|
|
│ 4x Neural Engines │
|
|
│ │ │
|
|
│ v │
|
|
│ Unified SDRAM │
|
|
│ Backend / Arbiter │
|
|
└─────────┬───────────┘
|
|
│ 16-bit SDRAM bus
|
|
v
|
|
┌─────────────────────┐
|
|
│ AS4C4M16SA-6TIN │
|
|
│ Weights │
|
|
│ Activations │
|
|
│ Results │
|
|
└─────────────────────┘
|
|
```
|
|
|
|
| Item | Value | Basis |
|
|
|---|---|---|
|
|
| Device | Alliance Memory AS4C4M16SA-6TIN | DESIGN DECISION (STEP16-19) |
|
|
| Capacity | 4M x 16 (8MB) | DATASHEET VALUE |
|
|
| Data width | 16-bit (DQ[15:0]) + DQM[1:0] byte mask | DATASHEET VALUE |
|
|
| Addressing | BA[1:0] (4 banks) + A[11:0] (row/col, multiplexed) | DATASHEET VALUE |
|
|
| Clock | shared with FPGA system clock (§5) | DESIGN DECISION |
|
|
| Initialization/refresh | real, RTL-implemented power-up wait + mode-register-set + periodic AUTO REFRESH (`sdram_controller.v`) | VERIFIED (real refresh events observed in simulation, STEP16-19) |
|
|
| Arbitration | single physical port, 2-way logical split: W (weight, read-only, cached) / AR (activation+result, read/write, byte-maskable), each internally arbitrated across N processors by a generic, reused `slot_mem_arbiter` | VERIFIED (STEP19 bit-exact regression, reconfirmed via Verilator this step — see errors.log ERR-0024) |
|
|
| Official V2 memory map | weights @0x010000, activations @0x200000, results @0x300000, all within the single 8MB space, 1MB-aligned | DESIGN DECISION |
|
|
|
|
PSRAM is **not** part of V2. The V1 PSRAM controller (`hardware/v1/rtl/psram_controller.v`) is not instantiated anywhere in the V2 physical path.
|
|
|
|
## 5. Clock / PLL
|
|
|
|
```
|
|
16 MHz OSCILLATOR
|
|
|
|
|
v
|
|
ECP5 PLL (EHXPLLL)
|
|
CLKI_DIV=1 CLKFB_DIV=4 CLKOP_DIV=9
|
|
FEEDBK_PATH=CLKOP VCO=576MHz
|
|
|
|
|
v
|
|
FPGA SYSTEM CLOCK
|
|
64 MHz
|
|
(real, tool-generated ratio: 16 * 4 / 1, CLKOP_DIV=9 -> 576/9=64)
|
|
```
|
|
|
|
| Item | Value | Basis |
|
|
|---|---|---|
|
|
| Oscillator | 16 MHz (board-level, prior project record) | DESIGN DECISION (part number: TBD — not selected this session) |
|
|
| PLL primitive | EHXPLLL (`ecp5_pll_sys_clk.v`) | VERIFIED design-time via Project Trellis `ecppll` v1.4 (real tool, real parameters) |
|
|
| Generated system clock | 64 MHz | DESIGN DECISION, chosen over 80MHz because STEP19's own multi-seed P&R data showed only 1/8 seeds closing timing at >=80MHz on the compute-only core, and the new board-level top adds more logic still; 64MHz is not yet itself confirmed by P&R on the NEW top (see §11) |
|
|
| PLL lock | `locked` output, feeds `reset_sync.v` | DESIGN DECISION; NOT simulatable (Lattice EHXPLLL has no open sim model) — real lock behavior is a real-hardware-only characterization, see §10 |
|
|
| Timing constraints | none yet written for the new board-level top | OPEN — see §11 |
|
|
|
|
## 6. Interfaces
|
|
|
|
### SPI host interface (`spi_host_bridge.v`)
|
|
Mode 0 (CPOL=0/CPHA=0), MSB-first, one opcode per CS-low period.
|
|
Opcodes: `0x10` WRITE_JOB (job registration, 15-byte payload), `0x01`
|
|
WRITE_MEM / `0x02` READ_MEM (raw, word-addressed SDRAM access via a
|
|
second arbitrated port), `0x20` STATUS, `0x0F` RESET. Verified in
|
|
isolation (18/18, `tb_spi_host_bridge.v`). **Not yet verified
|
|
end-to-end under realistic multi-job pacing** — see §11/ERR-0025.
|
|
The 110-pin `reg_*` bus used by V2's own internal simulation
|
|
testbenches is a testbench-only convenience and is **not** the
|
|
physical interface.
|
|
|
|
### JTAG
|
|
Standard ECP5 JTAG (TDI/TDO/TCK/TMS), always available regardless of
|
|
configuration boot mode, per Lattice's own standard requirement.
|
|
|
|
### Configuration
|
|
Standard ECP5 PROGRAMN/INITN/DONE/CCLK. Boot-mode/flash-part decision:
|
|
OPEN (see §11).
|
|
|
|
## 7. Electrical
|
|
|
|
Rail voltage requirements are DATASHEET VALUEs (from real device
|
|
datasheets); no regulator part numbers, current budget, or decoupling
|
|
values are finalized this round. Full detail:
|
|
`hardware/v2/docs/POWER_ARCHITECTURE.md`.
|
|
|
|
## 8. Pinout
|
|
|
|
Full table: `hardware/v2/docs/PINOUT.md`. Summary: 37 real SDRAM
|
|
signals + clk/rst are ball-assigned and P&R-verified (STEP19, against
|
|
the STEP19 compute-only top). The board-level top added this step
|
|
(SPI + oscillator + reset pins) has **not** had its own ball
|
|
assignment or P&R run yet.
|
|
|
|
## 9. Mechanical / board assumptions
|
|
|
|
None assumed beyond the package footprint implied by CABGA381. No PCB
|
|
dimensions, connector placement, or stack-up are specified — that is
|
|
schematic/PCB-capture work, not yet started (see
|
|
`hardware/v2/docs/SCHEMATIC_READINESS.md`).
|
|
|
|
## 10. Programming / first power-on
|
|
|
|
JTAG programming is standard. A first-power-on procedure exists at
|
|
`hardware/v2/docs/FIRST_POWER_ON.md` (procedure only — not executed
|
|
against real hardware, since no board has been fabricated).
|
|
|
|
## 11. Limitations (real, current, as of this datasheet's own writing)
|
|
|
|
- **The physical SPI host interface is NOT proven end-to-end
|
|
correct.** A real, disclosed defect (errors.log ERR-0025 Part B)
|
|
produces wrong results when two jobs are dispatched with realistic
|
|
SPI pacing, even though registration itself is confirmed correct.
|
|
This is the single largest open item.
|
|
- The board-level top (`fpga_neural_v2_top.v`) has not been through
|
|
synthesis or P&R this round — deliberately, since running the real
|
|
toolchain against RTL known to compute wrong answers would not be a
|
|
meaningful result.
|
|
- No PCB, schematic capture, or fabricated hardware exists. Nothing in
|
|
this document should be read as "physically validated."
|
|
- Regulator, configuration-flash, and connector part numbers are not
|
|
selected.
|
|
- The STEP19 compute+memory core (raw `reg_*` interface, no SPI
|
|
bridge) IS bit-exact verified (N=2 and N=4, 256/256, reconfirmed via
|
|
Verilator this session) and remains the actual, working reference
|
|
design underneath this datasheet's own described board architecture.
|