🎯 圆心 · 目标(每环都从这里出发)
造一台 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 开机问候也认人 · 72 单名问候也验归属 · 73 单名问候带余场 · 74 余场点名 · 75 余场翻页 · 76 翻页带序号 · 77 序号点选也叫名字

本环:点下去,听见的是名字,不是数字

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

第 76 环让每一页报出序号,用户说「第二个」就能切过去。可回执只有一句「好,接着第二个。」——用户刚听完一页名字,点下去却只听见一个数字,还得自己把「第二个」和刚才的「工作那场」在心里对一遍。

这一环让序号点选也念名字:点「第二个」,回「好,工作那场,接着聊。」点的是谁、说的是谁,同一句话。

② 实现(做了什么)

取到号之后,多走两步。name_pick 在「第N个」支路收下第 N 位(会话号 + 槽号)后,先读名字归属表 0x280 + 槽,确认这一格名字确实属于这个会话号;对上了,再读名字格 0x200 + 槽×6(6 字 = 24 字节,零填充)。

回执 = 全名命中那一句。排「好,<名字>,接着聊。」落同一个 0x230,与第 59 环按名字点选逐字节同一格式(6 + 名字字节 + 15,最多 33 字节),写完再走同一条 enter 换场通路。核不读名字、不拼字、不发第二条指令。

宁可报序号,绝不叫错人。归属对不上(槽被复用、名字是上一场留下的)或名字格为空 → 不念旧名字,退回第 76 环的「好,接着第N个。」24 字节;换场照常进行。听见序号只是少一点温度,叫错名字却是事故。

开关保守,老路一字不改。新写口 0xE88 NP_ORDNM(1=序号回执念名字,0=第 76 环老语义);新只读 0xB2C NP_ORDNAME = {named, nlen[4:0]};新观察点 0xB34 SCREEN53。前 76 圈地址映射、ISA 编码一位没动。

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

单元 tb_name_pick77(真同步 SRAM 模型,四场 + 余场序号表 + 归属表):

  • 「第二个」→ 第 2 位 0xA2/slot1,归属对上、名字「工作那场」→ 回执 33 字节,named=1 / nlen=12,换场 0xA2;
  • 「第一个」→ slot0 归属被改成 0xB7(槽复用旧名字)→ 不念,退回「好,接着第一个。」24 字节,换场 0xA1;
  • ord_named=0 → 仍回「好,接着第二个。」,老用例逐位不变;
  • 第 4 位指向的 slot3 名字格清空 → 无名可念,退回「好,接着第四个。」;
  • 回执确实落盘 0x230 起 w0..w8。

ISA 协同 tb_isa_greet77(真整颗 SoC,四场目录,slot0 归属故意留 0xB7):

NP_ORDNM=1
说「第二个」→ 一条 npu.name   → 0x230「好,工作那场,接着聊。」33 字节
                              NP_ORDNAME = 0x20(named=1, nlen=12)
                              SX_CUR = 0xA2
说「第一个」→ 一条 npu.name   → 归属 0xB7 ≠ 0xA1,退回「好,接着第一个。」
                              NP_ORDNAME = 0x00
                              SX_CUR = 0xA1
SCREEN53 = 0x010CA2A1(named|12|0xA2|0xA1)/ SCREEN = 0x77

回归:tb_isa_greet76(第 76 环原程序,SCREEN52 与回执逐位不变)、tb_name_pick64、tb_isa_greet75 全部 PASS。

✅ 仿真通过 · 本环闭环
单元 4 用例 + ISA 协同 + 相邻 3 项回归;「第二个」真的回出了「工作那场」
④ 本环的钉子
  • 状态号溢出 5 位:新状态 30~34 写进 [4:0] 的 st 会回绕成 0~2,仿真里表现为「刚进名字格就跳回 IDLE」;状态机和常量一起加宽到 [5:0],这条坑一次踩透;
  • 归属表按槽号读(0x280+槽),名字格按槽×6 读,两个地址公式不能混;
  • 槽号取自序号表字的 [26:24],不是活清单条目,也不是核传进来的配置;
  • 先验归属再读名字:反过来的话,槽一复用就会把上一场的名字念给这一场;
  • 字节数随名字长度变(21+nlen),落盘仍是整 15 字(空格补齐),别只写前 6 字;
  • 开关默认 0,老程序不写 0xE88 就仍是老回执——回归能逐位对表,靠的就是这条。