光
上周调一块板子,ILA 死活抓不到想要的波形,折腾了两天,最后发现是几个经典坑,分享一下。
1. 触发条件写在组合逻辑输出上
组合逻辑的毛刺会让触发条件在仿真里成立、在板上不成立。触发信号尽量用寄存器打一拍后的版本,和被观测信号同源。
2. 采样时钟和信号不在同一时钟域
ILA 采样时钟必须和被测逻辑是同一个时钟。如果被测信号是跨时钟域过来的,先打两拍同步再进 ILA,否则看到的全是亚稳态垃圾。
3. 抓的信号位宽太大,深度不够
ILA 的 BRAM 是有限的,信号越多、抓的点数越少。调试时先抓关键控制信号(状态机、握手信号),数据通路等定位到问题再加。
4. 触发位置设得太靠后
默认触发位置下,触发前的历史只看一半。怀疑是上游问题时,把触发位置往前调,多看触发前的波形。
5. 综合把信号优化掉了
被观测的中间信号如果没有扇出到顶层,综合器可能直接优化掉,ILA 里显示为常量。关键信号加 mark_debug 或 keep 属性。
最后提醒:ILA 本身会吃时序资源,抓完记得把 debug core 删掉再出正式版本。你们调试 FPGA 一般还用过哪些手段?SignalTap / ChipScope 之外的土办法也欢迎分享。
1. 触发条件写在组合逻辑输出上
组合逻辑的毛刺会让触发条件在仿真里成立、在板上不成立。触发信号尽量用寄存器打一拍后的版本,和被观测信号同源。
2. 采样时钟和信号不在同一时钟域
ILA 采样时钟必须和被测逻辑是同一个时钟。如果被测信号是跨时钟域过来的,先打两拍同步再进 ILA,否则看到的全是亚稳态垃圾。
3. 抓的信号位宽太大,深度不够
ILA 的 BRAM 是有限的,信号越多、抓的点数越少。调试时先抓关键控制信号(状态机、握手信号),数据通路等定位到问题再加。
4. 触发位置设得太靠后
默认触发位置下,触发前的历史只看一半。怀疑是上游问题时,把触发位置往前调,多看触发前的波形。
5. 综合把信号优化掉了
被观测的中间信号如果没有扇出到顶层,综合器可能直接优化掉,ILA 里显示为常量。关键信号加 mark_debug 或 keep 属性。
最后提醒:ILA 本身会吃时序资源,抓完记得把 debug core 删掉再出正式版本。你们调试 FPGA 一般还用过哪些手段?SignalTap / ChipScope 之外的土办法也欢迎分享。

