🎯 圆心 · 目标(每环都从这里出发)
造一台 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 续聊先开口 · 69 开口带名字 · 70 开口不叫错人 → 71 开机问候也认人

本环:名字跟会话走,槽换人不叫错

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

第 69 环让接回之后先叫名字,可它读名字格只按槽号:0x200 + 槽×6。名字格是按槽住的,槽却会被别的会话复用——旧会话删掉、新会话住进同一个槽,格子里可能还留着上一任的名字;更隐蔽的一条链是:槽被轮转换掉时名字格没清,下一次删除把旧名字拍进垃圾记录,撤回又把旧名字写回来,一接回就叫错人。

这一环给名字加一张归属表:名字格只说明「这个槽叫什么」,归属表才说明「这个名字是谁的」。开口之前先验归属,对不上就宁可少叫一声,也不叫错人。

② 实现(做了什么)

名字与会话号绑定。会话记忆区新增归属表 OWNER_BASE = 0x280 + 槽号,一格一字 = 这一槽名字所属的会话号:

  • 改名时写归属:rename_sess 写完 6 字名字格后,多写一拍归属 = 这一场的 sid;回收没用到的槽时,名字格和归属一起清;
  • 删除时拍快照:forget_sess 清名字之前先读归属,把名字 6 字 + 归属一起写进垃圾记录(13 字 → 14 字);删完把归属清掉,槽空了就不属于任何人;
  • 撤回时原样还:undo_del 多读一字归属,名字写回后把归属也原样写回——撤回不伪造归属,旧名字仍然是旧主人的;
  • 开口前验明正身:resume_speak 读完 6 字名字格,再发一拍同步读归属(发地址 → 空一拍 → 收数据);归属 == 这次接回的 sid 才拼「名字 + ,咱们接着聊。」;对不上就把名字寄存器清零,退回「咱们接着聊。」18 字节,named=0 / bind=0 如实报;
  • 忙闲与落屏顺序不变:读名字 → 验归属 → 拼句 → 连写 12 拍落 0x1E0 → 再发同一台整段生成引擎;每次接回只说一次。

接口。新增只读探针 RS_OWNER(0xAD8)、RS_BIND(0xADC),屏摘要 SCREEN46(0xAE0);前 69 圈地址映射一字不改,ISA 一位没动(仍 npu.undo)。名字归属是第 70 圈新增的存储语义,名字格布局一字未动(仍 6 字/槽)。

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

单元仿真 tb_resume_speak70(真同步 SRAM 行为模型):

  • 空场(mem_ok=0)→ 不读名字、不写窗口、不开口,但照样落 done;
  • 槽 2「跑步计划」+ 归属 0x92,接回 0x92 → named=1 / bytes=33 / bind=1,0x1E0 十二字与「跑步计划,咱们接着聊。」逐位相同;
  • 槽 3 名字格残留「工作」、归属却是 0x91,接回 0x93 → named=0 / bytes=18 / bind=0,屏幕是「咱们接着聊。」不是「工作,咱们接着聊。」(不叫错人的硬证据);
  • 槽 0「工作」+ 归属 0x94,接回 0x94 → named=1 / bytes=27 / bind=1(归属对上照旧叫名字,不是一刀切);
  • done 保持高不重复,clear 把归属探针一起归零。

ISA 协同仿真 tb_isa_resume70(真整颗 SoC):0x91 在槽 0;0x92 在槽 2(名字「跑步计划」,归属 0x92);0x93 在槽 3(名字格残留「工作」,归属 0x91——上一任留下的)。生成权重沿用第 27~44 圈那一份:

  • 先 npu.forget 3 → npu.undo → npu.wait:0x93 接回,归属对不上 → 不叫名字;SCREEN44=0x324(槽 3 / 18 字节 / named=0);
  • 再 npu.forget 2 → npu.undo → npu.wait:0x92 接回,归属对上 → 叫「跑步计划」;SCREEN45=0x243(槽 2 / 33 字节 / named=1);
  • SCREEN46=0x01920091:{A_bind, A_owner, B_bind, B_owner} = {1, 0x92, 0, 0x91},归属证据全由硬件自报;
  • 第一次 spoke 快照 0x1E0 = 「咱们接着聊。」;最终 0x1E0 = 「跑步计划,咱们接着聊。」;
  • 两场都 spoke=1、RS_CORE=0(核一个生成入口都没写);程序走到 SCREEN=0x70,两次 npu.wait 都没冻死。
RESULT=PASS
槽 3 归属 0x91 ≠ 0x93 → 不叫名字 · 槽 2 归属 0x92 → 叫「跑步计划」

回归:tb_resume_speak69 / tb_isa_resume69 / tb_isa_resume68 / tb_isa_undo67 / tb_isa_undo66 / tb_undo_del66 / tb_rename_sess / tb_forget_sess 复跑 RESULT=PASS;tb_min_soc64 主通路 SCREEN=0xF905FD04 与第 25~69 环逐位一致(计算面一个字没动)。第 69 圈的单元/协同测试补上了归属格(表示那几场确实改过名),断言全部照旧。

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

只有一个对话窗口的手机,记错人比记不住更伤人。上一环把记忆变成称呼,这一环给称呼加上「这是谁的名字」——槽可以复用、数据可以覆盖,但名字不会跟着槽跑到别人身上。

这也是软硬协同该有的分寸:软件不查表、不比对、不兜底;归属表在内存里,验归属在硬件里,开口前那一拍就把人认准了。