2026/7/30 8:11:07

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

Cortex-A53 + GIC700 + Boot BRAM Vivado 全流程复现 Cortex-A53 GIC700 Boot BRAM Vivado 全流程复现本文档用于复现以下内容将 Cortex-A53 封装成 Vivado IPcortexa53_axi将 GIC700 封装成 Vivado IPgic700_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 读写 BRAMBRAM boot 能跳转到 DDR 地址窗口中的 payloadDDR payload 能读写 BRAM且读回结果一致注意当前流程验证的是 Linux handoff 路径不是完整 Linux kernel boot。要证明真实 Linux 完整起来还需要真实 LinuxImage、DTB、rootfs/initramfs以及足够大的 DDR/MIG 仿真模型。1. 环境要求当前工作目录cd/data/vmshare/cortex_a53需要的工具Vivado 2020.2命令行可执行vivadoAArch64 bare-metal 交叉编译器aarch64-none-elf-gccDevice tree compilerdtc本机已验证可用的工具路径/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_URLArm 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执行chmodx vivado_ip/build_vivado_ip.shPARTxcvu19p-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_ADDRGIC/private peripheral base系统脚本中设置为0x2F000000GICCDISABLE默认0启用 A53 GIC CPU interface非必要复位、调试、低功耗、DFT、MBIST 等端口在 wrapper 内部 tie-offSYSBARDISABLE1避免简单 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执行chmodx vivado_gic700_ip/build_gic700_ip.shPARTxcvu19p-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_AXIGIC 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 系统执行chmodx 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_DDRUARTGIC 状态输出WAKE_REQUEST,FAULT_INT,ERR_INT,PMU_INT6. 运行 BRAM Boot Smoke 仿真执行chmodx vivado_system/run_boot_smoke_sim.sh ./vivado_system/run_boot_smoke_sim.sh该仿真验证A53 从 Boot BRAM 地址0x00000000取指boot stub 写 BRAM offset0x1000boot stub 读回并比较数据pass/fail 状态写到 BRAM offset0x0f00预期 PASSBOOT_SMOKE_PASS: BRAM write/readback matched status4252414d5f4f4b31 value01122334455667788 value199aabbccddeeff00日志vivado_system/output/logs/boot_smoke_sim.log7. 运行 Linux Handoff Smoke 仿真执行chmodx vivado_system/run_linux_handoff_smoke_sim.sh ./vivado_system/run_linux_handoff_smoke_sim.sh该脚本会重新构建 boot stub并设置KERNEL_ENTRY0x80080000 DTB_ADDR0x80100000 DDR_BASE0x80000000 DDR_SIZE_BYTES0x00200000然后编译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 0boot stub 跳转到KERNEL_ENTRY0x80080000。DDR AXI memory model 在0x80080000返回 payload 指令。payload 验证x0-x3并通过 AXI 写读 BRAM。预期 PASSLINUX_HANDOFF_PASS: BRAM boot jumped to DDR payload and BRAM read/write matched boot_status4252414d5f4f4b31 linux_status4c494e55585f4f4b value00badf00d12345678 value1fedcba9876543210日志vivado_system/output/logs/linux_handoff_smoke_sim.log8. 在 Vivado GUI 中加载 IP 仓库打开任意 Vivado 工程后添加两个 IP reposet_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 stubKERNEL_ENTRY0x80080000DTB_ADDR0x88000000 ./vivado_system/build_system.sh含义KERNEL_ENTRYLinuxImage在 DDR 中的入口地址DTB_ADDRDTB 在 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 stubA53 能从 BRAM 启动A53 能通过 AXI/SmartConnect 访问 BRAMBRAM boot 能跳到 DDR 地址窗口Linux handoff register contract 已在仿真中检查当前尚未验证真实 LinuxImage完整启动Linux 初始化真实 GIC700 后的中断行为真实 MIG DDR 时序/校准UART 控制台打印真实 Linux logrootfs/initramfs 挂载要做完整 Linux boot建议下一步加入真实 LinuxImage与地址图匹配的 DTBinitramfs 或可访问的 rootfs更大的 AXI DDR/MIG simulation modelboot stub 中必要的 EL、cache/MMU、CNTFRQ_EL0设置或直接替换为 TF-A/U-Boot11. 快速检查命令检查两个 smoke 仿真是否通过grep-EBOOT_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_ADDR0x0000000000 ./vivado_ip/build_vivado_ip.sh在系统 BD 中create_a53_gic_bram_system.tcl默认把BOOT_ADDR设置成-boot_base当前为0x00000000修改 Linux handoff 地址KERNEL_ENTRY0x80080000DTB_ADDR0x88000000 ./vivado_system/build_system.sh修改器件型号PARTxcvu19p-fsva3824-2-e ./vivado_ip/build_vivado_ip.shPARTxcvu19p-fsva3824-2-e ./vivado_gic700_ip/build_gic700_ip.shPARTxcvu19p-fsva3824-2-e ./vivado_system/build_system.sh当前默认器件就是xcvu19p-fsva3824-2-e