在 AMD Vitis™ Unified IDE 中释放系统设备树 (SDT) 的潜力

本文作者:AMD 工程师 Stephen MacMahon

您将在这篇博客中了解系统设备树 (SDT) 以及如何在 AMD Vitis™ Unified IDE 中使用 SDT 维护来自 XSA 的硬件元数据。本文还讲述了如何对 SDT 进行操作,以便在 Vitis Unified IDE 中实现更灵活的使用场景。

什么是 XSA,它包含什么

XSA 是在 AMD Vivado™ 设计套件中根据 Vivado IP integrator 使用的块设计 (BD) 而生成的容器文件。 

这意味着只有 BD 中包含的 IP 才会出现在 XSA 中。如果用户拥有 BD 外部的 IP,或者举例来说,如果使用 Chip2Chip 解决方案,那么在创建 XSA 时将使用主 BD。 

系统设备树 (SDT)

如果用户不了解 SDT,我们可以在此快速回顾一下。SDT 是 Vitis Unified IDE 2023.2 版本中引入的一个新概念。 

SDT 是使用 SDTGEN 实用工具创建的 .dts/.dtsi 文件集合,而平台组件则是使用从 Vivado 导出的 XSA 生成。

系统设备树 (SDT) 采用与 Linux 领域使用的设备树相同的概念。然而,Linux 中使用的设备树是针对特定目标处理器的,并且只包含与目标处理器的存储器映射上的 IP 对应的节点。顾名思义,系统设备树具有系统感知能力。这意味着所有 CPU 集群以及每个处理器的地址映射都包含在系统设备树中。SDT 还包含所有顶层存储器节点。虽然可以从 SDT 中提取目标处理器的设备树二进制对象 (DTB),但这并非 Vitis 中 SDT 的设计用途。在 Vitis 中,SDT 单纯用于维护硬件元数据。

如何在 Vitis 中使用 SDT?

当需要硬件元数据时,Vitis 就会使用 SDT。 其中包括创建 xparameters.h 文件、动态生成驱动程序配置文件、获取目标处理器上的驱动程序列表、生成连接器脚本以及创建 BSP。

这些流程都使用基于 Python 的 Lopper 实用工具来读取 SDT,并提取执行任务所需的特定元数据。

用户如何释放系统设备树的潜力

如上所述,Lopper 的用例之一即返回目标处理器上的驱动程序列表。这意味着如果您拥有 BD 外部的 IP,系统设备树不会自动填充该元数据。然而,您可以通过操纵 SDT 文件集来包含此元数据。 

如上所述,XSA 只能识别 Vivado IP integrator 的块设计内的 IP。这意味着如果您使用诸如 AMD Versal™ 自适应 SoC VCK190 或 AMD Zynq™ UltraScale+™ ZCU111 等开发板,那么板级信息(例如 PHY 或 I2C 总线上的时钟)将会丢失。

在系统设备树中,您可以通过传入 SDTGEN 提供的板级 .dtsi 文件,使 SDT 具备“板感知”能力。 

在 Vitis Unified IDE 中为 SDT 添加外部 IP

在 Vitis 2024.1 中,您在创建平台组件时可以使用一个高级选项来释放 SDT 的潜力。

例如,这里有一个外部 IP (axi_gpio),通过外部 AXI 接口连接到 LPD CIPS 接口,再与处理器相连。

1.png

使用自定义 DTSI 文件把该节点追加到 amba_pl 节点上。这里创建了 axi_gpio_0 节点。

随后,把该节点添加到 CPU 地址映射中。

2.png

然后,将其作为用户 DTS 文件传递给 SDT。

注释:此处不需要该 Repo。对于此用例,仅需作为用户 DTS 文件传入的 DTSI 文件即可。

3.png

如果随后构建或重新生成 BSP,那么会看到在 BSP 中已添加 AXI GPIO 驱动程序。

4.png

同样,如前所述,如果您使用 Versal VCK190 或 AMD Zynq UltraScale+ ZCU102 等开发板,只需将开发板 DTS 文件添加到 SDT 即可实现“板感知”。

注释:此处不需要该 Repo。对于此用例,仅需开发板 DTS 文件即可。

5.png

我们可以看到生成的 SDT 文件集(包括开发板文件),如下所示:

6.png

总结

总结而言,我们了解了 XSA 文件中包含哪些元数据,以及 Vitis Unified IDE 如何通过系统设备树提取并维护这些元数据。

我们还学习了在何处使用 Lopper 实用工具来按需提取这些元数据。最后,我们讨论了如何操纵 SDT,以解锁诸如使用外部 IP 和让 SDT 具备“板感知”能力等用例。