🎯 圆心 · 目标(每环都从这里出发)
造一台 Salt OS 手机:基于 DeepSeek 的 AI 操作系统,iPhone 4S 外形(含底部圆形 Home 键),开机只有一个 AI(无桌面、无图标),软硬协同设计(OS + 芯片 + 主板一起做),为别人搭台、让别人在平台上赚钱。

🧭 完整框架(同心圆)

①文字闭环 → ②技术深入 → ③挂SRAM → ④权重INT4 → ⑤激活INT4 → ⑥NPU.STORE → ⑦KV Cache → ⑧注意力QK^T → ⑨Softmax → ⑩加权V → ⑪前馈FFN → ⑫残差·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   读忙闲(含刚下发那拍,无空窗)
④ 怎么算成(闭环验证)
a=b=[-2,-2,2,2] → 残差 s=[-4,-4,4,4] → mean=0 · var=16 · rstd=64 → gamma=1.0 → y=[-1,-1,1,1] → 屏幕 0x0101FFFF · RESULT=PASS
单元仿真(残差相加 / 归一化 / 仿射 gamma 逐 lane)+ 核-OS-写残差流-归一化 协同仿真 + 全量回归 全部通过

这一环最直观的是 归一化真的在工作:残差流 [-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 出,跑一个端到端的小模型。离一台本地跑大模型的手机,又近一圈。