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

本环:让每一页自己报出可以点的号

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

第 75 环把「还有呢」一页页翻到底,可用户听完想选其中一场,仍得把名字完整说一遍。名字长、口音重、背景吵的时候,三四个字就是点不出来。

这一环让每一页报序号:「第一个记一笔,第二个工作那场等。」用户只需说「第二个」。序号必须和念出来的顺序一一对应,不能出现「听的是第二个、点的是第三场」。

② 实现(做了什么)

序号 = 余场序列里的位置。跳过当前这场、跳过归属不符或名字为空的场,跨页连续编号。第 0 页从「第一个」起句,第 1 页起加「接着」;带序号一页最多两位——一个「第N个」占 9 字节,64 字节窗口只容得下两位,这是诚实的硬约束,不硬塞。

每页收口写一张「余场序号表」。落会话记忆区 0x2A0:字 0 = 已念出的场数,字 1..6 = {5'b0, 槽号[2:0], 8'b0, 会话号[15:0]},按念出来的顺序排。念的是谁、点的是谁,同一张表,永远不会错位。

点「第N个」不再查活清单。name_pick 新增「第N个」识别(个 = E4B8AA,必须带「第」),读 0x2A0 的第 N 位 → 回执「好,接着第N个。」24 字节落 0x230 → 走与 npu.sess 同一条 enter 通路换场。核不查表、不取号、不拼字。

两个序号各有权威,绝不混用。「第N场」是活清单的紧凑序号(第 62 环),用于点选和删除;「第N个」是余场序列的序号,只对刚念过的那一页负责。混用就会点错人、删错场。

老语义原样保留。num_mode=0 时第 74/75 环一字不改;新写口 0xB20 RP_NUM,新只读 0xB24 RP_ORDCNT / 0xB28 NP_PER,新观察点 0xB30 SCREEN52;前 75 圈地址映射一位不动,ISA 一位没动。

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

单元 tb_rem_pick76(真同步 SRAM 模型,五场、当前 slot0 0xA1):

  • 首页「第一个记一笔,第二个工作那场等。」48 字节 → pg_left=2 / tspoke=2,表 2 条(0xA2 / 0xA3);
  • 续页「接着第三个查资料,第四个跑步计划。」51 字节 → left=0 / tspoke=4 / finished=1,表 4 条;
  • num_mode=0:首页仍三位、不写序号表,第 75 环语义不变;
  • clear:探针与序号计数归零。

ISA 协同 tb_isa_greet76(真整颗 SoC,五场目录、当前 0xA3):

RP_NUM=1 → 一条 npu.boot      恢复 0xA3
一条 npu.rem                  → 0x1E0「第一个记一笔,第二个工作那场等。」48 字节
                               RP digest = 0x00500540 / ORDCNT = 2
一条 npu.rem.next             → 0x1E0「接着第三个跑步计划,第四个读论文。」51 字节
                               ORDCNT = 4
说「第四个」→ npu.name        → SX_CUR = 0xA5(余场第 4 位,不是清单第 4 条 0xA4)
说「第二个」→ npu.name        → SX_CUR = 0xA2,0x230「好,接着第二个。」
                               SCREEN52 = 0x04C0A5A2 / SCREEN = 0x76

回归:tb_rem_pick74、tb_rem_pick75、tb_isa_greet74、tb_isa_greet75、tb_min_soc64、tb_boot_greet73、tb_riscv_core 全部 PASS;主通路 0xF905FD04 与 25~75 环逐位一致。

✅ 仿真通过 · 本环闭环
单元 + ISA 协同 + 相邻 7 项回归;「第四个」真的按念出来的顺序点到了第 4 位
④ 本环的钉子
  • 序号的基数已经有 tspoke_r(每念一场 +1),不能再叠本页 nspoken——叠加会把序号数成 1、3、5;
  • 「第二个」的「二」是 E4BA8C,不能复用「还有两场」的「两」E4B8A4;序数另开 ord_byte,不然会念成「第两个」;
  • 序号表里槽号在字的 [26:24]({5'b0,3bit,8'b0,16bit} 拼接),按 [18:16] 读会恒 0;
  • 「第N个」分支要排在 ord_valid 之前,但 ord_valid 的句末条件(只有「场」或什么都没有)不会误吃「个」;
  • 带序号后一页只有两位,page_cap 必须随 num_mode 变,不能写死 3;
  • MMIO 的 0xB20 与 0xAF0 同页译码,靠 offset 8 区分;新脉冲仍要进「每拍默认拉低」块。