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 与各子系统之间的加载关系,以及常见失败点所在位置。

Versal 启动数据流与关键失败点 上电/复位释放 MODE[3:0] 采样 PMC BootROM 探测介质 / 加载 PLM 启动介质 QSPI / SD / OSPI / eMMC PLM 固件 解析 PDI / 调度加载 PDI 镜像分区(按序加载) PLM PL 配置 AI Engine DDR 参数 用户数据 PL 可编程逻辑 配置完成 / DONE AI Engine 阵列 镜像加载 / 复位释放 DDR / NoC 初始化 / 校准 PS 处理器 运行用户应用 常见失败点与观察位置 ① 模式引脚采样错误 → 检查复位时序与 MODE 电平 ② BootROM 找不到有效 PDI → 检查 Flash 首地址镜像头与校验 ③ PLM 解析分区失败 → 检查 BIF 分区顺序、DDR 参数与镜像完整性 ④ PL 配置 DONE 不拉高 → 检查 PL 时钟、供电与比特流 ⑤ AI Engine 加载超时 → 检查 AIE 镜像与电源域 ⑥ DDR 校准失败 → 检查 DDR 参数与硬件连接

常见启动失败案例与调试方法

案例一: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
调试建议:先用 JTAG 加载最小系统 PDI(仅 PLM + PL),确认芯片与供电正常,再逐步加入 DDR、AIE 和用户应用,把问题定位到具体分区,而不是一次性加载完整镜像后盲目排查。

总结来看,Versal 启动调试的核心思路是:先分清 BootROM 与 PLM 的责任边界,再按 PDI 分区顺序逐段验证。模式引脚决定从哪里启动,BootROM 负责找到 PLM,PLM 负责配置整个平台。任何一段失败,都会在串口日志和状态寄存器中留下线索。掌握这条数据流,就能把“启动不了”这个模糊问题拆解成可定位、可验证的具体环节。