3. Versal启动与配置机制
Versal 的启动过程与传统 FPGA 或 Zynq 有本质区别:它不再由 PS 端 ARM 核直接主导,而是由一颗专用的平台管理控制器 PMC 接管上电后的全部初始化工作。PMC 内部运行平台加载器 PLM,PLM 是 Versal 启动链中第一个执行的固件,负责从启动介质读取 PDI 镜像、配置 NoC 与 DDR、加载 PL 的比特流、加载 CPM 与 AI Engine 等硬核,最后才把控制权交给用户应用。理解这条链路,是软硬件协同优化的前提——因为启动时间、安全策略、调试可达性都在这条链上被决定。
启动模式与介质选择
Versal 支持多种启动模式,由器件引脚 MODE[3:0] 在复位释放时采样决定。常见模式包括:JTAG 模式(用于调试与首次烧录)、QSPI24/QSPI32 模式(从板载 NOR Flash 启动)、OSPI 模式(从 Octal SPI Flash 启动)、SD/eMMC 模式(从存储卡或 eMMC 启动),以及 PCIe 模式(由主机通过 PCIe 下载镜像)。量产设备通常选择 QSPI32 或 OSPI,因为它们在容量、读取带宽和成本之间取得平衡;开发阶段则常用 SD 模式,便于快速替换镜像。
启动介质中存放的不是裸比特流,而是 PDI(Programmable Device Image)。PDI 由 Vitis 或 Vivado 的 bootgen 工具生成,内部按“镜像—分区”两级组织:一个 PDI 可包含多个 image,每个 image 又包含多个 partition,例如 PLM、PL 比特流、CPM 配置、AI Engine 配置、用户 ELF 等。PLM 按 PDI 头部的分区表顺序依次加载,因此分区顺序直接影响启动时间。
PLM 与 PMC 的职责边界
PMC 是硬件模块,PLM 是运行在 PMC 内部 MicroBlaze 上的固件。上电后,PMC 的 BootROM 先执行,从启动介质读取 PLM 到 PMC 的紧耦合内存中,然后跳转到 PLM 入口。PLM 完成的主要工作包括:初始化 PMC 自身外设、配置 MIO/PS 引脚复用、初始化 DDR 控制器并做内存训练、配置 NoC 带宽与 QoS、按分区表加载 PL 比特流与硬核配置、可选地执行安全校验,最后将 APU/RPU 从复位释放并跳转到用户 ELF 入口。
对软硬件协同而言,PLM 阶段最值得关注的是 DDR 初始化参数与 NoC 配置。DDR 训练失败会导致 PLM 卡死且无任何用户可见输出,只能通过 JTAG 读取 PMC 寄存器定位;NoC QoS 配置不当则会让 AI Engine 或 PL 在高带宽访问 DDR 时出现周期性停顿,这类问题在应用层很难察觉,却直接拉低吞吐。
镜像生成与分区顺序
PDI 由 bootgen 根据 BIF(Boot Image Format)文件生成。一个典型的 BIF 片段如下:
the_ROM_image:
{
[bootloader] plm.elf
[destination_device=pl] design.bit
[destination_device=cpm] cpm_cfg.bin
[destination_device=aie] aie_cfg.bin
[destination_cpu=a72-0] app.elf
}
分区顺序即加载顺序。把 PL 比特流放在 CPM 之前,可以让 PL 更早进入工作状态;但若 PL 逻辑依赖 CPM 提供的 PCIe 参考时钟,则必须调整顺序。镜像大小也直接影响启动时间:在 QSPI32 模式下,读取带宽约 50–80 MB/s,一个 30 MB 的 PDI 仅传输就需约 400–600 ms。若把 AI Engine 配置与 PL 比特流合并压缩,可显著缩短这一阶段。
安全启动与调试通道的取舍
安全启动通过 RSA/ECDSA 签名与 AES-GCM 加密保护 PDI 的完整性与机密性。启用后,PLM 在加载每个分区前先验签,失败则停止启动并进入错误状态。这会带来两个协同影响:一是启动时间增加,验签耗时与分区大小和密钥长度相关,示例量级为每分区 20–100 ms;二是调试通道受限,安全启动通常配合 JTAG 禁用或认证调试,量产板可能完全关闭 JTAG,此时只能依赖 PLM 通过 UART 输出的有限日志。
对软硬件协同的实际影响
启动机制对协同设计的影响体现在三个层面。第一,启动时间预算:若系统要求 1 秒内进入应用,则 PDI 必须控制在约 20 MB 以内,或采用 PL 动态重配置把非关键逻辑延后加载。第二,资源释放顺序:PLM 在加载 PL 比特流后才释放 APU,因此 APU 应用不能假设 PL 已就绪,必须在应用内轮询 PL 状态寄存器或等待 PLM 发出的完成信号。第三,调试可达性:安全启动关闭 JTAG 后,PL 内部信号无法用 ILA 观察,必须提前在设计中预留 AXI 调试桥或把关键状态通过 UART 输出。
一个可执行的检查清单如下,用于在镜像生成前确认启动链路的关键配置:
| 检查项 | 确认内容 | 判断依据 |
|---|---|---|
| 启动模式引脚 | MODE[3:0] 与目标介质一致 | 上电采样值读回 PMC 寄存器 |
| PDI 分区顺序 | PLM → PL → CPM/AIE → ELF | BIF 文件与 bootgen 日志 |
| DDR 训练 | PLM 日志输出训练通过 | UART 打印或 PMC 状态寄存器 |
| 安全启动 | 签名/加密开关与密钥匹配 | 验签失败时 PLM 错误码 |
| 调试通道 | JTAG/UART 在目标阶段可用 | 连接后能否读到 PLM 日志 |
把这张清单在每次镜像迭代时过一遍,可以避免绝大多数“板子上电无反应”或“应用跑不起来但 PL 已配置”的协同问题。启动链路是软硬件第一次真正交汇的地方,理解它,后续的性能优化才有稳定的起点。