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