一线验证工程师的实战经验-不要把上电复位当成理所当然的事情(9000字)
上电和复位,听起来是芯片最基础的环节,但恰恰是最容易出大问题的地方。很多刚入行的验证工程师,拿到testbench就开始跑功能case,觉得上电复位就是拉高拉低信号那么简单。等到流片回来芯片不工作,才发现问题出在最开始的芯片还没正式工作的那几个时钟周期。
为什么上电复位这么容易出问题
数字芯片不是独立存在的,它需要模拟电路提供稳定的电源、时钟、复位信号。但模拟电路的特性是渐变的、有延迟的、带毛刺的,数字电路却期望信号是干净的0和1。这个gap就是bug的温床。
上电过程中,电源电压从0V慢慢爬升到1.8V或者1.2V,这个过程可能持续几百微秒到几毫秒。在这段时间里,时钟可能还没起振,POR(Power-On Reset)信号可能还没释放,LDO输出电压可能还在抖动,efuse可能正在读取配置。数字逻辑如果在这个时候就开始工作,很容易进入不可预期的状态。
更麻烦的是,RTL仿真默认是理想化的。仿真器给的电源就是稳定的1.8V,时钟就是完美的方波,复位信号就是干净的边沿。如果验证工程师不主动去模拟这些非理想情况,很多bug根本不会暴露。
第一类问题:时钟还没稳定就释放复位
这是最常见的上电bug之一。芯片上电后,晶振或者RC振荡器需要一段时间才能起振并稳定到目标频率。如果POR电路在时钟稳定之前就释放了复位信号,数字逻辑会在不稳定的时钟下开始工作。
不稳定的时钟意味着什么?数字逻辑在这种时钟下采样,寄存器可能采到错误的值,状态机可能跳到非法状态,计数器可能从一个随机值开始计数,甚至是亚稳态。
怎么在RTL仿真中发现这个问题?
首先要有一个能模拟时钟起振过程的模型。不能简单地在仿真开始时就给一个完美的时钟,而是要模拟时钟从无到有、从不稳定到稳定的过程。
模型可以很粗糙,但需要体现:时钟不是一开始就稳定的。在电压低的时候,时钟是不定态或者频率很低且带抖动。只有电压达到一定阈值后,时钟才稳定下来。
有了这个模型,再去跑仿真,就能看到数字逻辑在时钟不稳定时的行为。如果设计中没有等待时钟稳定的机制,很可能会看到寄存器采到X态,或者状态机进入非法状态。
解决方案是什么?
POR电路需要等待时钟稳定后再释放复位。具体做法是加入时钟检测逻辑,检测时钟频率是否达到目标值,或者简单地加一个足够长的延迟,确保时钟有足够时间稳定。
在RTL验证中,可以加一个checker,检查复位释放时时钟频率是否已经稳定。如果时钟还在抖动,就报错。
第二类问题:POR模型太理想化
很多项目的POR模型就是一个简单的assign语句:
