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

本环:删掉的是谁,一句话说清

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

第 63 环让「删掉第二场」真的删掉了第二场,可回执只说「好,第二场删掉了。」——用户听见一个序号,还得自己回想第二场是哪一场;如果删错了,也听不出来。

这一环让硬件在删除之前,先读这一场自己的名字格,把回执改成「好,<名字>删掉了。」。删掉的是谁,一句话说清。

② 实现(做了什么)

name_pick 的删除支路多读一格名字。第 63 环取到第 N 条活清单条目后直接排序号回执;这一环先按条目里的槽号算出名字格地址,读完 6 字(24 字节、零填充)再排回执:

  • 读自己的名字格:0x200 + 槽号×6,6 字读完;名字有效长度取第一个 0 字节之前(最多 12 字节 = 4 个汉字);
  • 回执改成名字:「好,」+ 名字 +「删掉了。」= 6 + 名字字节 + 12,最多 30 字节,落同一个 0x230 对话缓冲区;
  • 删除前读:删除引擎会 free 槽、清名字格,所以名字必须在交给删除引擎之前读出来;
  • 空名字兜底:名字格是空的无名会话,退回第 63 环的「好,第N场删掉了。」27 字节——不硬念一个空名字;
  • 不复用旧名字:每趟都按本场槽号重新读,不缓存上一场的名字;连续删两场,回执必须是两个不同的名字;
  • 开关:新寄存器 NP_DELNM(0xF9C 写口)=1 开启;0 仍是第 63 环老语义,老用例可以逐位对表。本圈 OS 在进入删除试验前打开它。
活清单:[0xB3 家里的事 / 槽2] [0xB4 跑步计划 / 槽3]
说「删掉第二场」→ 取第 2 条 0xB4 / 槽 3
                  → 读名字格 0x200 + 3×6 → 「跑步计划」12 字节
                  → 回「好,跑步计划删掉了。」6+12+12 = 30 字节
                  → fs_start idx=2 → 删完 NP_CNT=1
说「删掉第一场」→ 取第 1 条 0xB3 / 槽 2
                  → 读名字格 0x200 + 2×6 → 「家里的事」12 字节
                  → 回「好,家里的事删掉了。」30 字节 → NP_CNT=0
                  (若复用上一场名字,第二字就会是「跑步」→ 自曝)

软硬接口。NP_DELNM(0xF9C 写)开关;NP_DELNAME(0xF9C 读,bit5=named、bit4:0=len)探针;新观察点 SCREEN40(0xFFC)。前 63 圈地址映射一字不改;ISA 一位没动(还是 npu.name)。

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

协同仿真 tb_min_soc64:接着第 63 环剩下的两场(0xB3 家里的事 / 0xB4 跑步计划),然后:

  • 说「删掉第二场」 → 删 0xB4 / 槽3,NP_DELNAMED=1 / NP_DELNLEN=12 / NP_BYTES=30 / NP_DELDONE=1 / NP_CNT=1,0x230 与「好,跑步计划删掉了。」逐字相同;
  • 接着说「删掉第一场」 → 删 0xB3 / 槽2,回执「好,家里的事删掉了。」30 字节,NP_CNT=0;
  • 两场名字不同:w1 = 0xB7E88CBC(跑步)vs 0xAEE58CBC(家里)——硬件没有复用上一场的名字;
  • 删除通路没变:仍是 fs_start + fs_idx,与 npu.forget 同一条,核不发第二条指令;
  • 空名字兜底:单元用例⑧把第 4 场名字格清空 → 回执退回「好,第四场删掉了。」27 字节,NP_DELNAMED=0 / NP_DELNLEN=0。
SCREEN40 = 0x800C1E1E
named=1 · len=12 · bytes=30 · bytes=30

主通路 SCREEN=0xF905FD04、SCREEN2~39 与第 25~63 环逐位一致。单元仿真 tb_name_pick64(名字回执 / 另一场名字 / 越界 / 不是删除 / 序号点选 / 全名 / 空名字 / 空名字格兜底)与协同 tb_min_soc64 通过;tb_name_pick63 / tb_min_soc63 复跑也通过(开关=0 时老语义不变)。

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

只有一个对话窗口的手机,删除是少见但危险的动作。用户说「删掉第二场」,AI 回「好,跑步计划删掉了。」——这一句话同时完成了执行和确认:用户当场知道删对了没有,不需要再去翻清单。

这也是软硬协同该有的样子:名字不是 UI 层临时拼的字符串,而是会话记忆里的一等公民;删除回执由芯片在删除前读同一格名字、同一拍排字,OS 只把 0x230 这一行搬到屏幕上。