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

本环:从「点得进去」到「也删得掉」

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

第 54 环让用户「点一场就切过去」,会话第一次能进得去。可聊完的那一场还在:占着一个数据槽、留在清单里、开机问候照样数它。软件要删掉它,得自己查清单第 N 条 → 取会话号 → 发 free → 再发 list 重排清单 → 改问候,四五件事又落回核手里。

手机上的对话本来就有始有终。用户说「这场不用留了」,AI 该当场把它收掉:槽位释放、清单少一条、下次开机不再数它。这一环把「删掉一场」也收进芯片——一条 npu.forget 序号,剩下的全由硬件走完。

② 实现(做了什么)

新增 rtl/forget_sess.sv 删掉一场引擎。一条 start 之后,它按顺序做六件事:

  • 读清单:从会话记忆区 0x1C0 读表头(人数),再读第 idx 条的 {槽号[31:29], sid[15:0]} 和字数;
  • 解会话号:序号是清单的紧凑序号(1 起),不是槽号——槽号可以稀疏,所以「删第 2 场」删的是排第 2 的那一场;
  • 排回执:词表在芯片里,「好,这场删掉了。」 8 个汉字 = 24 字节 = 6 个字,整行写进对话窗口缓冲区 0x1D0——用户马上看到一句话;
  • 让目录释放槽位:向第 49 环的槽位目录发 free(cmd=4)——目录项作废、该槽数据清零、used - 1;删的若是「上一场」,表头里的 last 记录一并清掉;
  • 让目录重排清单:再发 list(cmd=7)——被删的那场从清单里消失,后面的场次自动补位,空位写 0 不留残影;
  • 通知开关场:发一拍 forget 脉冲带出被删的会话号。删的若是当前这场,sess_switch 的当前指针当场清 0——不能留一个指向已释放槽的「当前场」,否则下次 leave 会把它归档回一个已经释放的槽,已删的名单会重新长回来。
删第 2 场 → 好,这场删掉了。
           清单 3 → 2(第 3 条补到第 2 条)
           目录 used 3 → 2,槽数据清零
删当前场 → 当前指针清 0(不是悬空指针)
删第 0 场 / 越界 / 空清单 → ok=0 / err=1,什么都不动

ISA 化。第 43 环开的 custom-1 八个 funct3 已经用满(pool/step/generate/chat/sess/boot/list/pick),这一环开新主 opcode custom-2(1011011):funct3=000 是 npu.forget rs1(rs1 = 第几场,1 起)。前 54 圈的编码一位不动。npu.rd 新增 sel=34/35/36:删完还剩几场 / 被删的会话号 / {槽号, ok, err}。

软硬接口。删除入口接在接话页 0xF00 之后(0xF50):FS_IDX / GO / BUSY / DONE / OK / ERR / SID / SLOT / WORDS / CNT / BYTES / W0..W5 / RST / SCREEN31 / FS_CORE。删除引擎是会话记忆区的第五个写主(fs > gp > bg > ss > arc),且严格串行:先写回执、再 free、再 list——回执先落盘,用户先看到一句话。

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

单元仿真 tb_forget_sess:配真 sess_slots 目录与同口内存,三场会话分别住在稀疏的槽 0 / 2 / 5(槽号与紧凑序号刻意不同)。删第 2 场 → 解出 0x92/槽 2/16 字,回执 24 字节逐位对上;目录项作废、槽数据清零、used 3→2;清单 3→2,0x93 从第 3 条补到第 2 条、槽号仍是 5、空位全 0。删 0 / 越界 / 空清单都只报 err。删的正是 last 场时,表头 last 记录清掉,只留 stamp 低 8 位。

协同仿真 tb_min_soc55:接着第 54 圈的状态(三场 0x91/0x92/0x93、当前 0x93、Y93 已算出)往下跑:

  • 一条 npu.forget 2:FS_SID=0x92 / FS_SLOT=1 / FS_BYTES=24 / FS_CNT=2,清单重排成 0x91 / 0x93,SS_USED=2;0x1D0 读回「好,这场删掉了。」;
  • 删的不是当前场:SX_CUR 仍是 0x93,跑整网仍等于 Y93——删别的一场没有动当前上下文;
  • 一条 npu.pick 2:第 2 条现在补成了 0x93(0x92 已从清单消失),PK_SID=0x93 / PK_SLOT=2,问候换成「好,接着第二场。」;
  • 一条 npu.forget 2(删的正是当前场):FS_SID=0x93,SX_CUR 当场清 0、SX_STATUS.cur_valid=0,SS_USED=1——当前指针不是悬空的;
  • 一条 npu.forget 1:删最后一场 0x91 → 清单 0 条、used=0;
  • 空清单再点 1 / 删 0 / 删 2:只报 err,不换场、不改目录;全程 FS_CORE=0、SX_CORE 没涨、PK_CORE 没涨。
SCREEN31 = 0x0292DD55
删完剩 2 场 | 第一次删掉的会话号 0x92 | 证据 DD | 55

主通路 SCREEN=0xF905FD04、SCREEN2~30 与第 25~54 环逐位一致——这一环只加了一条「删除 + 清单重排」通路,计算面一个字没动。

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

会话这条线到这里第一次有始有终:存在(槽位)→ 记得(开机续聊)→ 说得清(清单)→ 说得出话(问候)→ 点得进去(接话)→ 也删得掉(删除)。

对用户来说,这不是一个「删除按钮」,而是一句自然的话:「这场聊完了,不用留了。」AI 接住这句话,硬件把槽位、清单、问候、当前指针一起收干净——下一次开机,它真的不在了。