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 完整起来,还需要真实 LinuxImage、DTB、rootfs/initramfs,以及足够大的 DDR/MIG 仿真模型。

1. 环境要求

当前工作目录:

cd/data/vmshare/cortex_a53

需要的工具:

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

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

/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 下载链接:

exportARM_GNU_TOOLCHAIN_URL=<Arm GNU Toolchain Linux x86_64 AArch64 bare-metal tarball URL>./vivado_system/scripts/setup_toolchain.sh

2. 可选清理

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

rm-rfvivado_ip/output vivado_ip/generatedrm-rfvivado_gic700_ip/outputrm-rfvivado_system/output

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

3. 打包 Cortex-A53 Vivado IP

执行:

chmod+x vivado_ip/build_vivado_ip.shPART=xcvu19p-fsva3824-2-e ./vivado_ip/build_vivado_ip.sh

生成的 IP 仓库:

vivado_ip/output/ip_repo

IP 名称:

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 仓库是否能加载:

vivado-modebatch-sourcevivado_ip/scripts/validate_ip_repo.tcl-tclargs-partxcvu19p-fsva3824-2-e

4. 打包 GIC700 Vivado IP

执行:

chmod+x vivado_gic700_ip/build_gic700_ip.shPART=xcvu19p-fsva3824-2-e ./vivado_gic700_ip/build_gic700_ip.sh

生成的 IP 仓库:

vivado_gic700_ip/output/ip_repo

IP 名称:

user.org:user:gic700_a53_min:1.0

GIC700 wrapper 暴露的主要接口:

  • ACLK,ARESETN
  • S_AXI:GIC register AXI slave
  • M_GICD:连接 A53S_GICD
  • S_GICC:连接 A53M_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 系统

执行:

chmod+x vivado_system/build_system.sh ./vivado_system/build_system.sh

该脚本会完成:

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

主要输出:

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 默认地址图:

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 仿真

执行:

chmod+x vivado_system/run_boot_smoke_sim.sh ./vivado_system/run_boot_smoke_sim.sh

该仿真验证:

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

预期 PASS:

BOOT_SMOKE_PASS: BRAM write/readback matched status=4252414d5f4f4b31 value0=1122334455667788 value1=99aabbccddeeff00

日志:

vivado_system/output/logs/boot_smoke_sim.log

7. 运行 Linux Handoff Smoke 仿真

执行:

chmod+x vivado_system/run_linux_handoff_smoke_sim.sh ./vivado_system/run_linux_handoff_smoke_sim.sh

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

KERNEL_ENTRY=0x80080000 DTB_ADDR=0x80100000 DDR_BASE=0x80000000 DDR_SIZE_BYTES=0x00200000

然后编译:

vivado_system/payload/linux_handoff_payload.S

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

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:

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

日志:

vivado_system/output/logs/linux_handoff_smoke_sim.log

8. 在 Vivado GUI 中加载 IP 仓库

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

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 中看到:

cortexa53_axi gic700_a53_min

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

vivado vivado_system/output/vivado_system/a53_gic_bram_system.xpr

BD 文件路径:

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做成外部接口,并命名为:

M_AXI_DDR

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

0x80000000 .. 0xffffffff

Boot BRAM 初始化文件可使用:

vivado_system/output/boot/boot.mem128 vivado_system/output/boot/boot.coe

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

KERNEL_ENTRY=0x80080000DTB_ADDR=0x88000000 ./vivado_system/build_system.sh

含义:

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

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

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 已在仿真中检查

当前尚未验证:

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

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

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

11. 快速检查命令

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

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

预期看到:

BOOT_SMOKE_PASS: BRAM write/readback matched LINUX_HANDOFF_PASS: BRAM boot jumped to DDR payload and BRAM read/write matched

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

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. 常见参数修改

修改启动地址:

BOOT_ADDR=0x0000000000 ./vivado_ip/build_vivado_ip.sh

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

0x00000000

修改 Linux handoff 地址:

KERNEL_ENTRY=0x80080000DTB_ADDR=0x88000000 ./vivado_system/build_system.sh

修改器件型号:

PART=xcvu19p-fsva3824-2-e ./vivado_ip/build_vivado_ip.shPART=xcvu19p-fsva3824-2-e ./vivado_gic700_ip/build_gic700_ip.shPART=xcvu19p-fsva3824-2-e ./vivado_system/build_system.sh

当前默认器件就是:

xcvu19p-fsva3824-2-e