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

🧭 完整框架(同心圆)

①文字闭环 · ②技术深入 · ③挂SRAM · ④权重INT4 · ⑤激活INT4 · ⑥NPU.STORE · ⑦KV Cache · ⑧注意力QK^T · ⑨Softmax · ⑩加权V · ⑪前馈FFN · ⑫残差·LayerNorm · ⑬多层堆叠 · ⑭QKV投影 · ⑮K/V分离 · ⑯自回归解码 · ⑰连续生成 · ⑱采样 · ⑲KV环形缓冲 · ⑳滑窗注意力 · ㉑多头注意力 · ㉒输出投影 W_o · ㉓多头块入残差流 · ㉔多头块进解码循环 · ㉕整层一块 · ㉖整网一块 · ㉗ISA契约 · ㉘权重内存化 · ㉙权重预取双缓冲 · ㉚权重分块 · ㉛矩阵行块 · ㉜行块自增 · ㉝起始块号可编程 · ㉞段表连扫 · ㉟段表流式取 · ㊱行块矩阵扫 ISA 化 · ㊲描述符链 · ㊳链槽直喂 · ㊴主路走链 · ㊵链预投下层 · ㊶跨趟预投 · ㊷权重池三 bank · ㊸权重池 ISA 化 · ㊹一步生成 ISA 化 · ㊺整段生成 ISA 化 · ㊻对话回路 · ㊼对话 ISA 化 · ㊽会话记忆归档 · ㊾多会话槽位 · ㊿会话槽位 ISA 化 · 51 开机续聊 · 52 会话清单 · 53 开机用上清单 · 54 问候接话 · 55 删掉一场 · 56 会话改名 · 57 名字进问候 · 58 问候念清单 · 59 按名字接话 · 60 叫错名字也回一句 · 61 反问给选项 · 62 按序号点选 · 63 序号用于删除 · 64 删除回执念名字 · 65 删除可撤回 · 66 撤回回执念名字 · 67 撤回即续聊 · 68 续聊先开口 · 69 开口带名字 · 70 开口不叫错人 · 71 开机问候也认人 → 72 单名问候也验归属

本环:开机第一句,先认人再念名字

① 目标(这一环要解决什么)

第 70 环把「续聊开口」这条入口堵住了:接回一场之前先验名字归属,归属不对就不叫名字。可手机开机还有另一条入口——开机问候念清单。第 58 环的问候合成器自己走一遍活清单(0x1C0),逐条取槽号、读名字格,把名字排进第一句。

它读名字时只看槽,不看人。槽一旦被回收再分配,旧名字还留在格子里,开机第一句就会把别人的名字叫给这一场听。第 70 环修的是「接回之后」,这一环把「开机第一句」也补齐:清单里每一个名字,都要先验归属。

② 实现(做了什么)

名字念出口之前,多读一格归属。boot_greet 的念清单路径在收到清单条目(槽号 + sid)之后,不再直接去读名字格,而是先发一拍同步读 OWNER_BASE = 0x280 + 槽号:

  • 归属 == 条目 sid:这个槽当前就是这一场,名字可信 → 继续读 6 字名字格,照旧拼进问候,nver++;
  • 归属 != 条目 sid:槽复用留下的旧名字 → 跳过不念,不补「、」,不计入 nspoken,nskip++,直接翻下一条清单;
  • 一个名字都没验过:退回第 53 环按场数那句(「你有三场没聊完。」),不硬凑一句没有名字的清单;
  • 名字格为空的场次仍按原契约跳过;「念三场封顶 + 尾巴诚实报还有几场」一字未改。

接口。新增只读探针 BG_NVER(0xE74,归属验过几场)、BG_NSKIP(0xE70,归属对不上跳过几场),屏摘要 SCREEN47(0xAE4);前 70 圈地址映射一字不改,ISA 一位没动(仍 npu.boot)。名字格布局(6 字/槽)与归属表(1 字/槽)都沿用第 56/70 环,不新开存储。

③ 验证(怎么证明它真的跑通)

单元仿真 tb_boot_greet71(真同步 SRAM 行为模型):

  • 三场归属全对(0xA1/0xA2/0xA3)→ 三个名字按清单顺序念全:nsp=3 / ver=3 / skip=0,64 字节 / 16 字逐位;
  • 中间一场归属对不上(槽 1 名字格「工作那场」,归属 0xAA,条目 0xA2)→ 跳过它,念「记一笔、家里的事,还有一场。」nsp=2 / ver=2 / skip=1 / left=1;
  • 三场归属全对不上 → 一个名字都不念,退回「你有三场没聊完。」ver=0 / skip=3 / named=0;
  • all_names=0 的单名问候路径逐位不变;clear 把 nver/nskip 一并归零。

ISA 协同仿真 tb_isa_greet71(真整颗 SoC):目录三场 0xA1(slot0) / 0xA2(slot1) / 0xA3(slot2);三格名字都写着字,但槽 1 的归属是 0xAA(上一任留下来的)。开机前 BG_ALL=1,一条 npu.boot 跑完恢复、清单、问候:

  • 槽 1「工作那场」被归属挡住,没有出现在问候里;
  • 0x1E0 =「记一笔、家里的事,还有一场。」64 字节 / 11 字逐位相同;
  • BG_NVER=2 / BG_NSKIP=1 / BG_NSPOKE=2 / BG_TOTAL=3 / BG_LEFT=1 / BG_NAMED=1,全由硬件自报;
  • SCREEN47 = 0x00122140(skip 1 | ver 2 | spoken 2 | left 1 | bytes 64),SCREEN=0x71;一次 npu.wait 没冻死。
RESULT=PASS
槽 1 归属 0xAA ≠ 0xA2 → 开机第一句不叫「工作那场」

回归:tb_boot_greet(第 53 环按场数)、tb_boot_greet58(第 58 环念清单,补上归属格后断言照旧)、tb_boot_greet71、tb_min_soc58(OS 层真 boot 念清单)、tb_min_soc64、tb_isa_resume69、tb_isa_resume70、tb_resume_speak70 共 8 项 RESULT=PASS;tb_min_soc64 主通路 SCREEN=0xF905FD04 与第 25~70 环逐位一致(计算面一个字没动)。

④ 回到目标(这一环让手机多了什么)

只有一个对话窗口的手机,开机第一句话就是它的「人味」。记得住几场对话还不够,得叫对人——名字不是这一场的,就宁可少念一个,也不把别人的名字塞进这一场。

这也是软硬协同的分寸:清单在内存里,归属表在内存里,比对在硬件里;核不查表、不比对、不拼字,开机那一条 npu.boot 就把该叫的名字叫准了。