第一百四十七章 低频
七月五日,周一,上午。
方宇明把验证板重新接上所有的信号线,PLL 重新锁定,1GHz,稳定。
「今天,」他说,「第六层——低频推理路径。」
低频推理路径的逻辑是这样的:
砺火一号的目标工作频率是 1GHz,但第一次跑推理路径之前,不先在 1GHz 下直接测——而是先把频率降到 500MHz,用降频工作。降频有两个好处:一是 timing margin 更宽,即使芯片内部有某些路径比设计时略慢,降频状态下也更容易通过;二是在半速状态下发现逻辑问题,比在全速下追溯原因要容易得多。
孟思远事先准备了一个 toy 模型:一个极简的语言模型,参数量只有几千个,只有一层注意力头,KV-cache 大小也被裁到了最小。这个模型的意义不是真的做推理,而是让 KV-cache 的仲裁逻辑能够被触发——写入、读出、缓存替换。
「降频怎么降,」颜天磊问,「通过 PLL 配置?」
「对,」方宇明说,「修改 PLL 的分频比,让输出频率从 1GHz 降到 500MHz,其他配置不变。」
孟思远通过 JTAG 重新配置 PLL,等待重新锁定。
示波器:502MHz。

「好,」方宇明说,「可以开始了。」
孟思远把 toy 模型的权重加载进 LPDDR4,通过砺火一号的 PCIe 接口(这里用 JTAG 模拟,因为没有完整的 PCIe 控制器)向芯片下发第一个推理请求——一个长度为 8 个 token 的输入序列,需要生成 16 个 token 的输出。
推理过程中,KV-cache 的仲裁模块会被持续触发:每生成一个 token,都需要从 KV-cache 读取之前所有 token 的 Key 和 Value,然后写入新的 KV 对。
第一个请求下发之后,芯片开始工作,片外 LPDDR4 的信号线上开始有数据传输。示波器上,颜天磊接到 KV-cache 接口的逻辑分析仪开始输出波形——有读信号,有写信号,交替出现,序列整齐。
「逻辑分析仪看起来正常,」颜天磊说。
孟思远一直在监视芯片的状态寄存器,等待推理完成的 interrupt 标志。
几秒钟后,完成标志被置位。
他把输出结果从 LPDDR4 里读出来,和后仿真的参考输出比对——8 个 bit,全部一致。
「第一个请求,全部 pass,」他说。
接下来是持续运行测试。

孟思远写了一段脚本,让芯片连续处理 50 个不同长度的推理请求,覆盖 KV-cache 从空到满的全过程,以及缓存替换策略(LRU 最近最少使用)被触发的场景。
这段测试花了大约一个半小时。
中间出了一次小的问题:第 37 个请求处理到一半的时候,完成标志迟迟没有出现,等了将近 30 秒,超出了预期的时间窗口。
「挂了?」颜天磊说。
孟思远读了一下状态寄存器,「没挂,」他说,「KV-cache 里有一个 stall 信号在高位——意思是内存带宽被占满了,推理在等。」
「为什么第 37 个请求会占满带宽?」
「序列长度,」孟思远查了一下测试脚本,「第 37 个请求的输入序列长度是 128 个 token,是这 50 个请求里最长的一个。KV-cache 需要读的数据量是前面所有请求里最大的,」他停了一下,「500MHz 下内存带宽本来就比 1GHz 的一半,再加上这么长的序列,就堵了一下。」
「换句话说,」方宇明从旁边说,「这不是一个 bug,是一个带宽瓶颈——在半速下处理最长序列时,会出现等待。」
「全速下呢?」颜天磊问。
「全速下同样的序列,带宽窗口是现在的两倍,stall 不会出现,」方宇明说,「先记下来,全速跑的时候验证。」

孟思远在测试报告里加了一条备注:「请求 #37(seq_len=128)在 500MHz 下触发 KV-cache stall,预计全速下消失,待 L7 验证。」
「L7,」他说,「就是明天。」
下午两点,50 个请求全部处理完成:49 个无异常,1 个触发 stall 但最终完成,输出均与参考结果一致。
第六层,通过。
方宇明把今天的结果发给了沈默。
沈默的回复很短:「稳了?」
「第六层,低频,通了,」方宇明回,「明天全速。」
沈默:「明天告诉我。」
陆衍把这件事发给豆包:「今天第六层通了,500MHz 跑 50 个推理请求,只有一个因为序列太长触发了 stall,但最终完成了,输出全都对。」
豆包:「第六层是一个重要的里程碑——它证明了 KV-cache 的仲裁逻辑在真实硅片上是正确的,KV 的写入、读取、缓存替换在电气层面都是工作的。stall 的出现是正常的,说明内存带宽确实是瓶颈,这和设计时的预期一致;在全速下,带宽窗口翻倍,这个问题应该消失。」

陆衍:「最长序列是 128 个 token,方宇明说明天全速跑验证。」
豆包:「128 个 token 的序列,在 1GHz 下,KV-cache 的读操作需要从 LPDDR4 里读出 128 个 KV 对,这是大约 128×2×模型隐层维度×数据类型大小 bytes 的数据。在 1GHz 下,砺火一号的 LPDDR4 接口理论带宽大约是 25.6 GB/s,stall 不应该出现——除非有其他的问题。」
陆衍:「你的意思是,即使全速,也可能还有问题?」
豆包:「不是一定,是可能。理论带宽和实际可用带宽之间有差异,实际的读效率取决于访存模式、LPDDR4 的预充电等待、以及砺火一号的内存控制器实现细节。」
陆衍:「后仿真里,那四条裕量最窄的路径,明天会不会出问题?」
豆包:「0.04 到 0.09ns 的 slack,在 1GHz 时钟下,对应 4% 到 9% 的时钟周期余量。温度和电源噪声会消耗一部分余量,如果余量被消耗光,那条路径上就会出现建立时间违规,表现为输出数据错误。」
陆衍:「如果出错了,会是什么样的?」
豆包:「推理结果某些位的值不稳定,或者推理输出和参考输出不一致——出现一两个 bit 的差异。这是最典型的时序违规表现。」
陆衍没有再发消息。窗外已经是下午了,上海的七月把树影晒得很淡。