第一百四十八章 全速
七月六日,早上八点半。
B207 平时这个时间不会有人,但今天颜天磊已经在了,方宇明也比平时早了半小时。
「第七层,」孟思远把 checklist 翻到最后一页,「全速推理路径。」
今天是最后一层。
PLL 重新配置回 1GHz,等待锁定,示波器确认,1000.1MHz。
孟思远准备了两套测试序列。第一套是昨天的 50 个请求,原封不动地在全速下再跑一遍——主要是验证 stall 问题消失;第二套是一个更大的测试集,共 500 个请求,覆盖了所有在后仿真里标记为「临界路径覆盖」的功能场景,以及孟思远额外设计的一些边界 case。
第二套里,有 47 个场景是专门为了触发那四条裕量最窄的路径设计的——访问模式、序列长度、缓存状态,都被设计成最容易让那四条路径在 setup time 上承受压力的情况。
方宇明没有说这些,但 B207 里的人都知道。
上午十点,第一套测试开始。
50 个请求,包括昨天触发 stall 的第 37 个(seq_len=128),这次全速下没有 stall,全部完成,输出全部与参考一致。
「全速带宽够,stall 不再复现,」孟思远记录,「L6 遗留问题:关闭。」
方宇明:「开始第二套。」
第二套 500 个请求,从早上十一点开始跑。

前 100 个,全部 pass。
孟思远盯着屏幕,每十个请求汇报一次。「120 pass。」「150 pass。」「200 pass。」
贺志明在旁边坐着,翻着手账,偶尔看一眼屏幕。
到 250 个,全部 pass。
「表现比我预期的好,」颜天磊说,「我以为会早一点出问题。」
「也许不会出,」孟思远说。
「那也挺好的,」颜天磊说,但语气里有一点不确定。
300 个,pass。
方宇明没说话,但他把原本靠在椅背上的姿势改成了往前,手肘放在桌上。
第 301 个请求。
孟思远把请求下发之后,等待完成标志。
时间比正常的稍微长了一点。完成标志出现了,但孟思远读取输出结果,拿到参考值对比——

「有差异,」他说,「第 301 个,output bit 19,值应该是 1,实际是 0。」
B207 里安静了一秒。
「只有一个 bit?」方宇明问。
「只有一个,」孟思远说,「其他 63 个 bit 全部正确。」
「哪个请求场景?」
孟思远查了一下,「这个是测试集里为覆盖临界路径专门设计的第 23 个 case,」他说,「我知道它对应的是哪条路径。」
他在屏幕上打开了一个文件,翻到第 23 个 case 的注释:「覆盖目标:KV-cache 读仲裁路径 #3,后仿 slack = 0.04ns,最窄。」
「0.04ns,」颜天磊低声说,「就是这条。」
方宇明靠回椅背上,「先确认这不是测试脚本的问题,」他说,「把这个请求再跑一遍。」
孟思远重新下发第 301 个请求——这次 bit 19 是 1,正确的。
「偶发,」孟思远说,「不是每次都错。」
「时序违规,」方宇明说,「如果是 setup time 违规,错误会是概率性的——在大多数情况下,数据能赶上时钟沿;在某些情况下,比如温度高了一点、电源噪声大了一点,margin 耗光了,数据没赶上,采到了错误的值。」
「怎么处理?」颜天磊问。

方宇明想了一下,「几种方法。第一:降频,把工作频率从 1GHz 降到 950MHz,margin 变宽,这条路径应该能通过。第二:调电压,把内核电压从现在的 1.001V 往上调,增加 CMOS 逻辑的驱动能力,让这条路径跑得更快。第三:接受它,标注这是一个已知的 timing marginal 路径,在产品层面做软件规避——比如限制触发这个特定访问模式的频率,或者增加重试机制。」
「三种方法,现在先做哪个?」孟思远问。
「都试,」方宇明说,「今天先试电压,看看能不能靠电压把这条路径推过去。」
杜磊把 LDO 的输出电压从 1.001V 调到了 1.05V,偏高了大约 5%,在芯片规格的上限(1.1V)以内。
第二次跑第 301 个请求,bit 19:正确。
第三次:正确。
连跑了二十次,全部正确。
「电压提高,timing margin 恢复,这条路径通了,」方宇明说,「继续跑剩下的 200 个请求。」
剩下的 199 个请求,全部 pass。
500 个请求,只有第 301 个在标准电压(1.001V)下出现了一次偶发的 bit 错误,在提高内核电压到 1.05V 之后消失。
方宇明把结果整理成一份报告:
「砺火一号 bringup 第七层(全速推理路径)结果:500 个测试请求中,499 个在标准条件下全部 pass;1 个(#301)触发 KV-cache 读仲裁路径 #3 偶发 timing 违规,slack 后仿预测 0.04ns,在内核电压 1.001V 条件下出现。调整内核电压至 1.05V 后,该路径在连续 20 次重复测试中全部通过。七层 bringup checklist 全部完成。」

写完这份报告,方宇明把它存进文件夹,合上电脑,在椅子上靠了一下。
「第一款砺火一号,」贺志明说,「bringup 完成了。」
「第一轮,」方宇明说,「有一条路径需要超压工作,这是一个已知问题,后续版本修。」
「但功能是对的,」贺志明说。
「功能是对的,」方宇明重复,「KV-cache 工作,推理路径工作,除了那一条 timing marginal 的路径需要超压——其他一切都在预期范围内。」
陆衍当天晚上发给豆包:「第七层通了,但第 301 个请求有一个 bit 错误,对应后仿 slack 最窄的那条路径(0.04ns)。电压提高到 1.05V 之后消失了,方宇明说砺火一号 bringup 完成。」
豆包:「这个结果是可以接受的。0.04ns slack 在真实芯片上出现 timing 违规是完全符合预期的——工艺偏角、温度、电源噪声的叠加效应,消耗了这 0.04ns 的 margin。超压 5% 把 CMOS 的翻转速度拉回来,让路径的实际延迟缩短到 timing 允许的范围内。在产品级芯片上,这种路径会在下一个版本里通过调整布局或者插入缓冲器来修复。」
陆衍:「方宇明说「功能是对的」。」
豆包:「功能是对的,这是今天最重要的一句话。砺火一号实现了设计目标:在真实硅片上,KV-cache 的仲裁逻辑行为正确,推理路径工作。超压这件事,在工程上是可以解决的,也是在预期内的。」
陆衍:「接下来,沈默的集群。」
豆包:「是的。下一步是在沈默的张江推理集群里,把砺火一号装进真实的推理服务器,在真实的推理任务上测延迟和吞吐量——bringup 只是证明芯片能工作,集成测试才是证明它有用。」
陆衍放下手机。B207 的灯还开着,验证板在防静电垫上,砺火一号在 1.05V 内核电压下,稳稳地跑着。