Cortex-A53 + GIC700 + Boot BRAM Vivado 全流程复现

Cortex-A53 + GIC700 + Boot BRAM Vivado 全流程复现

本文档用于复现以下内容:

  • 将 Cortex-A53 封装成 Vivado IP:cortexa53_axi
  • 将 GIC700 封装成 Vivado IP:gic700_a53_min
  • 搭建 A53 + GIC700 + AXI Boot BRAM + UARTLite + 外部 DDR AXI 端口的最小 BD
  • 编译 BRAM boot stub,并初始化到 Boot BRAM
  • 编译一个 DDR payload,用来模拟 Linux handoff 后的 DDR 取指路径
  • 运行 xsim 行为仿真,确认:
    • A53 能从 BRAM 启动
    • A53 能通过 AXI 读写 BRAM
    • BRAM boot 能跳转到 DDR 地址窗口中的 payload
    • DDR payload 能读写 BRAM,且读回结果一致

注意:当前流程验证的是 Linux handoff 路径,不是完整 Linux kernel boot。要证明真实 Linux 完整起来,还需要真实 Linux Image、DTB、rootfs/initramfs,以及足够大的 DDR/MIG 仿真模型。

1. 环境要求

当前工作目录:

bash 复制代码
cd /data/vmshare/cortex_a53

需要的工具:

  • Vivado 2020.2,命令行可执行 vivado
  • AArch64 bare-metal 交叉编译器:aarch64-none-elf-gcc
  • Device tree compiler:dtc

本机已验证可用的工具路径:

text 复制代码
/home/ubuntu/Xilinx/Vitis/2020.2/gnu/aarch64/lin/aarch64-none/bin/aarch64-none-elf-gcc
/home/ubuntu/Xilinx/Vitis/2020.2/bin/dtc

如果 aarch64-none-elf-gcc 不在 PATH,脚本会优先使用上面的 Vitis 路径。若本机没有该工具链,可设置 Arm GNU Toolchain 下载链接:

bash 复制代码
export ARM_GNU_TOOLCHAIN_URL=<Arm GNU Toolchain Linux x86_64 AArch64 bare-metal tarball URL>
./vivado_system/scripts/setup_toolchain.sh

2. 可选清理

如果希望从较干净的输出目录重新开始,可以删除生成结果:

bash 复制代码
rm -rf vivado_ip/output vivado_ip/generated
rm -rf vivado_gic700_ip/output
rm -rf vivado_system/output

这不会删除原始 ARM RTL 发布目录。

3. 打包 Cortex-A53 Vivado IP

执行:

bash 复制代码
chmod +x vivado_ip/build_vivado_ip.sh
PART=xcvu19p-fsva3824-2-e ./vivado_ip/build_vivado_ip.sh

生成的 IP 仓库:

text 复制代码
vivado_ip/output/ip_repo

IP 名称:

text 复制代码
user.org:user:cortexa53_axi:1.0

A53 wrapper 关键默认配置:

  • BOOT_ADDR:启动地址,默认 0x0000000000
  • PERIPHBASE_ADDR:GIC/private peripheral base,系统脚本中设置为 0x2F000000
  • GICCDISABLE:默认 0,启用 A53 GIC CPU interface
  • 非必要复位、调试、低功耗、DFT、MBIST 等端口在 wrapper 内部 tie-off
  • SYSBARDISABLE=1,避免简单 AXI/BRAM 仿真中 barrier 类事务导致死锁
  • ca53_generic_ram 已替换为 Vivado 友好的 RAM wrapper,用于 BRAM/URAM 推断

如果只想验证 IP 仓库是否能加载:

bash 复制代码
vivado -mode batch -source vivado_ip/scripts/validate_ip_repo.tcl -tclargs -part xcvu19p-fsva3824-2-e

4. 打包 GIC700 Vivado IP

执行:

bash 复制代码
chmod +x vivado_gic700_ip/build_gic700_ip.sh
PART=xcvu19p-fsva3824-2-e ./vivado_gic700_ip/build_gic700_ip.sh

生成的 IP 仓库:

text 复制代码
vivado_gic700_ip/output/ip_repo

IP 名称:

text 复制代码
user.org:user:gic700_a53_min:1.0

GIC700 wrapper 暴露的主要接口:

  • ACLK, ARESETN
  • S_AXI:GIC register AXI slave
  • M_GICD:连接 A53 S_GICD
  • S_GICC:连接 A53 M_GICC
  • TIMER_IRQ[3:0]:来自 A53 timer IRQ
  • SPI[31:0]:外部 SPI 中断,当前系统中 UARTLite interrupt 接到 SPI[0]
  • WAKE_REQUEST, FAULT_INT, ERR_INT, PMU_INT:状态输出

低功耗、DFT、MBIST、sample、ACE-Lite sideband 等非必要信号在 wrapper 内部 tie-off。

5. 构建 A53 + GIC700 + Boot BRAM 系统

执行:

bash 复制代码
chmod +x vivado_system/build_system.sh
./vivado_system/build_system.sh

该脚本会完成:

  • 编译 vivado_system/boot/boot.S
  • 生成 BRAM 初始化文件
  • 编译 DTS 为 DTB
  • 调用 Vivado 创建 BD 工程

主要输出:

text 复制代码
vivado_system/output/vivado_system/a53_gic_bram_system.xpr
vivado_system/output/boot/boot.elf
vivado_system/output/boot/boot.bin
vivado_system/output/boot/boot.coe
vivado_system/output/boot/boot.mem128
vivado_system/output/linux/a53_gic_bram_system.dtb

系统 BD 默认地址图:

text 复制代码
Boot BRAM: 0x00000000 / 0x00010000
GIC700:    0x2F000000 / 0x00070000
UARTLite:  0x40600000 / 0x00010000
DDR AXI:   0x80000000 / 0x80000000

系统顶层对外接口尽量少,只暴露:

  • sys_clk
  • sys_resetn
  • M_AXI_DDR
  • UART
  • GIC 状态输出:WAKE_REQUEST, FAULT_INT, ERR_INT, PMU_INT

6. 运行 BRAM Boot Smoke 仿真

执行:

bash 复制代码
chmod +x vivado_system/run_boot_smoke_sim.sh
./vivado_system/run_boot_smoke_sim.sh

该仿真验证:

  • A53 从 Boot BRAM 地址 0x00000000 取指
  • boot stub 写 BRAM offset 0x1000
  • boot stub 读回并比较数据
  • pass/fail 状态写到 BRAM offset 0x0f00

预期 PASS:

text 复制代码
BOOT_SMOKE_PASS: BRAM write/readback matched
status=4252414d5f4f4b31 value0=1122334455667788 value1=99aabbccddeeff00

日志:

text 复制代码
vivado_system/output/logs/boot_smoke_sim.log

7. 运行 Linux Handoff Smoke 仿真

执行:

bash 复制代码
chmod +x vivado_system/run_linux_handoff_smoke_sim.sh
./vivado_system/run_linux_handoff_smoke_sim.sh

该脚本会重新构建 boot stub,并设置:

text 复制代码
KERNEL_ENTRY=0x80080000
DTB_ADDR=0x80100000
DDR_BASE=0x80000000
DDR_SIZE_BYTES=0x00200000

然后编译:

text 复制代码
vivado_system/payload/linux_handoff_payload.S

并生成 DDR 仿真初始化文件:

text 复制代码
vivado_system/output/payload/ddr.mem32

仿真中:

  1. A53 从 BRAM boot stub 启动。
  2. boot stub 先完成 BRAM 写读一致性检查。
  3. boot stub 设置 Linux handoff 寄存器:
    • x0 = DTB_ADDR
    • x1 = 0
    • x2 = 0
    • x3 = 0
  4. boot stub 跳转到 KERNEL_ENTRY=0x80080000
  5. DDR AXI memory model 在 0x80080000 返回 payload 指令。
  6. payload 验证 x0-x3,并通过 AXI 写读 BRAM。

预期 PASS:

text 复制代码
LINUX_HANDOFF_PASS: BRAM boot jumped to DDR payload and BRAM read/write matched
boot_status=4252414d5f4f4b31 linux_status=4c494e55585f4f4b value0=0badf00d12345678 value1=fedcba9876543210

日志:

text 复制代码
vivado_system/output/logs/linux_handoff_smoke_sim.log

8. 在 Vivado GUI 中加载 IP 仓库

打开任意 Vivado 工程后添加两个 IP repo:

tcl 复制代码
set_property ip_repo_paths [list \
  /data/vmshare/cortex_a53/vivado_ip/output/ip_repo \
  /data/vmshare/cortex_a53/vivado_gic700_ip/output/ip_repo \
] [current_project]
update_ip_catalog

应能在 IP Catalog 中看到:

text 复制代码
cortexa53_axi
gic700_a53_min

也可以直接打开系统工程:

bash 复制代码
vivado vivado_system/output/vivado_system/a53_gic_bram_system.xpr

BD 文件路径:

text 复制代码
vivado_system/output/vivado_system/a53_gic_bram_system.srcs/sources_1/bd/a53_gic_bram_system/a53_gic_bram_system.bd

9. 接入 DDR MIG 的硬件连接方式

系统 BD 已将 SmartConnect 的 M03_AXI 做成外部接口,并命名为:

text 复制代码
M_AXI_DDR

在硬件工程中,把 M_AXI_DDR 连接到 DDR MIG 的 AXI slave 侧。默认地址窗口:

text 复制代码
0x80000000 .. 0xffffffff

Boot BRAM 初始化文件可使用:

text 复制代码
vivado_system/output/boot/boot.mem128
vivado_system/output/boot/boot.coe

如果希望硬件上让 BRAM boot 直接跳到 DDR 中的 Linux Image,重新构建 boot stub:

bash 复制代码
KERNEL_ENTRY=0x80080000 DTB_ADDR=0x88000000 ./vivado_system/build_system.sh

含义:

  • KERNEL_ENTRY:Linux Image 在 DDR 中的入口地址
  • DTB_ADDR:DTB 在 DDR 中的地址

启动前需要保证 DDR 中已经放好:

text 复制代码
Linux Image -> KERNEL_ENTRY
DTB         -> DTB_ADDR
rootfs      -> 按 bootargs 或 initramfs 方案放置

10. 当前 Linux Bring-Up 边界

当前已经验证:

  • A53 IP 可被 Vivado 加载
  • GIC700 IP 可被 Vivado 加载
  • 两个 IP 能在 BD 中互连
  • Boot BRAM 能放置 boot stub
  • A53 能从 BRAM 启动
  • A53 能通过 AXI/SmartConnect 访问 BRAM
  • BRAM boot 能跳到 DDR 地址窗口
  • Linux handoff register contract 已在仿真中检查

当前尚未验证:

  • 真实 Linux Image 完整启动
  • Linux 初始化真实 GIC700 后的中断行为
  • 真实 MIG DDR 时序/校准
  • UART 控制台打印真实 Linux log
  • rootfs/initramfs 挂载

要做完整 Linux boot,建议下一步加入:

  • 真实 Linux Image
  • 与地址图匹配的 DTB
  • initramfs 或可访问的 rootfs
  • 更大的 AXI DDR/MIG simulation model
  • boot stub 中必要的 EL、cache/MMU、CNTFRQ_EL0 设置,或直接替换为 TF-A/U-Boot

11. 快速检查命令

检查两个 smoke 仿真是否通过:

bash 复制代码
grep -E "BOOT_SMOKE_PASS|LINUX_HANDOFF_PASS" \
  vivado_system/output/logs/boot_smoke_sim.log \
  vivado_system/output/logs/linux_handoff_smoke_sim.log

预期看到:

text 复制代码
BOOT_SMOKE_PASS: BRAM write/readback matched
LINUX_HANDOFF_PASS: BRAM boot jumped to DDR payload and BRAM read/write matched

检查关键输出文件是否存在:

bash 复制代码
ls -lh \
  vivado_ip/output/ip_repo \
  vivado_gic700_ip/output/ip_repo \
  vivado_system/output/vivado_system/a53_gic_bram_system.xpr \
  vivado_system/output/boot/boot.mem128 \
  vivado_system/output/linux/a53_gic_bram_system.dtb \
  vivado_system/output/payload/ddr.mem32

12. 常见参数修改

修改启动地址:

bash 复制代码
BOOT_ADDR=0x0000000000 ./vivado_ip/build_vivado_ip.sh

在系统 BD 中,create_a53_gic_bram_system.tcl 默认把 BOOT_ADDR 设置成 -boot_base,当前为:

text 复制代码
0x00000000

修改 Linux handoff 地址:

bash 复制代码
KERNEL_ENTRY=0x80080000 DTB_ADDR=0x88000000 ./vivado_system/build_system.sh

修改器件型号:

bash 复制代码
PART=xcvu19p-fsva3824-2-e ./vivado_ip/build_vivado_ip.sh
PART=xcvu19p-fsva3824-2-e ./vivado_gic700_ip/build_gic700_ip.sh
PART=xcvu19p-fsva3824-2-e ./vivado_system/build_system.sh

当前默认器件就是:

text 复制代码
xcvu19p-fsva3824-2-e
相关推荐
Eloudy6 小时前
Holoscan Sensor Bridge 入门指南(Getting Started)
gpu·fpga·rdma
海浪鱼1 天前
Cortex M7-TRM 翻译系列之ITM(十二)
arm·m7
Eloudy2 天前
RFSoC-PYNQ → RK-XCKU5P-F 移植记录
fpga
ARM+FPGA+AI工业主板定制专家3 天前
国产化RK3576+FPGA架构|晶圆传输机器人高速定位+AI瑕疵检测一体化方案
fpga开发·架构·机器人·嵌入式·fpga·工控·机器人运控
Dlrb12114 天前
ARM---I2C协议时序详解以及IMX6ULL使用I2C协议与AT24C02,LM75A芯片通信详解与示例代码
嵌入式硬件·arm·lm75a·i2c协议·at24c02·i2c时序
Eloudy4 天前
申请 Xilinx 免费 IP 许可的步骤笔记
fpga
零涂毕业设计5 天前
毕业设计模块开发-OLED显示屏(IIC协议0.96寸)STM32 ESP32 FPGA Linux驱动免费分享
linux·stm32·单片机·嵌入式·esp32·fpga·oled
Dlrb12116 天前
ARM---IMX6ULL定时器详解与应用:EPIT与GPT定时器,高精度延时函数
arm开发·gpt·arm·定时器·epit·高精度延时
Dlrb12117 天前
ARM -IMX6ULL的中断系统、GIC、CP15协处理器详细讲解
arm开发·arm·imx6ull·中断·gic·cp15·协处理器