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.sh2. 可选清理
如果希望从较干净的输出目录重新开始,可以删除生成结果:
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_repoIP 名称:
user.org:user:cortexa53_axi:1.0A53 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 仓库是否能加载:
vivado-modebatch-sourcevivado_ip/scripts/validate_ip_repo.tcl-tclargs-partxcvu19p-fsva3824-2-e4. 打包 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_repoIP 名称:
user.org:user:gic700_a53_min:1.0GIC700 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 系统
执行:
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_clksys_resetnM_AXI_DDRUART- 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 offset
0x1000 - boot stub 读回并比较数据
- pass/fail 状态写到 BRAM offset
0x0f00
预期 PASS:
BOOT_SMOKE_PASS: BRAM write/readback matched status=4252414d5f4f4b31 value0=1122334455667788 value1=99aabbccddeeff00日志:
vivado_system/output/logs/boot_smoke_sim.log7. 运行 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仿真中:
- 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:
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.log8. 在 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.xprBD 文件路径:
vivado_system/output/vivado_system/a53_gic_bram_system.srcs/sources_1/bd/a53_gic_bram_system/a53_gic_bram_system.bd9. 接入 DDR MIG 的硬件连接方式
系统 BD 已将 SmartConnect 的M03_AXI做成外部接口,并命名为:
M_AXI_DDR在硬件工程中,把M_AXI_DDR连接到 DDR MIG 的 AXI slave 侧。默认地址窗口:
0x80000000 .. 0xffffffffBoot 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 已在仿真中检查
当前尚未验证:
- 真实 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 仿真是否通过:
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.mem3212. 常见参数修改
修改启动地址:
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