🖥️ 第3课:ZCU106 板级实战——怎么在真板子上跑起来

PMUFW/FSBL/JTAG 是什么?A53 怎么跑裸机程序?Tokenizer 怎么通过 UART 收发中英文?6/6 板级回归怎么通过的?

🎯 本课目标

理解 FPGA 板级部署的基本流程、ZCU106 的启动链(PMUFW→FSBL→JTAG→A53)、PS 端裸机运行时的概念。

一、ZCU106 板卡架构

ZCU106 的 PS 和 PL

flowchart TB subgraph PS["PS (Processing System)
ARM Cortex-A53 四核"] A53["🧠 A53 核0
运行裸机程序
无操作系统!"] PMU["🔐 PMU
平台管理单元
上电/复位/电源"] UART["📡 UART0 (COM6)
板级通信端口"] end subgraph PL["PL (Programmable Logic)
FPGA 可编程逻辑"] HLS["⚡ HLS 算子
Attention/MLP/Embedding"] BRAM["💾 BRAM
权重/中间结果"] end PS -->|"AXI总线"| PL JTAG["🔌 JTAG 调试口
(当前不可见!)"] --> PS SD["💿 SD卡
(cold boot)"] --> PS style PS fill:#3987e5,color:#fff style PL fill:#199e70,color:#fff

二、启动链:怎么把程序"喂"进芯片?

ZCU106 的启动序列

sequenceDiagram participant PWR as ⚡ 上电 participant PMU as 🔐 PMU固件
(平台管理) participant FSBL as 📦 FSBL
(第一阶段引导) participant JTAG as 🔌 JTAG
(下载程序) participant A53 as 🧠 A53核 PWR->>PMU: 1. PMU 启动
管理复位和电源 PMU->>FSBL: 2. 加载FSBL
初始化DDR/外设 FSBL->>JTAG: 3. 等JTAG连接
或从SD卡加载 JTAG->>A53: 4. 下载程序到DDR
(Q25TOKRT: 7MB@0x48000000) A53->>A53: 5. 执行裸机程序
tokenizer/模型/HLS A53->>UART: 6. 通过UART收发结果

PMUFW(平台管理固件):芯片上电后最先跑的程序,负责电源管理、复位、时钟。FSBL(第一阶段引导加载器):初始化 DDR 内存、配置外设引脚。JTAG:调试接口,通过 USB 线把编译好的程序下载到 DDR 内存,然后让 A53 跳转执行。

三、Tokenizer —— 怎么把"你好"变成数字?

ByteLevel BPE 编码/解码

flowchart LR INPUT["💬 输入: '你好'"] --> ENCODE["🔢 ByteLevel BPE
编码器查表"] ENCODE --> IDS["Token IDs
如 {16, 108, 234}"] IDS --> UART["📡 UART 发送到Host"] UART --> DECODE["🔤 解码器反查表"] DECODE --> OUTPUT["💬 输出: '你好'"] style ENCODE fill:#3987e5,color:#fff style DECODE fill:#199e70,color:#fff

Qwen2.5 的 tokenizer 需要 4.4 MB 的查表数据(含中英文 merge 规则和 vocab 映射)。PS 端把整个词表打包为一个 Q25TOKRT runtime image(7MB),通过 JTAG 下载到 DDR,A53 裸机程序运行时直接查表。

四、6/6 板级回归——怎么验证的?

6 个测试用例全部通过

flowchart TB T1["✅ 'hello'
英文短词"] --> PASS["🏆 6/6 全通过
Transcript SHA256
已验证"] T2["✅ 'Once upon a time'
英文句子"] --> PASS T3["✅ '你好'
中文短词"] --> PASS T4["✅ '请用一句话介绍ZCU106。'
中英混合长句"] --> PASS T5["✅ 'ZCU106'
英文专有名词"] --> PASS T6["✅ 'token 123 OK?'
字母数字混合"] --> PASS style PASS fill:#0ca30c,color:#fff

每个测试的流程:Host 发 UART 文本 → A53 tokenizer 编码 → 查表验证 token IDs → 解码回来 → UART 返回 → Host 比对结果。6/6 全部通过意味着tokenizer 的编码和解码在真实板卡上完全正确——这是 M2 阶段的重大里程碑。

但这只证明 tokenizer 通路正确——模型的 attention/MLP/HLS runtime 还没跑在板卡上(那是 M1/M3 阶段的目标)。

五、四条主线总览

主线目标状态
M0SmolLM2 host-tokenized smoke✅ tokenizer parity 34/34
M1SmolLM2 full model token-to-token⚠️ attention partial, top-k未闭合
M2PS tokenizer/detokenizer + UART✅ 6/6 板级回归通过
M3Qwen2.5-0.5B 中英 token-to-token⚠️ 24层全量化logits通过, 缺reference