第 12 环 · 残差连接(LayerNorm)
同一个圆心:一台开机只有一个 AI 的手机。上一环结束,芯片已经能算一个完整的 Transformer 块(注意力 → FFN)里的两块。但真实的 Transformer 不是「一块」,而是几十层同样的块摞起来。要把块摞起来,缺两样东西:残差连接(把子层的输入加回输出,s = a + b)和 LayerNorm(把这条残差流归一化,减均值、除标准差,再乘缩放加平移)。没有它们,层一深信号就发散、训不稳。本环让芯片把「残差 + 归一化」跑通——做完它,一个可堆叠的 Transformer 块(注意力 → 残差 → FFN → 残差 → LN)才真正成立。
延续「端上算力紧凑、全部定点、不用浮点」的主线:
· 残差流两路输入 a(注意力输出)、b(FFN 输出),各 4 lane × 8bit 有符号;
· 残差:s[d] = a[d] + b[d];
· 均值:mean = (Σ s[d]) >> 2(右移 = 除以 4);
· 中心化:dev[d] = s[d] - mean;方差:var = (Σ dev[d]²) >> 2;
· 反标准差:rstd = round(256 / √max(var,1))——给一个小查找表(Q8 定点,不用浮点、不用除法器);
· 归一化 + 仿射:y[d] = (dev[d]·rstd·gamma[d]) >> 12 + beta[d](rstd 是 Q8、gamma 是 Q4.4,合计右移 8+4)。
全部是整数加减乘和移位,核喊一声 start,硬件一次算完。
新增 rtl/resid_ln.sv:残差相加 → 均值 → 中心化 → 平方和求方差 → rsqrt 查表 → 乘 gamma 加 beta,一条组合逻辑链走完;
残差: s[d] = a[d] + b[d] 均值: mean = Σs >> 2 中心化:dev[d] = s[d] - mean 方差: var = Σdev² >> 2 反标准差:rstd = lut[min(var,31)] # lut[i] = round(256/√max(i,1)),Q8 归一化:y[d] = (dev[d]·rstd·gamma[d]) >> 12 + beta[d] 结果锁存:start 那拍锁进 y_out,下一拍 busy 拉低、done 拉高
min_bus.sv 挂载 resid_ln 引擎,新映射:
0x0A4 → RSN_A 残差流输入 a(4×8bit,注意力输出) 0x0A8 → RSN_B 残差流输入 b(4×8bit,FFN 输出) 0x0AC → RSN_GAMMA LayerNorm 缩放 gamma(4×8bit,Q4.4,0x10=1.0) 0x0B0 → RSN_BETA LayerNorm 平移 beta(4×8bit 有符号) 0x0B4 → RSN_START 写 1 → 触发残差相加 + LayerNorm 0x0B8 → RSN_OUT0 读归一化输出 lane0(32bit 有符号) 0x0BC → RSN_OUT1 读 lane1 0x0C0 → RSN_OUT2 读 lane2 0x0C4 → RSN_OUT3 读 lane3 0x0C8 → RSN_MEAN 读均值 mean(32bit 有符号) 0x0CC → RSN_VAR 读方差 var(32bit) 0x0D0 → RSN_RSTD 读 Q8 反标准差 rstd 0x0D4 → RSN_BUSY 读忙闲(含刚下发那拍,无空窗)
这一环最直观的是 归一化真的在工作:残差流 [-4,-4,4,4] 均值为 0、方差 16,反标准差 rstd=0.25(Q8 = 64);dev 除以 0.25 再乘 gamma=1.0,得 [-1,-1,1,1]——自动把数值压进了小范围,不管输入多大。单元仿真的用例 2 把 gamma 设成逐 lane [4.0,2.0,1.0,0.5],输出精确变成 [-4,-2,1,0],证明缩放/平移(仿射)也生效;用例 3 用 a≠b 验证残差相加不是摆设(s=[-4,-4,8,8] → mean=2, var=36)。协同仿真里核跑最小 OS,从写残差流到屏幕 0x0101FFFF = 16908287,全链路闭环。
本环走完一整圈:目标 → 大模型是几十层块摞起来的,层一深就需要残差和归一化稳住信号 → 硬件用「整数相加 + 查表 rsqrt + 定点乘移」把残差和 LayerNorm 落地,不用浮点 → 残差 / 归一化 / 仿射 / 全量回归全部跑通 → 回到目标。至此一个可堆叠的 Transformer 块(注意力 → 残差 → FFN → 残差 → LN)在芯片上闭合——不再是单个零件,而是一个能一层层摞成整网的标准积木。下一步,把这块积木真的摞成多层,从 token 进、到 logits 出,跑一个端到端的小模型。离一台本地跑大模型的手机,又近一圈。
第 13 环:多层堆叠 · 端到端迷你 Transformer——把上一环的标准块摞成 2 层,残差流贯穿多层,从 token 输入一路算到输出 logits,验证「多块级联」在芯片上稳定收敛。