上周,在纽约Rochester的课堂上,一个学生问:“哪种debug最难?”。
我脱口而出:“一些每两周出现一次的错误。”如果设备很少出现故障,可以假装不会发生而出货。如果经常发生,可以有更多机会查找原因源头。每两周一次是最糟的。
调试罕见模式的错误时,别企图直接修复。与每个改进尝试相关的检验周期都会打乱开发时间表。只会使事情更糟。发现错误原因和加速错误出现机率更合理。然后,再尝试解决。
使用非常规手段可以使系统出错,但是我不建议这么做。找到使系统更频繁发生同样症状控制方法。随后你了解问题。找出两到三个环节使系统出错是理想的。
数字产品经常由于不合适的时钟沿或同步而出错,所以从那里开始检查。
假设系统包含若干大型集成电路A到E,由中央时钟转发芯片控制。假定总线从A到B传送数据。如果延迟A的时钟,B的上升时间会紧迫。延迟B的时钟,总线时间相反变化。如果总线有充足的时间间隙,时钟时间上很小的调整不会产生错误。换句话说,如果总线时间处于临界状态,即使很小的调整也会造成系统错误。
定时调节方法,应该安排一个错误技术器。当错误发生时,测试装置记录但是保持
工作。系统一旦遇到错误就停下来,调试几乎是不可能的。每次失败时发出警报声是方便的。
时钟选择调整能查明总线时间和干扰问题。时钟选择影响干扰,因为它仅仅改变电压毛刺到达的相对时间。如果能移动噪声毛刺到时钟窗口之外,那么毛刺就不再是问题。
怎样改变时间选择呢?有时候,只是将手指放在时钟轨迹上,加上足够的寄生电容来延迟时钟沿。一些实验很快的教你怎样教准你的手指。
微波工程师用一些更约束的方法进行测试。他们喜欢在木棍或铅笔的末端上贴小块铜,接触时钟线。小块金属的接地电容在电路中产生小相位调整。如果需要进一步调整,使用负延时电路(参考文献1)。
如果时钟迹线不在表面,怎么接触他们呢?啊!这是电路板的关键点:每个时钟迹线必须可达到,不论何种形式、什么位置,就是为了调整时间。
带两个或更多时钟域的系统是测试过程变复杂。两个时钟产生相位,问题也许就出现在相位关系上。为了测试这个,做一个外部相位锁定的双时钟源,带有两个时钟有意调节相位关系的节点。连接设备到你的系统,在相位循环中使用它调节,寻找产生比平时更多错误的相位关系。例如:尝试模仿被认为影响系统的各种地波动、板干扰或亚稳度模型,调解两个时钟直到彼此覆盖或发生微小偏置。
如果找到显著增加错误几率的相位关系,锁定下来,然后去找这个bug!
英文原文:
Finger the culprit: Debugging rare modes of failure
First, make the problem worse.
By Howard Johnson, PhD -- EDN, 6/21/2007
Last week, at a class in Rochester, NY, one of my students asked, “What is the most difficult kind of problem to debug?”
My answer came quickly: “Something that fails every two weeks.” If a device fails less often, you can pretend it isn’t happening and ship the product anyway. If it fails more often, you stand a much better chance of tracking down the source. Every two weeks is about the worst it can be.
When debugging a rare mode of failure, never attempt a direct fix. The test cycles associated with each attempted improvement will kill your development schedule. Your first order of business is to make the problem worse. Discover what triggers the failure event, and increase the rate of failure to something more reasonable. After that, you can attempt solutions.