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

本环:把「还有呢」接成下一页

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

第 74 环让「那两场呢?」有了答案,可一页最多念三场,第四场以后只用一个「等」字带过。用户听完自然接一句「还有呢?」——软件仍得自己记住念到哪、重新扫清单、跳过已念过的场、再拼一句。

这一环把「翻页」接住:同一条 npu.rem 引擎带着跨页状态,cont=1 从上次停下的地方接着念;第二页起句首改成「接着还有」,页末如实报「还剩几场」;全念完后再问,就回一句「都念完了。」

② 实现(做了什么)

引擎里加一张 16 位「处理过」位图 pg_mask。按清单条目号置位(不是槽号——槽会被复用),念过的场、归属对不上的场、名字格全 0 的场都标为已处理。续页重扫清单时,已处理的条目直接跳过,不会重复念,也不会被一个念不出名字的场永远卡住。

页状态留在片上。pg_page / pg_left / pg_tspoke / pg_finished / pg_cur:页号、本页后还剩几场、累计念了几场、是否已念完、这一串问句锚定的当前会话号。新问句(cont=0)全部清零;续页时若当前场换了,也按新问句重来,不拿旧页上下文。

句子换头、尾巴按剩余量决定。第一页「还有」,第二页起「接着还有」12 字节;名字之间仍是「、」,一页最多三个名字;本页后还有能念的场就补「等。」,否则只补「。」。最长 12 + 3×(3+12) + 6 = 63 字节,仍塞得进 64 字节一行。

退路多一条。续页时已经没有可念的场 →「都念完了。」15 字节(ok=0 / err=1),不再重复名字;第 74 环的两条退路(「没有别的场了。」/「还有N场,没起名字。」)原样保留。

ISA 再省一条。新增 npu.rem.next(custom-2 funct3=101,机器码 0x0000505B),与 npu.rem 共用同一条引擎;前 74 圈编码与地址映射一位不动。MMIO 侧新页 0xB00:RP_NEXT 续页、RP_RST2 清翻页状态、SCREEN51,只读 RP_PAGE / RP_LEFT / RP_TSPOKE / RP_CONTUSED / RP_FINISHED。

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

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

  • 第 1 页「还有工作那场、查资料、跑步计划等。」→ page=0 / pg_left=4 / pg_tspoke=3;
  • 第 2 页「接着还有读论文、家里的事、学英语等。」→ page=1 / pg_left=1 / pg_tspoke=6 / contused=1;
  • 第 3 页「接着还有买机票。」→ page=2 / pg_left=0 / pg_tspoke=7 / finished=1;
  • 再续一页 →「都念完了。」ok=0 / err=1,一个名字都不重复;
  • 新问句 cont=0 清零重来;cont=1 但当前场换成 0xBB → 按新问句从第 0 页重来;
  • 五个余场里一个归属残留、一个空名字 → 只念可靠的三个、页末不加「等」,两个不可念的场被标为已处理。

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

一条 npu.rem       → 0x1E0「还有记一笔、工作那场、跑步计划等。」51 字节
                     SCREEN50 = 0x00701540
一条 npu.rem.next  → 0x1E0「接着还有读论文。」24 字节
                     page=1 / left=0 / tspoke=4 / cont=1 / finished=1
再一条 npu.rem.next → 0x1E0「都念完了。」15 字节,页号停在 1、累计仍 4
                     SCREEN51 = 0x104C4130 / SCREEN = 0x75

回归:tb_rem_pick74、tb_isa_greet74、tb_isa_greet73、tb_riscv_core、tb_boot_greet73 全部 PASS;第 74 环「那几场呢」与开机问候路径一个字没漂。

✅ 仿真通过 · 本环闭环
单元 + ISA 协同 + 前 74 圈回归;「还有呢」真的能一页一页翻到底
④ 本环的钉子
  • 位图按条目号置位,不按槽号——槽会被复用,按槽记会把新场当成旧场;
  • pg_left 只数「还没处理的余场」,不能沿用 nothers - nspoken:否则归属不符/空名字的场会让翻页永远翻不完;
  • 尾巴「等」要看 pg_left != 0,不能只看「本页念满三场」;
  • 续页时当前场换了必须当新问句重来,否则会把上一场的页状态套到另一场;
  • 新页 0xB00 必须先于 0x900 分支译码(两者都置 bit11+bit8,靠 bit9 区分);
  • 写 SCREEN50 的偏移是 8(a6) 不是 4(a6)——0xAF4 是 RP_DONE,写错会把完成位当屏幕摘要;
  • MMIO 的启动/复位脉冲必须进「每拍默认拉低」块,否则一次写会变成连续重跑。