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:启动地址,默认0x0000000000PERIPHBASE_ADDR:GIC/private peripheral base,系统脚本中设置为0x2F000000GICCDISABLE:默认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,ARESETNS_AXI:GIC register AXI slaveM_GICD:连接 A53S_GICDS_GICC:连接 A53M_GICCTIMER_IRQ[3:0]:来自 A53 timer IRQSPI[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_clksys_resetnM_AXI_DDRUART- 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
仿真中:
- A53 从 BRAM boot stub 启动。
- boot stub 先完成 BRAM 写读一致性检查。
- boot stub 设置 Linux handoff 寄存器:
x0 = DTB_ADDRx1 = 0x2 = 0x3 = 0
- boot stub 跳转到
KERNEL_ENTRY=0x80080000。 - DDR AXI memory model 在
0x80080000返回 payload 指令。 - 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:LinuxImage在 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