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

本环:救回来之后,接着上次那句说下去

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

第 65/66 环把删错的那一场救回来了:目录项写活、名字格写回、清单重排,还念出「好,跑步计划回来了。」

可救回来的只是目录上的一场。删除时当前指针被清,片内 K/V 环里的上下文也早已被后来的会话覆盖——用户接着说「那明天呢」,AI 像第一次见面。名字回来了,记忆没回来。

这一环让撤回顺手把这一场重新开进场:归档里的 K/V 回到片内环,当前场指针接回去。下一句真的接着上次那句。

② 实现(做了什么)

一条接力,不混语义。撤回引擎只认「垃圾记录 + 槽位目录」,开关场引擎才认「K/V 归档」。这一环不把两件事硬绑在一起,而是新增一条接力 rtl/resume_link.sv:

  • 只认撤回引擎的 restored 单拍脉冲(不认 done 高电平,避免一次撤回被反复接力);
  • 等撤回引擎整个跑完(回执写完),再向会话开关场引擎发一条 enter(cmd=1,会话号取撤回引擎解出来的那一场);
  • 进场走的是与 npu.sess enter 完全同一条通路、同一份归档格式:目录查槽 → 归档引擎按时间序把 K/V 追加回环 → 当前场指针接上;不另造一套加载逻辑;
  • 收下 enter 的账:mem_ok=1 表示真读回了旧上下文(空场也允许进场,但 mem_ok=0 必须如实报出),words=恢复的载荷字数,cur_sid/cur_valid=现在在场里;enter 失败如实置 err,不静默。

忙闲没有缝。继电器的 busy 在 restored 那一拍之后立刻拉高,一直覆盖「等撤回收尾 + 进场」整段;npu.wait 不会在撤回完成、进场还没开始的那一拍把 NPU 看成空闲。

接口。会话开关场仍走同一扇门(sx_start/sx_cmd/sx_sid),继电器只是多一个请求主;新增只读探针接在 0x980 撤回页后面:UD_RESUME(0x9AC)、UD_MEMOK(0x9B0)、UD_KVW(0x9B4)、UD_CUR(0x9B8)、SCREEN42(0x9BC)、UD_RLERR(0x9C0)、UD_CURV(0x9C4)。ISA 一位没动,仍是 npu.undo。

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

单元仿真 tb_resume_link(开关场替身按拍忙闲):

  • A. 撤回成功 → 只发一条 enter(cmd=1 / sid=0x92)→ 收下 ok=1 / mem_ok=1 / words=16 / cur_sid=0x92 / cur_valid=1;
  • B. 撤回失败(undo_ok=0)→ 一条 enter 都不发,err=1 如实报出;
  • C. 空上下文(enter 成功但 mem_ok=0)→ 照常进场,但 mem_ok=0 不假报;
  • D. clear 把探针/状态归零。

ISA 协同仿真 tb_isa_undo67(真整颗 SoC):三场 0x91/0x92/0x93,0x92 在槽 2、基址 0x80,里面存着合法的 4 条 K + 4 条 V(表头 SALT、摘要、16 字载荷)。程序 npu.forget 2 → npu.wait → npu.undo → npu.wait:

  • 撤回成功,续聊进场成功:UD_MEMOK=1 / UD_KVW=16 / UD_CUR=0x0092,当前场有效;
  • CONV_KVTOT=0x0404:层 0 与层 1 各 4 条,旧上下文真回到片内环(不是空场);
  • 再跑一步 npu.step token=1 layers=2 → CONV_KVTOT=0x0505:新一句是接着旧上下文长出来的,不是从 0 开始;
  • 归档表头首字(删除时被清)已写回 SALT,目录项写活,程序走到 SCREEN=0x67,两次 npu.wait 都没冻死。
RESULT=PASS
撤回 → 自动进场 → mem_ok=1 / 16 字上下文 → 下一步 5|5

回归:tb_undo_del66、tb_undo_del(第 65 环老契约)、tb_isa_undo66、tb_isa_undo、tb_min_soc64 全部复跑 RESULT=PASS;主通路 SCREEN=0xF905FD04 与第 25~66 环逐位一致(本环只在撤回尾部加一条进场接力,计算面一个字没动)。

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

只有一个对话窗口的手机,「撤回」不能只是把一行字塞回清单——用户要的是接着说。说「撤回」,AI 回「好,跑步计划回来了。」,然后用户接「那明天呢」,AI 记得上次聊到哪、明天指什么。名字回来、记忆也回来,这一场才算真的回来。

这一环把「续聊」也做进了接口契约:撤回引擎管「这一场回到清单」,继电器管「这一场回到对话」,两段各自可单测、又在一条 npu.undo 里闭合。OS 仍然不读垃圾记录、不搬 K/V、不发第二条指令——芯片把现场收好,也把话接上。