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

本环:从「一片沉默」到「没找到,是这四场吗?」

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

第 59 环让用户说名字就能切场。可名字说错了呢?芯片只把 err 拉高,一个字都不回。手机只有一个对话窗口——用户对着它叫错名字,得到的是沉默,既不知道自己错在哪,也听不到还有哪几场可以点。

这一环让失败也有回执:没找到就把「没找到」和场数排成一句话,反问用户一句。叫错也不冷场。

② 实现(做了什么)

name_pick 加「没找到」支路。原来的扫描一个字没改:读活清单 0x1C0 → 逐场读名字格 0x200+槽×6 → 24 字节全等比较。新增的只是扫完之后:

  • 仍然一个都不像 → 硬件自己排一句「没找到,是这N场吗?」,N 从活清单人数来(一 / 二 / 三 / 四);
  • 30 字节 UTF-8,空格补到 36 字节 / 9 字,落进与命中回执同一个 0x230~0x238——OS 从同一个对话缓冲区读回上屏,不新开内存口;
  • 不换场:sid 清 0、SX_CUR 一位不动,换场脉冲一次不发(answered=1 / ok=0 / err=1);
  • 三种失败不混成一种:空名字(没说名字)、空清单(没有「这几场」可问)只报 err、不回话也不写 0x230;只有「有清单、说了名字、但点不到」才反问;
  • 命中路径一字未改:回执「好,<名字>,接着聊。」与换场照旧,第 59 环的硬证据逐位复现。
清单 4 场:0xA1 记一笔 / 0xA4 家里的事 / 0xA5 查资料 / 0xA6 跑步计划
说「买菜」(6 字节)→ 扫 4 场 × 24 字节,全不等
排 0x230:没找到,是四场吗?   (30 字节 + 6 空格)
NP_ANSWERED=1  NP_OK=0  NP_ERR=1  NP_SID=0  NP_CNT=4  NP_NCMP=4
sx_start 不发 → SX_CUR 仍 0xA6

软硬接口。点名牌上新增只读探针 NP_ANSWERED(0xED4);新观察点 SCREEN36(0xEF4)。ISA 一位没动——还是那条 npu.name,只是它现在对「没找到」也有话说。空名字 / 空清单的旧行为保留,0x230 不被改写(屏幕不闪)。

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

协同仿真 tb_min_soc60:接着第 59 环的四场会话往下跑:

  • 说「买菜」(清单外) → NP_ANSWERED=1 / NP_ERR=1 / NP_OK=0 / NP_SID=0 / NP_CNT=4 / NP_NCMP=4 / NP_BYTES=36;0x230 九字与「没找到,是四场吗?」逐位相同;SX_CUR 仍 0xA6——没换场;
  • 说半个名字「查」 → 同样不换场,但这次有回话(第 59 环这里是沉默);w4 里的「四」证明场数来自活清单;
  • 说全名「查资料」 → 照旧命中 0xA5、NP_NCMP=2,回执 9 字与第 59 环逐位一致——叫对了没被改坏;
  • 空名字 → answered=0 / ncmp=0、0x230 仍是命中回执(没说名字 ≠ 叫错名字);
  • 删一场(3 场)再说「买菜」 → 反问变成「没找到,是三场吗?」——场数跟着活清单走,不是写死的;
  • 删光 → cnt=0 / answered=0,0x230 保持上一句「三场」,不闪屏;
  • NP_CORE=0:从头到尾核没写一个点名页配置寄存器。
SCREEN36 = 0x0404011E
场数 4 | 比过 4 场 | answered 1 | 30 字节

主通路 SCREEN=0xF905FD04、SCREEN2~35 与第 25~59 环逐位一致——这一环只在「没找到」这条路上加了一句回话,计算面一字未动。单元仿真 tb_name_pick60(没找到也回话 / 场数随清单 / 空名空表不回话 / 命中不变 / 可复现)通过;tb_riscv_core / tb_rename_sess / tb_forget_sess / tb_boot_greet58 / tb_greet_pick / tb_sess_list 与 tb_min_soc58 复跑通过(递增不推翻)。

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

「对话即界面」最怕的不是答错,是没反应。人跟人说话,叫错名字对方也会回一句「你叫谁?」;手机只有一个 AI 对话窗口,它就该这样。

这一环让 AI 在没听懂的时候仍然接住话:不换场、不乱猜,只诚实地反问。用户听到「没找到,是这四场吗?」,就知道自己还在对话里,而不是对着一块黑屏说话。