对于启明芯的“启明二号”(Phoenix)项目组来说,是黎明前最后的黑暗,也是冲刺阶段最严峻的考验。设计工作虽然在名义上已经完成,但距离真正能够按下那个象征着“发射”的Tape-out按钮,还有一道道被称为“终极验证”的、极其严苛的关卡需要闯过。
这些关卡,如同芯片设计流程中的“炼狱”,旨在将所有隐藏的、潜在的、可能导致流片失败的“魔鬼”都暴露出来,并彻底消灭。
验证中心的气氛,比之前任何时候都要凝重。工程师们不再有时间闲聊,甚至连去茶水间冲咖啡的脚步都带着风。每个人的屏幕上都运行着不同的验证工具,消耗着海量的计算资源,也考验着工程师们的智慧和耐心。
“全芯片功能仿真(Full-chip Functional Simulation)发现新问题!”负责系统级验证的小组长突然喊道,声音中带着一丝焦虑,“在模拟高负载USB传输的同时,进行复杂的音频解码和文件系统操作时,有极低概率出现数据总线死锁(Deadlock)!”
这个问题如同投入平静水面的一颗炸弹,立刻引起了所有相关工程师的注意。总线死锁是SoC设计中最难调试的问题之一,它往往不是由单一模块的逻辑错误引起,而是多个模块在特定时序和并发请求下,相互等待资源而导致的系统“卡死”。这种错误在模块级仿真中很难发现,只有在全芯片协同工作的仿真中才可能暴露出来。
陈家俊立刻召集了负责ARM核、DSP、USB控制器、DMA控制器以及系统总线设计的核心工程师,围在仿真结果前,开始逐帧分析波形,试图找出死锁发生的根源。“看这里,USB的DMA请求和DSP的内存读取请求几乎同时发出,总线仲裁器似乎陷入了一个循环等待状态……”“检查一下各个Master模块的优先级设置和总线协议实现……”“会不会是某个模块在异常状态下没有正确释放总线?”……
经过整整两天两夜的排查、争论和反复仿真验证,他们终于定位到了问题所在——是DMA控制器在处理一个极其罕见的、带有错误校验码的USB传输数据包时,其内部状态机进入了一个未定义的异常状态,导致它未能及时释放总线控制权,从而引发了与其他模块的死锁。
“找到了!”负责DMA模块的工程师如释重负地喊道,立刻开始修改RTL代码,增加对这种异常状态的处理逻辑。这个Bug的修复,避免了一次数百万美元的潜在损失。