ARM A53 处理系统把浮点激活量化为 int8,并得到激活 scale。
M1i W8A8 系统架构唯一框架
> 阅读导图:本文讲的是 `SmolLM2-135M-Instruct Q25RT W8A8` 在 ZCU106 上的系统架构,不是本 Wiki 中 `Qwen2.5-0.5B-Instruct` 的实现报告。两者可以共用“Transformer、量化、ARM/FPGA 协同”等基础概念,但模型、权重、运行时和验收结论必须分别理解。
阅读导图:本文讲的是
SmolLM2-135M-Instruct Q25RT W8A8在 ZCU106 上的系统架构,不是本 Wiki 中Qwen2.5-0.5B-Instruct的实现报告。两者可以共用“Transformer、量化、ARM/FPGA 协同”等基础概念,但模型、权重、运行时和验收结论必须分别理解。
flowchart TD A[阅读本文时先区分三条路线] --> B[当前主线<br/>ARM A53 production runtime] A --> C[冻结路径<br/>FPGA 功能回归] A --> D[历史研究<br/>mixed-GGUF 多模块 HLS] B --> B1[13 个系统模块均在 ARM A53] C --> C1[仅 SM-05 的 int8 点积进入 FPGA] D --> D1[只作历史实验依据<br/>不能计入当前完成度]
上图不是新增的实现设计,而是帮助本科生建立“不要混着数完成度”的阅读框架:主线回答产品运行时是否完成;冻结路径回答一个 FPGA 计算 IP 的功能是否通过;历史研究只说明过去做过哪些局部实验。
1. 文档范围
本文件是 SmolLM2-135M-Instruct Q25RT W8A8 在 ZCU106 上的唯一系统模块框架。
本文件不描述 Qwen2.5-0.5B-Instruct M3 实现。Qwen2.5 M3 尚未进入当前 ARM A53 加 FPGA 可编程逻辑运行时。
后续状态说明只使用本文件定义的 13 个固定系统模块名称。HLS 工程目录、HLS 配置参数和历史任务编号不是系统模块名称。
2. 三条不能混合统计的执行与研究路线
2.1 当前主线:ARM A53 处理系统 production runtime
当前主线由 ARM A53 处理系统执行全部 13 个固定系统模块。SM-05 W8A8 线性投影模块在当前主线中也由 ARM A53 处理系统执行,不调用 FPGA 可编程逻辑。
当前主线的正式范围固定为 64 个词元、单请求、每个请求前后重置、F32 Key/Value cache 和贪心生成。当前主线先完成真实 ARM A53 处理系统合同和被选定 exact artifact 的物理 SD 冷启动。
2.2 冻结的 FPGA 功能回归路径
冻结的 FPGA 功能回归路径使用:
- ARM A53 处理系统执行控制流、浮点运算、注意力、缓存和词元处理。
- FPGA 可编程逻辑只执行 SM-05 W8A8 线性投影模块中的
int8 x int8 -> int32点积。 - FPGA 可编程逻辑只有一个可复用计算 IP。全部权重矩阵按顺序调用同一个计算 IP,不是同时实例化 211 个计算 IP。
该路径已经完成功能回归,但真实端到端时间慢于当前主线。因此该路径不再扩展 FPGA 覆盖,不作为 production runtime 主线,只保留 rows256 和 rows1536 两套可回归产物以及待完成的 rows1536 物理 SD 冷启动证据。
2.3 历史 mixed-GGUF 多模块 HLS 研究架构
历史 mixed-GGUF 多模块 HLS 研究架构直接处理 Q5_0、Q5_K、Q8_0、浮点注意力等原始 GGUF 语义。
历史 mixed-GGUF 多模块 HLS 研究架构中的注意力、完整 MLP、词表输出等工程是替代实现实验。历史 mixed-GGUF 多模块 HLS 研究架构不是当前主线或冻结的 FPGA 功能回归路径的后续串联模块,也不能与这两个执行路径计算统一完成率。
3. 固定系统模块
| 编号 | 固定系统模块名称 | 输入和输出 | 当前执行位置 |
|---|---|---|---|
| SM-01 | 运行时资产加载与校验模块 | 从 SD/FatFs 读取模型和 tokenizer,校验大小与 SHA256 | ARM A53 处理系统 |
| SM-02 | 文本编码与解码模块 | UTF-8 文本与词元编号互相转换 | ARM A53 处理系统 |
| SM-03 | 词元嵌入模块 | 词元编号转换为 576 维浮点隐藏向量 | ARM A53 处理系统 |
| SM-04 | 均方根归一化模块 | 浮点隐藏向量执行 RMSNorm | ARM A53 处理系统 |
| SM-05 | W8A8 线性投影模块 | 浮点输入和 W8A8 权重转换为浮点投影输出 | 当前主线由 ARM A53 处理系统执行;冻结的 FPGA 功能回归路径由 ARM A53 处理系统与 FPGA 可编程逻辑共同执行 |
| SM-06 | 旋转位置编码模块 | Query 和 Key 向量执行 RoPE | ARM A53 处理系统 |
| SM-07 | 键值缓存模块 | 保存和读取各层 Key、Value 浮点缓存 | ARM A53 处理系统 |
| SM-08 | 注意力概率模块 | Query-Key 点积、缩放、因果掩码、softmax | ARM A53 处理系统 |
| SM-09 | 注意力值聚合模块 | 注意力概率乘 Value,生成 attention context | ARM A53 处理系统 |
| SM-10 | 残差加法模块 | 投影输出与原隐藏向量相加 | ARM A53 处理系统 |
| SM-11 | SiLU 门控激活模块 | SiLU(gate) * up | ARM A53 处理系统 |
| SM-12 | 词元排序与贪心选择模块 | 线性投影结果缩放、top-k、选择最大词元 | ARM A53 处理系统 |
| SM-13 | 运行时控制与串口协议模块 | 调度 30 层、prefill/decode、命令和 UART 输出 | ARM A53 处理系统 |
下面这张模块框图把 13 个编号模块压缩成四个容易记忆的阶段。它不替代上面的正式表格;正式表格给出模块名、接口和执行位置,图只帮助你看清数据怎样从一句文本走到下一个词元。
flowchart LR
U[用户文本] --> M2[SM-02<br/>编码]
M2 --> M3[SM-03<br/>词元嵌入]
M3 --> Layer[30 层 Transformer]
Layer --> N[SM-04<br/>最终 RMSNorm]
N --> H[SM-05<br/>lm_head 投影]
H --> K[SM-12<br/>top-k / 贪心选择]
K --> M2D[SM-02<br/>解码为文本]
C[SM-13<br/>运行时调度、UART、prefill/decode] -. 调度整个过程 .-> M2
subgraph LayerDetail[每一层的固定组合]
R1[SM-04 RMSNorm] --> P1[SM-05 Q/K/V 投影]
P1 --> RP[SM-06 RoPE]
RP --> KV[SM-07 KV cache]
KV --> A1[SM-08 注意力概率]
A1 --> A2[SM-09 Value 聚合]
A2 --> P2[SM-05 输出投影]
P2 --> RES1[SM-10 残差]
RES1 --> R2[SM-04 RMSNorm]
R2 --> P3[SM-05 Gate / Up]
P3 --> ACT[SM-11 SiLU 门控]
ACT --> P4[SM-05 Down]
P4 --> RES2[SM-10 残差]
end4. 一次完整推理的固定执行顺序
SM-13 运行时控制与串口协议模块
-> SM-01 运行时资产加载与校验模块
-> SM-02 文本编码与解码模块
-> SM-03 词元嵌入模块
-> 重复 30 个 transformer 层:
SM-04 均方根归一化模块
SM-05 W8A8 线性投影模块:Query、Key、Value 三次调用
SM-06 旋转位置编码模块
SM-07 键值缓存模块
SM-08 注意力概率模块
SM-09 注意力值聚合模块
SM-05 W8A8 线性投影模块:Attention Output 一次调用
SM-10 残差加法模块
SM-04 均方根归一化模块
SM-05 W8A8 线性投影模块:MLP Gate、MLP Up 两次调用
SM-11 SiLU 门控激活模块
SM-05 W8A8 线性投影模块:MLP Down 一次调用
SM-10 残差加法模块
-> SM-04 均方根归一化模块:最终隐藏向量
-> SM-05 W8A8 线性投影模块:词表输出一次调用
-> SM-12 词元排序与贪心选择模块
-> SM-02 文本编码与解码模块
5. 冻结的 FPGA 功能回归路径中 SM-05 W8A8 线性投影模块的 ARM/FPGA 边界
SM-05 W8A8 线性投影模块不是纯 FPGA 模块。SM-05 W8A8 线性投影模块分为三个步骤:
FPGA 可编程逻辑计算 int8 weight x int8 activation 的 int32 点积。
ARM A53 处理系统计算 float_output = int32_dot activation_scale weight_scale[row]。
FPGA 可编程逻辑中的代码实体名称是 q25rt_i8_matvec_tile。q25rt_i8_matvec_tile 只是 SM-05 W8A8 线性投影模块第 2 步的代码实体,不是另一个系统模块。
为了把“FPGA 做了什么”说得准确,可以把一次 SM-05 调用看成下面三段流水线。只有中间的整数点积是冻结 FPGA 回归路径中的可编程逻辑工作;量化、反量化、尺度处理和所有其他系统模块仍由 ARM A53 完成。
sequenceDiagram participant A as ARM A53 participant P as FPGA: q25rt_i8_matvec_tile participant D as DDR 权重与激活 A->>D: 读取浮点激活、W8A8 权重和 scale A->>A: 激活量化为 int8 A->>P: AXI 发送 int8 activation 与权重块 P->>P: int8 × int8 累加为 int32 dot P-->>A: 返回 int32 dot A->>A: int32 dot × activation_scale × weight_scale[row] A-->>A: 得到 float_output,继续后续模块
6. 211 个 tensor index 的固定映射
211 个 tensor index 表示 211 组不同权重,不表示 211 个硬件模块。
| tensor index | SM-05 W8A8 线性投影模块的调用角色 |
|---|---|
0 | 词表输出投影;权重与词元嵌入权重共享,形状为 49152 x 576 |
1 + 7 * layer + 0 | 第 layer 层 Query 投影 |
1 + 7 * layer + 1 | 第 layer 层 Key 投影 |
1 + 7 * layer + 2 | 第 layer 层 Value 投影 |
1 + 7 * layer + 3 | 第 layer 层 Attention Output 投影 |
1 + 7 * layer + 4 | 第 layer 层 MLP Gate 投影 |
1 + 7 * layer + 5 | 第 layer 层 MLP Up 投影 |
1 + 7 * layer + 6 | 第 layer 层 MLP Down 投影 |
layer 的取值为 0..29。因此 30 层乘以每层 7 组权重,再加 1 组词表输出权重,总数为 30 * 7 + 1 = 211。
7. LANES16 rows1536 的固定含义
LANES16 rows1536 不是系统模块名称。LANES16 rows1536 是 SM-05 W8A8 线性投影模块中 FPGA 点积代码实体的编译配置:
LANES16表示每个流水循环并行处理 16 对 int8 乘法。rows1536表示一次调用最多计算 1536 个输出行。LANES16不表示 16 个 transformer 层或 16 个注意力头。rows1536不表示 1536 个 transformer 层。
rows256 LANES8、rows1536 LANES8 和 rows1536 LANES16 都是 SM-05 W8A8 线性投影模块的不同硬件配置,不是三个系统模块。
8. 用户关心的历史名称如何映射到固定系统模块
8.1 Attention score/softmax/value-mix
- Attention score、缩放、因果掩码和 softmax 属于 SM-08 注意力概率模块。
- value-mix 属于 SM-09 注意力值聚合模块。
- 当前主线和冻结的 FPGA 功能回归路径都在 ARM A53 处理系统执行 SM-08 注意力概率模块和 SM-09 注意力值聚合模块。
- 历史 HLS 工程只验证了 SM-08 注意力概率模块和 SM-09 注意力值聚合模块的局部、代表性或 host 调度子门禁,没有形成冻结的 FPGA 功能回归路径可部署的统一 IP。
8.2 Attention output projection/residual
Attention Output 投影加 residual 不是独立系统模块。Attention Output 投影加 residual 是以下两个固定系统模块的组合:
SM-05 W8A8 线性投影模块执行 Attention Output 投影。
SM-10 残差加法模块执行加法。
当前主线在 ARM A53 处理系统执行 SM-05 W8A8 线性投影模块和 SM-10 残差加法模块。冻结的 FPGA 功能回归路径已经通过 SM-05 W8A8 线性投影模块的 FPGA 点积执行 Attention Output 投影,并在 ARM A53 处理系统执行 SM-10 残差加法模块。
历史 m1i_attention_output_projection_residual HLS 工程使用 mixed-GGUF Q5_0 权重。历史 HLS 工程的 576 行 CSim、csynth、C/RTL cosim 已通过,但历史 HLS 工程没有进入当前 W8A8 Vivado 工程,也没有板级运行。历史 HLS 工程是 SM-05 W8A8 线性投影模块和 SM-10 残差加法模块的替代组合实验,不是当前可部署硬件设计。
8.3 完整 MLP
完整 MLP 不是独立系统模块。完整 MLP 是以下固定系统模块的组合:
SM-04 均方根归一化模块。
SM-05 W8A8 线性投影模块执行 MLP Gate 投影。
SM-05 W8A8 线性投影模块执行 MLP Up 投影。
SM-11 SiLU 门控激活模块。
SM-05 W8A8 线性投影模块执行 MLP Down 投影。
SM-10 残差加法模块。
当前主线在 ARM A53 处理系统执行完整 MLP 的全部固定系统模块。冻结的 FPGA 功能回归路径在 FPGA 可编程逻辑执行三次 SM-05 W8A8 线性投影模块的 int8 点积步骤,在 ARM A53 处理系统执行 SM-04 均方根归一化模块、SM-11 SiLU 门控激活模块和 SM-10 残差加法模块。
历史 smollm2_mlp_full_layer HLS 工程使用 Q5_0 Gate/Up 权重和 Q5_K Down 权重。历史 HLS 工程的 CSim、csynth 通过,正式 m_axi C/RTL cosim 没有通过。历史 HLS 工程不是当前 W8A8 硬件设计。
8.4 Final norm/lmhead/top-k
Final norm、lm_head 和 top-k 不是独立系统模块。最终阶段是以下固定系统模块的组合:
SM-04 均方根归一化模块执行最终 RMSNorm。
SM-05 W8A8 线性投影模块使用 tensor index 0 执行 49152 x 576 词表输出投影。
SM-12 词元排序与贪心选择模块执行缩放、top-k 和最大词元选择。
当前主线在 ARM A53 处理系统执行最终阶段的全部固定系统模块。冻结的 FPGA 功能回归路径在 FPGA 可编程逻辑执行词表输出投影的 int8 点积步骤,在 ARM A53 处理系统执行最终 RMSNorm、浮点缩放和 top-k。
历史 smollm2_lm_head_streaming_topk HLS 工程直接处理原始 GGUF Q8_0 权重。历史 HLS 工程不是当前 W8A8 词表输出实现。历史 HLS 工程具有全 49152 行 HLS CSim 和 csynth 证据,但原始时序估算为 25.733 ns,目标为 5 ns,C/RTL cosim、Vivado 和板级运行没有闭环。
9. HLS 与 RTL 的固定术语
HLS 表示 High-Level Synthesis,高层次综合。
本项目用 C/C++ 编写 HLS 源码。Vitis HLS 把 C/C++ HLS 源码生成 RTL。项目报告中的“C/RTL cosim 通过”表示 HLS 生成的 RTL 与 C/C++ 参考模型共同仿真通过,不表示项目手工编写了 Verilog RTL。
HLS 与 RTL 不是最终产物层面的二选一:HLS 的输出也是 RTL。
HLS 的主要优点是开发速度、接口复用和数值参考模型一致性。手工 RTL 的主要优点是能更精细地控制 streaming、片上缓存、定点近似和周期级调度。HLS 不会自动产生更高性能的硬件;性能取决于内存访问、数据复用、流水间隔、并行度和数值格式。
对于 SM-08 注意力概率模块和 SM-09 注意力值聚合模块,优先使用 HLS 固定数值语义和接口。只有在完整 HLS IP、Vivado 实现和板级 profile 证明具体瓶颈后,才考虑把稳定的热点改为手工 RTL。
10. 当前完成状态
10.1 三种完成度必须使用不同分母
不能用一个“已完成模块数”同时回答系统功能、FPGA 设计和正式验收,因为三者的设计范围不同。
| 统计问题 | 正确分母 | 当前分子 | 准确结论 |
|---|---|---|---|
| 完整推理需要多少个固定系统模块 | 13 | 13 个已有首通功能实现 | 13 个固定系统模块已经共同完成真实模型的固定四词元首通;这不等于 production runtime 正式验收完成 |
| 当前主线计划部署多少种 FPGA 计算 IP | 0 | 0 | 当前主线由 ARM A53 处理系统执行全部 13 个固定系统模块 |
| 冻结的 FPGA 功能回归路径计划部署多少种 FPGA 计算 IP | 1 | 1 个已完成功能部署 | FPGA 范围只有 SM-05 W8A8 线性投影模块的整数点积步骤;一个可复用计算 IP 按顺序处理 211 组权重 |
| 冻结的 FPGA 计算 IP 有多少完成功能门禁 | 1 | 1 | SM-05 W8A8 线性投影模块已通过 HLS CSim、HLS csynth、HLS C/RTL cosim、Vivado 实现和真实 ZCU106 JTAG 功能运行 |
| 冻结的 FPGA 计算 IP 有多少完成 rows1536 物理 SD 冷启动门禁 | 1 | 0 | LANES16 rows1536 的物理断电、上电、无 JTAG 下载冷启动仍待执行 |
| 冻结的 FPGA 计算 IP 有多少完成端到端加速目标 | 1 | 0 | SM-05 W8A8 线性投影模块的 FPGA 路径慢于纯 ARM A53 处理系统,不能声明加速 |
SM-01 运行时资产加载与校验模块、SM-02 文本编码与解码模块、SM-03 词元嵌入模块、SM-04 均方根归一化模块、SM-06 旋转位置编码模块、SM-07 键值缓存模块、SM-08 注意力概率模块、SM-09 注意力值聚合模块、SM-10 残差加法模块、SM-11 SiLU 门控激活模块、SM-12 词元排序与贪心选择模块和 SM-13 运行时控制与串口协议模块的设计位置就是 ARM A53 处理系统。它们没有 FPGA IP 不是“漏做了 12 个硬件模块”,而是冻结的 FPGA 功能回归路径的明确软硬件分工。
如果以后决定把其中某个固定系统模块移入 FPGA 可编程逻辑,必须为该模块单独建立 HLS CSim、HLS csynth、HLS C/RTL cosim、Vivado 实现、真实板级运行和性能目标六层证据。在作出该决定前,不能把历史 HLS 实验计入冻结的 FPGA 功能回归路径设计分母。
| 固定系统模块 | 当前功能状态 | FPGA 硬件状态 |
|---|---|---|
| SM-01 运行时资产加载与校验模块 | 模型和 tokenizer 的 FatFs 加载、大小和 SHA256 校验已运行 | ARM A53 处理系统实现 |
| SM-02 文本编码与解码模块 | 固定验收文本的编码、解码和 stream 输出已运行 | ARM A53 处理系统实现 |
| SM-03 词元嵌入模块 | 真实模型词元嵌入已运行 | ARM A53 处理系统实现;历史 HLS 子门禁不是当前实现 |
| SM-04 均方根归一化模块 | 30 层和最终归一化已运行 | ARM A53 处理系统实现;历史 HLS 子门禁不是当前实现 |
| SM-05 W8A8 线性投影模块 | tensor index 0..210 全部执行,结果与 ARM 参考一致 | 当前唯一完成 Vivado 和真实板级功能验证的 FPGA 计算模块;加速结论失败 |
| SM-06 旋转位置编码模块 | 30 层 Query/Key 已运行 | ARM A53 处理系统实现 |
| SM-07 键值缓存模块 | 64-token、单请求、F32 Key/Value cache 已运行 | ARM A53 处理系统实现 |
| SM-08 注意力概率模块 | 30 层 causal attention 已运行 | ARM A53 处理系统实现;历史 HLS 只有子门禁 |
| SM-09 注意力值聚合模块 | 30 层 context 已运行 | ARM A53 处理系统实现;历史 HLS 只有子门禁 |
| SM-10 残差加法模块 | Attention 和 MLP 残差已运行 | ARM A53 处理系统实现;历史 Q5_0 HLS 组合实验未部署 |
| SM-11 SiLU 门控激活模块 | 30 层 MLP 激活已运行 | ARM A53 处理系统实现;历史 mixed-GGUF MLP HLS 未闭环 |
| SM-12 词元排序与贪心选择模块 | top-k 和四词元贪心生成已运行 | ARM A53 处理系统实现;历史 Q8_0 HLS 实验未闭环 |
| SM-13 运行时控制与串口协议模块 | 30 层、prefill、decode、cached/stream 命令已运行 | ARM A53 处理系统实现;production runtime 尚未完成 |
下面的证据阶梯解释“功能完成”和“加速完成”为什么是两回事。前五级一起证明硬件 IP 可以被综合、实现并在真实板卡上正确协同运行;第六级才比较端到端时间,决定能不能说它真的加速了系统。
flowchart TD E1[1. HLS CSim<br/>C/C++ 数值模型通过] --> E2[2. HLS csynth<br/>可综合并有资源/时序估计] E2 --> E3[3. C/RTL cosim<br/>生成 RTL 与参考模型一致] E3 --> E4[4. Vivado 实现<br/>布局布线和时序通过] E4 --> E5[5. ZCU106 板级运行<br/>ARM、DDR、AXI、FPGA 协同] E5 --> E6[6. 端到端性能目标<br/>必须快于对照实现] E5 --> OK[SM-05:功能硬件证据完成] E6 --> FAST[才允许声明 FPGA 加速] E6 -. 当前未通过:慢于纯 ARM A53 .-> NO[不声明加速]
11. SM-05 W8A8 线性投影模块的硬件证据
rows1536 LANES16 配置的 HLS、Vivado 和 JTAG 功能证据已经完成:
- HLS CSim 通过。
- HLS csynth 通过,packed loop
II=1。 - HLS 生成 RTL 的 Verilog C/RTL cosim 通过,数值 mismatch 为
0。 - Vivado 实现通过,
WNS=4.283 ns、TNS=0、DRC 错误0、布线错误0。 - 两次真实 ZCU106 JTAG 诊断运行输出精确词元
6403,1980,253,655和文本Once upon a time。 rows1536 LANES16相对rows1536 LANES8快1.248378x。rows1536 LANES16相对纯 ARM A53 缓存运行只有0.451015x,即仍慢2.217220x。
因此 SM-05 W8A8 线性投影模块的 FPGA 功能完成,但 FPGA 加速目标失败。rows1536 物理 SD 冷启动仍待板卡恢复后验收。
12. 数值和模型精度边界
12.1 FPGA 点积正确性
SM-05 W8A8 线性投影模块的 HLS CSim 和 C/RTL cosim 对 int8 点积报告 mismatch 0。真实板级运行的 hls_status=0,固定输入的四个输出词元与纯 ARM A53 运行一致。
12.2 ARM A53 与 host 实现一致性
固定 34-token prompt 下,ARM A53 与 portable host C 的 30 个 layer-last 向量、最终归一化向量和 ordered top-k 字节一致,L2 为 0.0。
12.3 模型质量评估
当前证据只证明固定 prompt 的 M1i W8A8 top1 和四词元生成。当前证据没有覆盖 perplexity、通用数据集、多 prompt 统计或原 mixed-GGUF 全 logits 接受门禁。
因此可以声明实现一致性,不能声明 W8A8 模型质量已经完成全面评估。
13. 当前正式状态
m1i_w8a8_first_pass_complete=true
production_ps_host_contract_passed=true
a53_production_runtime_contract_passed=false
m1_complete=false
accepted_token_step_golden_complete=false
q25_m1_003_satisfied=false
runtime_completed=false
board_pass_claim_allowed=false
performance_acceleration_claimed=false
physical_sd_cold_boot_rows1536_complete=false
14. 关系问题直接回答
14.1 为什么项目报告会出现 RTL
项目没有为 SM-08 注意力概率模块或 SM-09 注意力值聚合模块手写 Verilog RTL。项目使用 C/C++ 编写 HLS 源码,Vitis HLS 将 HLS 源码生成 RTL,C/RTL cosim 再比较 HLS C 模型与 HLS 生成的 RTL。
因此“代表性 RTL 通过”的完整含义是“代表性输入在 HLS 生成 RTL 的 C/RTL cosim 中通过”,不是“已经完成手写 RTL”,也不是“已经形成可部署 FPGA IP”。
HLS 能减少开发和验证工作,但 HLS 不保证比手写 RTL 更快。SM-08 注意力概率模块和 SM-09 注意力值聚合模块是否高效,主要取决于 DDR 访问、片上 Key/Value 复用、softmax 数值格式、流水间隔和并行度。只有完整 HLS IP 完成 Vivado 实现并得到真实板级 profile 后,才能判断是否需要把具体热点改为手写 RTL。
14.2 如何判断一个 FPGA 硬件模块已经完成
本项目把以下证据层次分开:
HLS CSim 通过:只证明 HLS C/C++ 数值模型通过。
HLS csynth 通过:只证明 HLS C/C++ 可以综合,并得到估算时序和资源。
HLS C/RTL cosim 通过:只证明 HLS 生成 RTL 与 HLS C/C++ 参考模型在测试范围内一致。
Vivado 实现通过:证明 IP 能放入目标器件并完成布局布线和实现时序。
真实板级运行通过:证明 ARM A53 处理系统、DDR、AXI、FPGA 可编程逻辑和软件协议共同工作。
性能目标通过:证明真实端到端运行优于对照实现。
只有 SM-05 W8A8 线性投影模块完成了第 1 至第 5 层证据。SM-05 W8A8 线性投影模块没有完成第 6 层证据,因为真实端到端时间慢于纯 ARM A53 处理系统。
14.3 SM-08 注意力概率模块和 SM-09 注意力值聚合模块是否完成 FPGA 设计
SM-08 注意力概率模块和 SM-09 注意力值聚合模块在当前主线和冻结的 FPGA 功能回归路径中都由 ARM A53 处理系统完整执行。
历史 mixed-GGUF HLS 工程具有局部 HLS CSim、csynth、代表性 C/RTL cosim和 host 全 tile 调度证据,但历史 mixed-GGUF HLS 工程没有形成统一、全头、全 tile、完成 Vivado 实现和板级运行的 FPGA IP。
因此 SM-08 注意力概率模块和 SM-09 注意力值聚合模块的系统功能已完成,FPGA 实现未完成。
14.4 SM-05 W8A8 线性投影模块与 Attention Output 投影加残差的关系
当前主线和冻结的 FPGA 功能回归路径都使用 SM-05 W8A8 线性投影模块执行 Attention Output 投影,随后使用 SM-10 残差加法模块执行残差加法。
两个执行路径都已经真实运行该组合。当前主线的 SM-05 W8A8 线性投影模块和 SM-10 残差加法模块都在 ARM A53 处理系统执行;冻结的 FPGA 功能回归路径把 SM-05 W8A8 线性投影模块的 int8 点积步骤放在 FPGA 可编程逻辑执行,SM-10 残差加法模块仍在 ARM A53 处理系统执行。
历史 Q5_0 Attention Output 投影加残差 HLS 工程完成了 576 行 HLS CSim、csynth 和 C/RTL cosim,但历史 Q5_0 HLS 工程没有进入冻结的 FPGA 功能回归路径的 Vivado 工程和真实板级运行。历史 Q5_0 HLS 工程不是当前主线或冻结的 FPGA 功能回归路径的额外必需模块。
14.5 SM-05 W8A8 线性投影模块与完整 MLP 的关系
当前主线和冻结的 FPGA 功能回归路径都按以下顺序执行完整 MLP:
SM-04 均方根归一化模块。
SM-05 W8A8 线性投影模块执行 MLP Gate 投影。
SM-05 W8A8 线性投影模块执行 MLP Up 投影。
SM-11 SiLU 门控激活模块。
SM-05 W8A8 线性投影模块执行 MLP Down 投影。
SM-10 残差加法模块。
两个执行路径的完整 MLP 都已经真实运行。只有冻结的 FPGA 功能回归路径把三次 SM-05 W8A8 线性投影模块的 int8 点积步骤放在 FPGA 可编程逻辑。
历史 mixed-GGUF 完整 MLP HLS 工程使用 Q5_0 和 Q5_K 权重。历史 mixed-GGUF 完整 MLP HLS 工程的 HLS CSim 和 csynth 通过,正式 m_axi C/RTL cosim 未通过,因此历史 mixed-GGUF 完整 MLP HLS 工程不是已完成可部署硬件。
14.6 tensor index 0..210 是否已经完成
SM-05 W8A8 线性投影模块按顺序处理 tensor index 0..210 的真实板级功能已经完成。
tensor index 0..210 表示 211 组权重。tensor index 0..210 不表示 211 个 FPGA IP。FPGA 可编程逻辑只有一个 SM-05 W8A8 线性投影模块代码实体,SM-13 运行时控制与串口协议模块按照模型执行顺序重复调用 SM-05 W8A8 线性投影模块。
完成 tensor index 0..210 只证明全部线性投影的整数点积进入 FPGA 可编程逻辑。完成 tensor index 0..210 不表示 SM-04 均方根归一化模块、SM-06 旋转位置编码模块、SM-07 键值缓存模块、SM-08 注意力概率模块、SM-09 注意力值聚合模块、SM-10 残差加法模块、SM-11 SiLU 门控激活模块或 SM-12 词元排序与贪心选择模块进入 FPGA 可编程逻辑。
14.7 最终归一化、49152 行词表输出和 top-k 的关系
最终推理阶段按以下顺序执行:
SM-04 均方根归一化模块执行最终归一化。
SM-05 W8A8 线性投影模块使用 tensor index 0 计算 49152 行词表输出。
SM-12 词元排序与贪心选择模块执行逐行浮点缩放、top-k 和最大词元选择。
当前主线和冻结的 FPGA 功能回归路径都已经执行完整最终推理阶段。只有冻结的 FPGA 功能回归路径把 SM-05 W8A8 线性投影模块的 int8 点积步骤放在 FPGA 可编程逻辑。
历史 Q8_0 全词表 HLS 工程是 SM-05 W8A8 线性投影模块和 SM-12 词元排序与贪心选择模块的替代组合实验。历史 Q8_0 全词表 HLS 工程不是当前主线或冻结的 FPGA 功能回归路径还需要串接的系统模块。
14.8 rows1536 LANES16 与 13 个固定系统模块的关系
rows1536 LANES16 只配置 SM-05 W8A8 线性投影模块内部的 FPGA 点积代码实体。
rows1536 LANES16 不改变 13 个固定系统模块的数量,不改变 30 层模型结构,也不把其他固定系统模块移动到 FPGA 可编程逻辑。
rows1536 LANES16 的功能、HLS、Vivado 和 JTAG 诊断运行证据已经通过,但 rows1536 LANES16 的端到端性能慢于纯 ARM A53 处理系统,因此 performance_acceleration_claimed=false。
15. 13 个固定系统模块的性能测量与当前 ARM A53 优化
15.1 测量边界
主机测量程序使用真实模型、真实 tokenizer、34 个输入词元和四个输出词元,分别记录预填充与三次逐词元解码。测量结果仍要求精确输出词元 6403,1980,253,655 和文本 Once upon a time。
- SM-01 运行时资产加载与校验模块记录模型和 tokenizer 的读取、结构打开时间。
- SM-02 文本编码与解码模块记录输入文本编码和输出词元解码时间。
- SM-03 词元嵌入模块至 SM-11 SiLU 门控激活模块在各自实际计算边界记录时间。
- SM-07 键值缓存模块的独立时间只覆盖 Key、Value 写入;注意力读取缓存的时间仍包含在 SM-08 注意力概率模块和 SM-09 注意力值聚合模块中。
- SM-08 注意力概率模块和 SM-09 注意力值聚合模块按每个注意力头分别计时,因为当前实现会立即复用
scores缓冲区;把两者强行改成两个全局阶段会改变实现结构。 - 最终 49152 行词表循环把 SM-05 W8A8 线性投影模块的逐行点积与 SM-12 词元排序与贪心选择模块的缩放、top-k 交织执行。该区间作为 SM-05 W8A8 线性投影模块与 SM-12 词元排序与贪心选择模块的联合区间报告,不伪造两个独立时间。
- SM-13 运行时控制与串口协议模块记录总时间减去已测计算区间后的剩余时间;该剩余时间包含测量回调开销。
该测量是 WSL/x86 主机热点定位,不能直接替代 ARM A53 时间,也不能形成 FPGA 加速声明。
15.2 当前热点结论
修改前的三次主机样本显示,SM-05 W8A8 线性投影模块的 30 层投影预填充中位数为 403.327790 ms,三次逐词元解码合计中位数为 39.942947 ms。SM-05 W8A8 线性投影模块是可独立测量部分中最大的热点。
最终词表阶段中,SM-05 W8A8 线性投影模块与 SM-12 词元排序与贪心选择模块的联合区间预填充中位数为 3.206646 ms,三次逐词元解码合计中位数为 9.837263 ms。该联合区间不改变 SM-05 W8A8 线性投影模块是首个 ARM A53 优化目标的结论。
15.3 首个 ARM A53 优化候选
SM-05 W8A8 线性投影模块的预填充路径现在先量化全部输入词元,再按权重行优先、输入词元次序执行点积,使同一权重行能够被多个输入词元复用。每个 int8 点积内部的列累加顺序没有改变;逐词元解码路径和其他固定系统模块没有改变。
绑定修改前报告的五次候选样本显示:
- SM-05 W8A8 线性投影模块预填充中位数从
403.327790 ms降至388.676636 ms,主机热点测量为1.037695x。 - 整段预填充中位数从
420.268767 ms降至405.600303 ms,主机热点测量为1.036165x。 - 30 个逐层最后词元向量、最终归一化向量和 ordered top-k 与既有 ARM A53
fp-contract=offtranscript 位级一致,final_l2=0.0、norm_l2=0.0。 - 新的纯 ARM A53、SD 资产加载、
fp-contract=offELF 已构建;真实 ARM A53 性能仍待板卡恢复后测量。
因此当前状态是“主机功能和热点改善候选通过、ARM A53 构建通过、真实 ARM A53 性能待验收”。runtime_completed=false、board_pass_claim_allowed=false、performance_acceleration_claimed=false 保持不变。
15.4 ARM A53 处理系统 production runtime 的 host 生命周期门禁
production runtime 验收合同仍只使用本文件的固定系统模块:
- SM-01 运行时资产加载与校验模块负责真实模型、runtime manifest 和 tokenizer 的文件、大小与 SHA256 门禁。
- SM-02 文本编码与解码模块负责 ASCII、含多字节 UTF-8 的输入和两条 stream 输出路径。
- SM-07 键值缓存模块负责每个请求开始前清零、prefill 后计数、生成后计数和请求结束后再次清零。
- SM-12 词元排序与贪心选择模块负责五条执行路径的精确词元一致性。
- SM-13 运行时控制与串口协议模块负责五条命令路径、单请求生命周期、错误命令拒绝和结果字段。
真实 host C runtime 已完成三类 prompt 的五条路径:完整重算、缓存生成、完整重算 stream、缓存生成 stream 和第二次缓存生成。总计 15 条真实生成路径全部一致;另有 6 类错误命令和 5 类资产失败按合同拒绝。63-token 输入只生成一个词元并以 64-token 上限停止。
因此 production_ps_host_contract_passed=true。该标志只表示 host 层门禁通过;真实 ARM A53 处理系统尚未执行同一完整合同,物理 SD 冷启动也尚未使用最终 promotion artifact 完成,所以 a53_production_runtime_contract_passed=false、runtime_completed=false 和 board_pass_claim_allowed=false。
15.5 SM-05 W8A8 线性投影模块的四词元候选
SM-05 W8A8 线性投影模块新增了一个默认关闭的四词元寄存器分块候选。该候选只改变多词元预填充的 ARM A53 处理系统点积循环:同一权重向量同时更新四个独立 int32 累加器;每个累加器仍严格按列 0..N-1 累加。单词元 decode、SM-07 键值缓存模块、SM-08 注意力概率模块、SM-09 注意力值聚合模块和 FPGA backend 均未改变。
板卡无关证据为:
- 36 组差分测试覆盖 token 数
2/3/4/5/34/64、输出行192/576/1536和输入列576/1536,int32 点积与 float 输出逐字节一致。 - 五个真实模型样本中,SM-05 W8A8 线性投影模块预填充中位数从
388.676636 ms降至362.466631 ms,host 提升1.072310x;整段预填充提升1.066344x。 - 30 层最后词元向量、最终归一化向量和 ordered top-k 与既有 ARM A53
fp-contract=offtranscript 位级一致。 - AArch64 反汇编具有同一权重向量驱动的四条 NEON
smull和四组独立累加链。 - ARM A53 候选 ELF 已构建,但真实 ARM A53 时间尚未测量。
因此四词元实现保持 host_candidate_pass_a53_timing_pending,编译开关默认关闭,promote_candidate=false。只有真实 ARM A53 两次缓存生成中位数相对默认 production artifact 提升至少 1.05x 后,才允许重新生成 promotion payload。