就地执行(eXecute In Place,下面简称 XIP),即芯片内执行,是指应用程序可以直接在非易失存储器或闪存中取指然后译码、执行,不必再把代码读到系统 RAM 中。它是使用共享内存的扩展,以减少所需的总内存量。AMD 的软核处理器 Microblaze™ 可以通过 AXI Quad SPI IP 实现 XIP 的功能。
AMD 提供参考设计 XAPP1176(见文章底部 Ref 1 和 Ref 2),介绍使用 AMD Vivado™ Design Suite 通过 AXI Quad SPI 进行就地执行(XIP)。用户可以通过这个参考设计了解 Microblaze 实现 XIP 功能的基本概念和设计思路。然而这篇文档 XAPP1176 使用的是 Vivado 的旧版本 2013.2,这个版本已经非常久远,文档里面提到的一些工具(如:IMPACT) 以及命令(XMCSUTIL)在新版本的 Vivado 都已经不再支持,并且 XAPP1176 里提供的 Bootloader 比较复杂。
本篇文章提供了基于新版本 Vivado 2023.2 的参考工程,展示如何使用 Microblaze 地执行(XIP)程序,并提供一个简单的 Bootloader。
下面是工程创建流程和程序运行步骤:
1. 修改 2023.2 AC701 Petalinux BSP 里自带的 Vivado 工程,使能 AXI Quad SPI IP 里的 XIP 模式。或者创建一个基于 AC701 的 Vivado 工程运行,然后运行附件的 Tcl 文件。
2. 构建 Vivado 工程,生成 Bit 文件并导出包含 Bitstream 的 Xsa 文件。
3. 在 AMD Vitis™ 统一软件平台里,基于导出的 Xsa 文件创建 Platform 工程,创建两个工程,一个是 Bootloader,另外一个是 XIP 的用户程序。
这个 Bootloader 只是一个运行在 BRAM 里的简单程序,作用是把 PC 跳转到 XIP 程序的起始位置。
XIP 程序可以是任何用户程序,用户需要在 Linker script 里把 .text 等只读的 Section 放到 QSPI flash 的地址段,把 .data/.bss 等读写的 Section 放到 BRAM。
如果 .data section 里有已经初始化的变量,用户需要在用户程序里把 .data section 复制到 BRAM 里。
4. 分别右键点击 Bootloader 工程和 XIP 工程里的 Src 文件夹,导入附件的工程文件(在本博客的工程里,Bootloader 工程文件在 bootloader_ar 的文件夹里,XIP 工程文件在 dhry_0 文件夹里)。
5. 在 XSCT 里运行 mb-objcopy 把 Xip 工程的 Elf 文件转换成 Bin 文件(下面命令把 dhry_0.elf 转换成 dhry_0.b)。
6. 在 Vitis 里,通过菜单 Vitis -> Program Device 把 bootloader.elf 更新到 Bit 文件里,生成新的 download.bit。
7. 在 Vivado 里,通过菜单 Tools -> Generate Write Memory Configuration File 把 download.bit 和 XIP 工程的 Bin 文件合并成一个 Mcs 文件(这里相当于 XAPP1176 里的 Merging Two MCS Files)。
8. 把生成的 Mcs 文件烧写到 AC701 的 QSIP flash 里,连接 UART 线,把 AC701 设置为 QSPI flash 启动模式并上电启动。这样就能看到串口的打印已输出,输出内容是 DHRYSTONE 测试的结果。
Ref 1:
https://docs.amd.com/v/u/en-US/xapp1176-xip-axi-quad-spi-ipi
Ref 2:
https://account.amd.com/en/forms/downloads/design-license.html?cid=343404&filename=xapp1176-axi-quad-spi-quad-xip-mode.zip
请点击阅读原文查看相关附件。
AMD 自适应 SOC 及 FPGA 中文技术支持社区