第 69 环 · 开口带名字(先说「<名字>,咱们接着聊」)
第 68 环让接回之后 AI 先开口,可第一句只看归档摘要——它不知道自己在跟谁说话。用户点名「跑步计划」找回一场没聊完的对话,屏幕上第一句却是没有称呼的罐头话,像换了个人。
这一环在「先开口」之前加一步「叫名字」:名字格在会话记忆里(第 56/57 环改名时落进去的),按当前槽自己读出来,拼成「<名字>,咱们接着聊。」落进对话窗口,再让整段生成接着说。
名字从内存读,不让软件填。接回成功(resume_done && ok && mem_ok)后,resume_speak 先按会话开关场的 cur_slot 发 6 拍同步读,取名字格 0x200 + 槽×6(6 字 = 24 字节 UTF-8):
,咱们接着聊。」(后缀 7 个汉字 = 21 字节),定长 48 字节 / 12 字,连写 12 拍落 0x1E0(与开机问候同一个对话窗口,新的覆盖旧的);named=0 如实报;npu.generate 完全同一条通路),先开口的下一句照旧从刚恢复的记忆里长出来;pending 仍补接回落忙那一拍;每次接回只说一次。接口。探针接在第 68 环页后:RS_NAMED(0xA8C)、RS_BYTES(0xA90)、RS_SLOT(0xA94)、RS_LINE0..RS_LINE11(0xA98~0xAC4),屏摘要 SCREEN44(0xAD0) / SCREEN45(0xAD4)。前 68 圈地址映射一字不改;ISA 一位没动(仍 npu.undo)。会话记忆区新增第七个写主,优先级 rsp > ud > np > rn > fs > gp > bg > ss > arc。
单元仿真 tb_resume_speak69(真同步 SRAM 行为模型):
mem_ok=0)→ 不读名字、不写窗口、不开口,但照样落 done;named=1 / bytes=33 / slot=2,0x1E0 十二字与「跑步计划,咱们接着聊。」逐位相同;bytes=18 / named=0;bytes=27,后缀紧接第 6 字节,不留空洞;done 保持高不重复,下一次接回才说第二句;clear 归零。ISA 协同仿真 tb_isa_resume69(真整颗 SoC):0x92 在槽 2(名字「跑步计划」,摘要 76CA6F0E),0x93 在槽 1(名字「工作」,摘要 85955090)。程序各走一遍 npu.forget → npu.undo → npu.wait:
spoke=1,RS_CORE=0(核一个生成入口都没写);SCREEN44=0x243:槽 2 / 33 字节 / named=1;SCREEN45=0x137:槽 1 / 27 字节 / named=1;spoke 时快照 0x1E0,十二字等于「跑步计划,咱们接着聊。」;最终 0x1E0 等于「工作,咱们接着聊。」;A_PROMPT=2 / B_PROMPT=0,各自取自归档摘要低位;程序走到 SCREEN=0x69,两次 npu.wait 都没冻死。回归:tb_isa_resume68、tb_isa_undo67、tb_min_soc64 复跑 RESULT=PASS,主通路 SCREEN=0xF905FD04 与第 25~68 环逐位一致(计算面一个字没动)。第 68 环的单元 tb_resume_speak 断言的是旧时序(接回后立刻 gen_start),已被本环「先读名字再落屏」取代,留作历史快照,不再随最新 RTL 复跑。
只有一个对话窗口的手机,不该让用户猜「它知不知道我是谁」。接回一场没聊完的对话,第一句先叫名字,是把记忆变成称呼——名字在清单里、记忆在环里,两者在同一句里收口。
更重要的是:这句话不是 OS 拼的固定问候。硬件按当前槽去名字格取字、数长度、拼后缀、落窗口,核一个 MMIO 都没写。名字是数据,找名字、叫名字是硬件的事。
开口不叫错人。名字格是按槽放的,不是按会话。槽一旦被新会话复用,旧会话再被撤回接回,硬件读到的可能是别人的名字。下一环让名字跟着会话走:槽换人,开口也不叫错。