2. Versal启动与配置调试
Versal 的启动过程与传统的 FPGA 有本质区别。传统 FPGA 上电后从外部 Flash 加载比特流,配置完成即进入用户逻辑;而 Versal 是一颗异构计算平台,内部包含处理器系统(PS)、可编程逻辑(PL)、AI Engine、DDR 控制器、NoC 等众多子系统。上电后真正接管全局的不是用户逻辑,而是固化在芯片内部的 PMC(Platform Management Controller,平台管理控制器)。理解 PMC 与 PLM 的分工,是排查一切启动问题的起点。
PMC 与 PLM:谁在真正启动芯片
PMC 是 Versal 内嵌的专用管理子系统,包含微处理器、ROM、RAM、外设接口和一组配置寄存器。芯片上电或复位释放后,PMC 首先执行固化在 BootROM 中的代码,这段代码不可修改,负责最基础的启动介质探测与镜像加载。BootROM 完成第一阶段后,会从启动介质中加载 PLM(Platform Loader and Manager,平台加载与管理器)。PLM 是运行在 PMC 微处理器上的固件,通常由 Vitis 工具链生成,承担后续几乎所有工作:解析 PDI 镜像、配置 PL、加载 AI Engine、初始化 DDR、管理电源域、处理错误与多阶段启动。
因此可以把启动理解为两级接力:BootROM 只做“找到并拉起 PLM”,PLM 才做“把整个平台配置起来”。绝大多数启动失败,要么发生在 BootROM 找不到有效镜像,要么发生在 PLM 解析或配置某个子系统时出错。
启动模式与介质选择
Versal 通过模式引脚(MODE[3:0])在上电复位时采样启动模式,常见模式包括:
- JTAG 模式:调试阶段最常用,通过下载器直接加载 PDI,不依赖外部 Flash,适合首次点亮和排障。
- QSPI24 / QSPI32 模式:从板载 QSPI Flash 启动,是量产常见方案,24 与 32 指地址/数据位宽配置。
- SD/eMMC 模式:从 SD 卡或 eMMC 启动,便于现场升级与多镜像切换。
- OSPI 模式:从 OSPI Flash 启动,容量大、读取快,适合较大镜像。
模式引脚在复位释放瞬间被锁存,之后改变引脚状态不会影响本次启动。调试时若发现“明明拨到了 QSPI 却像没启动”,首先要确认复位时序与引脚电平是否在采样窗口内稳定。
配置流程与镜像结构
Versal 的配置镜像称为 PDI(Programmable Device Image),由 Bootgen 工具根据 BIF 文件生成。一个典型 PDI 内部按顺序包含:PLM 固件、PL 配置数据、AI Engine 镜像、DDR 初始化参数、以及可选的用户元数据。PLM 按 PDI 中的分区顺序依次处理,每个分区有独立的校验与加载目标。
下面这张图展示了从复位到系统运行的完整信号与数据流,重点标出了 BootROM、PLM 与各子系统之间的加载关系,以及常见失败点所在位置。
常见启动失败案例与调试方法
案例一:JTAG 能下载,QSPI 启动无反应。这是最典型的“调试能跑、量产不跑”问题。JTAG 模式下 PDI 由下载器直接送入,绕过了 BootROM 的介质探测。切换到 QSPI 后,BootROM 需要从 Flash 固定偏移读取镜像头。若 Flash 中烧录的镜像起始地址不对、镜像头校验失败,或 Flash 本身未被正确识别,BootROM 就会停在原地。调试方法:先用 JTAG 加载一个最小 PLM 镜像确认芯片本身正常,再检查 Flash 烧录工具写入的偏移与 PDI 头部信息是否匹配,必要时用 Bootgen 重新生成带正确头部信息的 PDI。
案例二:PLM 启动后卡在 DDR 初始化。PLM 在加载 PL 之前通常需要先初始化 DDR,因为后续镜像可能被搬运到 DDR 中执行。若 DDR 参数(如时序、位宽、频率)与硬件不匹配,PLM 会在 DDR 校准阶段超时。此时串口通常会打印校准失败或超时信息。调试方法:确认 DDR 配置是否来自正确的板级参数文件,检查供电与参考时钟,必要时降低 DDR 频率先让系统跑起来,再逐步调回目标频率。
案例三:PL 配置完成但 DONE 不拉高。PL 配置数据由 PLM 从 PDI 中取出并写入 PL。若比特流与器件型号不匹配、PL 供电异常或配置时钟不稳定,DONE 信号不会拉高。调试方法:用示波器观察 DONE 与 INIT_B 信号,确认供电轨在配置期间是否跌落,检查比特流是否针对当前器件与封装生成。
案例四:AI Engine 加载超时。AI Engine 阵列有独立的电源域和加载流程,PLM 需要按顺序释放复位并写入镜像。若 AIE 镜像缺失或电源域未使能,会出现加载超时。调试方法:确认 PDI 中是否包含 AIE 分区,检查电源域配置与 AIE 时钟。
调试手段与日志观察
Versal 启动调试最有效的手段是串口日志。PLM 会把启动各阶段的状态、错误码和失败分区打印到 UART。建议在板级设计时保留调试串口,并在 PLM 配置中打开详细日志级别。此外,PMC 内部有错误状态寄存器,可通过 JTAG 读取,用于判断是 BootROM 阶段还是 PLM 阶段出错。
# 典型 PLM 启动日志片段(示例)
[PLM] BootROM: mode = QSPI32
[PLM] Loading PDI from 0x2000000
[PLM] Partition 0: PLM OK
[PLM] Partition 1: PL config ... DONE
[PLM] Partition 2: AIE load ... TIMEOUT
[PLM] Error: AIE power domain not enabled
总结来看,Versal 启动调试的核心思路是:先分清 BootROM 与 PLM 的责任边界,再按 PDI 分区顺序逐段验证。模式引脚决定从哪里启动,BootROM 负责找到 PLM,PLM 负责配置整个平台。任何一段失败,都会在串口日志和状态寄存器中留下线索。掌握这条数据流,就能把“启动不了”这个模糊问题拆解成可定位、可验证的具体环节。