07. FPGA / Zynq 개요
cpu_ref / npu_sim에서 검증된 그래프를 실제 FPGA silicon으로 옮기는
일반 흐름을 다룹니다. 이 페이지에서 정한 패턴이 08. kws_silicon에서
구체적으로 실행됩니다.
왜 FPGA / Zynq 인가
GPU/CPU 대비 FPGA의 의미:
- 결정적 latency — 분기/캐시 미스 거의 없음, real-time/safety-critical 적합
- 저전력 — 같은 throughput에서 GPU 대비 1/10 W 가능
- online 재구성 — operator 단위로 가속기 재합성 가능
- 소형 칩 진입 — 소형 보드(XC7Z020, Zynq-7000 계열)에서 의미 있는 가속
eulernpu의 1차 타깃 보드는 QMTECH XC7Z020 CLG484-1 (Zynq-7000):
| 자원 | 값 | 의미 |
|---|---|---|
| LUT | 53 K | 작은 IP는 여유 |
| DSP slices | 220 | float MAC unit 50개 정도 가능 |
| BRAM 36k | 280 (~140 KB usable) | 작은 모델 가중치는 온칩 캐싱 가능 |
| DDR3 | 512 MB | 큰 가중치는 DDR streaming 필요 |
| ARM Cortex-A9 | 666 MHz × 2 (PS) | embedding/sample 등 PL 외 작업 |
| EMIO UART | MIO 48/49 | bare-metal printf 채널 |
| PL Fmax | ~90–115 MHz 실측 | float MAC 배치 기준 |
Zynq 아키텍처 한 컷
┌─────────────────────────────────────────┐
│ PS (Processing System) │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ ARM A9 #0 │ │ ARM A9 #1 │ │
│ │ 666 MHz │ │ 666 MHz │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ L1 32K + L2 512K │
│ │ DDR3 controller │
└─────────┼─────────────────────────────────┘
│ GP0 (32-bit AXI, control)
│ HP0–3 (64-bit AXI, data)
│ EMIO (GPIO/UART routing)
┌─────────┼─────────────────────────────────┐
│ PL (Programmable Logic) │
│ ┌──────▼───────────────────────────┐ │
│ │ NPU IP │ │
│ │ s_axilite (control reg) │ │
│ │ m_axi (data via HP slave) │ │
│ └───────────────────────────────────┘ │
└─────────────────────────────────────────┘
- GP0 (General Purpose) — 32-bit AXI-Lite, IP control register
- HP0 (High Performance) — 64-bit AXI-Full, IP가 DDR 읽고/쓰기
- EMIO — PL 핀을 PS UART로 라우팅 (printf 출력 채널)
표준 흐름 — 7 단계
1. Train + INT8 quantize → weights.npz / weights.h
2. Host CPU smoke → 같은 C 코드로 host gcc 컴파일, 정확도 확인
3. HLS C-synth → C++ → RTL IP, Fmax / DSP / BRAM 보고서
4. Vivado BD + impl → IP + PS + AXI 연결 → bitstream
5. Vitis platform + ELF → SDT 플랫폼 + BSP + bare-metal C ELF
6. xsdb silicon run → JTAG 비트스트림 load + ELF download + UART 캡처
7. 측정 + 회귀 → cycle count / 정확도 / 재현성 자동 검증
이 7 단계 모두 자동화 가능한 스크립트로 짜는 게 핵심입니다 — silicon 재현성을 매번 cliff edge에서 다투지 않으려면.
PL offload 후보 (Spec → Hardware)
어떤 op가 PL fabric에 올릴 가치가 있나?
- Compute-heavy + regular: linear, matmul, batched_matmul
- Conv family: conv2d, conv1d, depthwise_conv2d, patch_embed
- Attention family: attention_core, flash_attention, cross_attention, multi_query_attention
- SSM: selective_scan (Mamba)
PL에 올리지 않는 게 좋은 것:
- 작은 control flow (
argmax,sample) — ARM에서 마이크로초 - KV cache 관리 — 변하는 길이라 ARM 적합
- LayerNorm, GELU — 작아서 IP overhead 가 더 큼 (P08 측정으로 확인)
[18. PL offload analysis (deprecated)] 는 더 이상 별도 페이지가 아니지만,
같은 분석은 eulernpu profile --roofline 로 자동입니다.
보드 셋업 체크리스트
XC7Z020 보드를 처음 받았다면:
- 전원 + USB-JTAG 연결 (QMTECH는 USB-C 한 개로 둘 다)
/dev/ttyUSBn확인 — 보통 ttyUSB0/1 두 개 (JTAG + UART)- Vivado 2025.1 + Vitis 2025.1 설치
- USB Blaster cable driver —
lsusb로 Xilinx 인식 확인 - 115200-8N1 UART 터미널 —
picocom,tio,pyserial등
자세한 보드 셋업은 P05 sanity check가 가장 짧습니다: the FPGA sanity-check demo tutorial (shipped with the internal bring-up repo). 이 데모가 통과하면 P06 로 갈 수 있습니다.
보드별 자원 한계 (capability matrix)
eulernpu profile --all-boards /tmp/sim.profile.json
같은 그래프가 보드별로 fit 되는지 한 표로:
| 보드 | LUT | DSP | BRAM 36k | DDR | 비고 |
|---|---|---|---|---|---|
| XC7Z020 | 53 K | 220 | 280 | DDR3 512 MB | P06/07/08 silicon 검증 보드 |
| XC7Z045 | 218 K | 900 | 545 | DDR3 1 GB | 중급 |
| XCZU7EV | 230 K | 1728 | 312 | DDR4 4 GB | ZU+ 진입 |
| XCZU9EG | 274 K | 2520 | 912 | DDR4 4 GB | 큰 모델 |
| XCK26 | (Kria) | 1248 | varies | 4 GB | 모듈형 |
다음 단계
실제 P06 KWS 데모로 silicon에 올리는 전체 흐름 → 08. kws_silicon.