在芯片样片流片回来之后,所有的人最关心的就是新的功能是否正常、旧版本发现的问题是否解决,这就需要把样片替代验证系统里老芯片,重新把系统跑起来进行验证。在样片阶段,可能由于封装比较简陋、成品率很低等方面原因导致出现各种奇怪的问题。 由于芯片的验证系统涵盖了芯片验证板卡、新芯片、启动固件(BIOS)、操作系统等,因此可以按照从硬件到软件、从最底层到最上层的层次进行逐一排查。


检查主板静态设置


这里所说的主板静态设置是指验证系统在上电前后一些不再变化的跳线帽、拨码开关,这些设置通常用来设置系统访问频率、取指模式等,具体的说明如下:


是否上电成功:并不是所有的情况下AC cord连接到了验证板卡上,就能保证系统一定能够上电。考虑下面的三种情况:AC停电了,电源故障导致无法输出期望的DC,或者DC处于power off状态,或者PSU固件问题。这些情况,都需要考虑到。


CPU倍频系数:CPU倍频系数,是指CPU实际运行的频率相对于CPU基准时钟频率的倍数。任何芯片都有最高的设计频率和最低频率,频率过高或者过低都会导致CPU取指、运行异常。


内存倍频系数:是指内存运行的频率相对于内存基准时钟频率的倍数。如果频率超过设计频率,就会出现内初始化失败或者系统跑飞的问题。


总线倍频系数:是指外部总线(HT、PCIE)总线实际运行频率相对于基准时钟的倍数。如果设置不对可能出现总线初始化失败的问题。


取指模式:SPI/LPC

CPU刚开始执行的时候,最早的一部分指令都是从Flash中取指执行的。为了提高取指执行的速度,当前很多CPU最早都是从SPI Flash中去取指令,但还有早期的部分CPU仍然从LPC Flash取指。有的主板上,这些是通过一个跳线设置的,所以调试时候需要主意:如果是从SPI/LPC Flash中区指,需要保证对应型号的FLash芯片放置在正确的Flash位置,否则会导致无法取指执行。


BIOS芯片:

BIOS芯片可能由于烧写失败,或者放置位置错误、固件二进制错误等导致系统上电后无法正常引导。


如果上面的对主板的静态检查没有问题,但是BIOS或者系统还是不能正常启动,那么还需要进行下面的动态检查:

检查主板动上电状态:可以通过万用表测量CPU核心电压、IO电压等是否在额定范围之内,如果CPU核心电压为0,自然会导致系统无法正常取指,这时需要排查AC2DC电源是否正常、主板有无故障。


检查取指时序是否正确:

CPU最早阶段不管是从LPC Flash还是SPI Flash取指,实际都是按照LPC、SPI协议规范约定的时序去执行。为了排除时序的问题,可以通过示波器抓取相应的时钟信号、控制信号分析波形是否符号时序要求。


观察CPU、内存、总线基准时钟的晶振是否起振:

作为基准时钟的晶振是整个系统的物理心跳。如果晶振和主板接触不良或者不在主板上,或者晶振不能产生额定频率的方波,都会导致系统启动异常。


检查能否取指

如果上述检查都通过,但还是无法执行,需要检查验证板卡上CPU和对应的插槽是否接触紧密,也需要排除碰到残次CPU的可能。


    一旦前面所有的检查都没有问题,理论上CPU应该可以取指执行。为了更好地跟踪启动的过程,及时定位并分析启动失败的现象和原因,需要让BIOS里尽早初始化好串口、七段数码管或者GPIO/LED灯等,并且在BIOS里每个重要的启动步骤打印输出,或者点LED灯和往7段数码管里显示约定的输出。当然,如果系统上有BMC的话,还可以通过BMC来读取当前的启动代码。


    此外,如果系统支持EJTAG工具,还可以连接上EJTAG线缆工具,跟踪启动阶段PC运行的轨迹。比如在MIPS系统上,下面的不同PC代码代表着不同的启动阶段:

BFCxxxxxxx: 刚从Flash开始取指uncache执行的阶段

9FCxxxxxxxx:从Flash开始取指使能cache执行的阶段

8002xxxxxxx: 从内存取指以cache方式执行的PMON阶段

802xxxxxxxx:从内存取指cache执行的kernel内核态 阶段


    总而言之,芯片调试过程中,需要结合CPU、BIOS、多种总线协议的知识,利用对主板硬件上电、时序的了解,尽可能充分使用串口、万用表、示波器、EJTAG等工具,加快调试过程。