🎯 圆心 · 目标(每环都从这里出发)
造一台 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…

本环:从「第二场能点」到「第二场能删」

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

第 62 环让「第二场」成了可点的东西。可用户聊完一场,顺口说「删掉第二场」——这六个字仍然被当成一个名字去比:名字格里没有谁叫「删掉第二场」,24 字节永远不相等,于是手机回一句「没找到:…」。用户已经按序号指得很清楚,却删不掉。

这一环把序号从「选」扩展到「管」:同一个 npu.name 认删除序号,先取第 N 条、排回执,再把这一条交给删除引擎——核不发第二条指令。

② 实现(做了什么)

name_pick 加了一条「删」支路。点名、全名、反问、选序号这些老路一个字没改;新增的是读表头之后的一次判断:

  • 认删除序号:接受「删掉第N场」「删第N场」,「掉」可省、「场」可省,但「第」必须有——所以「删掉第二场会议」这种真名字不会被误判成删除;N = 一..九 或 ASCII 1..9;
  • 直取条目:仍然只读活清单0x1C0 的第 N 条(紧凑序号,槽号可稀疏),不读名字格、不比 24 字节,ncmp=0;
  • 回执:排「好,第N场删掉了。」27 字节 / 9 个汉字(空格补到 36)落 0x230,与点名回执共用同一个对话缓冲区;
  • 交给删除引擎:回执写完后发一拍 fs_start + fs_idx=N,直连第 55 环的 forget_sess——与核发 npu.forget 是同一条通路。引擎自己 free 槽、清名字格、重排清单;点名引擎先等 busy 起、再等 busy 落,最后用引擎回的场数当 cnt;
  • 越界:三场说「删掉第四场」→ 不删、不换场,复用第 60 环的「没找到,是这三场吗?」(del_r 保留,但 miss_r 让 S_WR 不走删除);空清单只报 err、不回话;
  • 删当前场:删除引擎发出的 sx_forget 把当前会话指针当场清掉(cur_valid=0),不留一个指向已释放槽的「当前场」。
活清单 4 场:0xB1 记一笔 / 0xB2 查资料 / 0xB3 家里的事 / 0xB4 跑步计划
说「删掉第二场」→ 读表头 cnt=4 → 认删除序号 N=2 → 取第 2 条
                  → 0xB2 / 槽 1 → 回「好,第二场删掉了。」27 字节
                  → fs_start idx=2(与 npu.forget 同一条通路)
                  → free 槽 1 + list 重排 → cnt=3,cur_valid=0(删的是当前场)
说「删掉第四场」→ N=4 > 3 → 回「没找到,是三场吗?」(36 字节)
                  → 不删、不换场,DELDONE=0、CNT 仍 3

软硬接口。点名页新增只读探针:NP_DEL(0xF94,这一趟认不认成删除)、NP_DELDONE(0xFE4,删除引擎跑没跑完);新观察点 SCREEN39(0xFF8)。前 62 圈的地址映射一字不改;ISA 一位没动(还是 npu.name)。

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

协同仿真 tb_min_soc63:接着第 62 环的四场(0xB1..0xB4,名字齐全,当前 0xB2),然后:

  • 说「删掉第二场」 → NP_DEL=1 / NP_ORD=1 / NP_ORDN=2 / NP_OK=1 / NP_SID=0xB2 / NP_SLOT=1 / NP_NCMP=0 / NP_BYTES=27 / NP_DELDONE=1 / NP_CNT=3,0x230 与「好,第二场删掉了。」逐字相同;SX_STATUS.cur_valid=0——删的正是当前这场;
  • 说「删掉第四场」(只剩三场)→ NP_DEL=1 / NP_ORDN=4 / NP_OK=0 / NP_ERR=1 / NP_ANSWERED=1 / NP_BYTES=36 / NP_DELDONE=0 / NP_CNT=3,回「没找到,是三场吗?」,一场没删、没换场;
  • 说「删掉第一场」 → 删 0xB1,NP_SID=0xB1 / NP_SLOT=0 / NP_CNT=2,回执「好,第一场删掉了。」;
  • 再说「第二场」 → 清单已重排为 [0xB3, 0xB4],第二条 = 0xB4(ncmp=0)——删除真的重排了清单;
  • 说全名「家里的事」 → 命中 0xB3(ncmp=1)——删完之后名字照旧能点;
  • 说「删掉第二场会议」 → NP_DEL=0 / NP_ERR=1 / NP_ANSWERED=1 / NP_DELDONE=0,走比名字路径、不删——名字里带删除词不会被误判;
  • 核零配置:一条 npu.name 从认字到删完,核没有发第二条指令。
SCREEN39 = 0xCA00B203
del=1 · ord=1 · ordn=2 · ok=1 · sid=0xB2 · cnt=3

主通路 SCREEN=0xF905FD04、SCREEN2~38 与第 25~62 环逐位一致。单元仿真 tb_name_pick63(删掉第二场 / 删第二场 / 越界第七场 / 「删掉第二场会议」不算删除 / 序号点选 / 全名命中 / 空名字)通过;协同 tb_min_soc63 通过。

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

手机只有一个 AI 对话窗口,清单是它和用户共同的记忆。记忆如果不能被一句话整理,它很快就会变成一堆不敢碰的旧会话。用户说「删掉第二场」,AI 就该真的删掉第二场——不是回一句「我没找到这个名字」。

这一环把「点得到」接成了「管得了」:用同一句话,既能进入一场,也能结束一场。释放的槽位、清掉的名字格、重排的清单,全部由硬件按同一条删除通路完成;用户看到的只是 AI 回了一句「好,第二场删掉了。」