目录
1. 简介
本文旨在介绍在使用 Xilinx FPGA 进行加速应用开发时,三个关键方面的相关技术和命令:DPU 脚本、v++ 命令以及实现(impl)策略。
DPU脚本: 通过平台文件 XSA 创建 DPU 的主要 TCL 代码。
v++ 命令涵盖了以下主要功能:
- 编译: 将内核代码编译成硬件描述语言(HDL)或中间表示形式(IR)。
- 链接: 将编译后的内核与平台硬件资源连接起来,生成硬件比特流。
- 打包: 将比特流、内核元数据和其他必要的文件打包成一个可部署的软件包。
impl 策略: 实现策略指的是在Vivado工具中,针对设计进行布局布线(Place & Route)和时序优化的策略。
2. TCL 示例
2.1 DPU TCL 脚本
2.1.1 源码-精简
DIR_PRJ = $(shell pwd)/${BOARD}
DIR_TRD = $(shell pwd)/DPUCZDX8G
all : check_env dpu.xclbin
check_env :
@echo "BOARD: ${BOARD}"
@echo "VITIS_PLATFORM: ${DIR_PRJ}/platform.xsa"
bash check_env.sh
${DIR_PRJ}/kernel_xml/dpu/kernel.xml:
@mkdir -p $(@D)
cp -rf ${DIR_TRD}/prj/Vitis/kernel_xml/dpu/kernel.xml $@
# 创建脚本目录,并逐个拷贝脚本
${DIR_PRJ}/scripts:
@mkdir -p $@
${DIR_PRJ}/scripts/gen_dpu_xo.tcl: $(DIR_PRJ)/scripts
cp -f ${DIR_TRD}/prj/Vitis/scripts/gen_dpu_xo.tcl $@
${DIR_PRJ}/scripts/bip_proc.tcl : $(DIR_PRJ)/scripts
cp -f ${DIR_TRD}/prj/Vitis/scripts/bip_proc.tcl $@
${DIR_PRJ}/scripts/package_dpu_kernel.tcl: $(DIR_PRJ)/scripts
cp -f ${DIR_TRD}/prj/Vitis/scripts/package_dpu_kernel.tcl $@
sed -i 's/set path_to_hdl "..\/..\/dpu_ip"/set path_to_hdl "..\/DPUCZDX8G\/dpu_ip"/' $@
DPU_HDLSRCS= \
${DIR_PRJ}/kernel_xml/dpu/kernel.xml \
${DIR_PRJ}/scripts/package_dpu_kernel.tcl \
${DIR_PRJ}/scripts/gen_dpu_xo.tcl \
${DIR_PRJ}/scripts/bip_proc.tcl \
${DIR_PRJ}/dpu_conf.vh \
${DIR_TRD}/dpu_ip/Vitis/dpu/hdl/DPUCZDX8G.v \
${DIR_TRD}/dpu_ip/Vitis/dpu/inc/arch_def.vh \
${DIR_TRD}/dpu_ip/Vitis/dpu/xdc/*.xdc \
${DIR_TRD}/dpu_ip/DPUCZDX8G_*/hdl/DPUCZDX8G_*_dpu.sv \
${DIR_TRD}/dpu_ip/DPUCZDX8G_*/inc/function.vh \
${DIR_TRD}/dpu_ip/DPUCZDX8G_*/inc/arch_para.vh
# 生成dpu.xo文件
binary_container_1/dpu.xo: ${DPU_HDLSRCS}
@mkdir -p ${DIR_PRJ}/binary_container_1
-@rm -f ${DIR_PRJ}/$@
cd ${DIR_PRJ} ;\
$(XILINX_VIVADO)/bin/vivado -mode batch -source scripts/gen_dpu_xo.tcl -notrace -tclargs $@ DPUCZDX8G hw ${BOARD}
# 生成dpu.xclbin文件
dpu.xclbin: binary_container_1/dpu.xo ${DIR_PRJ}/platform.xsa
cd ${DIR_PRJ} ;\
v++ -l \
-t hw \
--platform ${DIR_PRJ}/platform.xsa \
--save-temps \
--config ${DIR_PRJ}/prj_config \
--temp_dir binary_container_1 \
--log_dir binary_container_1/logs \
--package.no_image \
--remote_ip_cache binary_container_1/ip_cache \
-o ${DIR_PRJ}/binary_container_1/$@ $< \
--xp param:compiler.userPostSysLinkOverlayTcl=${DIR_TRD}/prj/Vitis/syslink/strip_interconnects.tcl
cp -f ${DIR_PRJ}/binary_container_1/link/vivado/vpl/prj/prj.gen/sources_1/bd/*/hw_handoff/*.hwh ${DIR_PRJ}/dpu.hwh
cp -f ${DIR_PRJ}/binary_container_1/link/vivado/vpl/prj/prj.runs/impl_1/*.bit ${DIR_PRJ}/dpu.bit
cp -f ${DIR_PRJ}/binary_container_1/$@ ${DIR_PRJ}/dpu.xclbin
.PHONY: all check_env
v++: 这是 Vitis 编译器的可执行文件。
- -l: 启用链接器。
- -t hw: 指定目标平台为硬件 (hardware)。
- --platform /kv260_v1/platform.xsa: 指定使用的硬件平台。
- --save-temps: 保存编译过程中的中间文件,用于调试和分析。
- --config /kv260_v1/prj_config: 指定项目配置文件。
- --xp param:compiler.userPostSysLinkOverlayTcl=/boards/DPUCZDX8G/prj/Vitis/syslink/strip_interconnects.tcl: 在系统链接 (SysLink) 阶段之后执行一个自定义的 Tcl 脚本 strip_interconnects.tcl,该脚本可能用于优化或修改生成的硬件连接。
- --temp_dir binary_container_1: 指定临时文件的存放目录。
- --log_dir binary_container_1/logs: 指定日志文件的存放目录。
- --package.no_image: 不生成可引导的镜像文件。
- --remote_ip_cache binary_container_1/ip_cache: 指定远程 IP 核缓存的路径。
- -o /kv260_v1/binary_container_1/dpu.xclbin: 指定输出文件的路径和名称,即生成的硬件二进制文件 dpu.xclbin。
- binary_container_1/dpu.xo: 指定输入文件的路径和名称,即经过编译和优化后的设计文件。
2.1.2 文件依赖关系
当执行 make all(也即 make BOARD=kv260_som)时,make 将首先检查 dpu.xclbin 的依赖项
- binary_container_1/dpu.xo
- ${DIR_PRJ}/platform.xsa(由用户指定)
为了构建 dpu.xo 这个目标,make 将检查 DPU_HDLSRCS 中所有列出的文件:
DPU_HDLSRCS= \
${DIR_PRJ}/kernel_xml/dpu/kernel.xml \
${DIR_PRJ}/scripts/package_dpu_kernel.tcl \
${DIR_PRJ}/scripts/gen_dpu_xo.tcl \
${DIR_PRJ}/scripts/bip_proc.tcl \
${DIR_PRJ}/dpu_conf.vh \
${DIR_TRD}/dpu_ip/Vitis/dpu/hdl/DPUCZDX8G.v \
${DIR_TRD}/dpu_ip/Vitis/dpu/inc/arch_def.vh \
${DIR_TRD}/dpu_ip/Vitis/dpu/xdc/*.xdc \
${DIR_TRD}/dpu_ip/DPUCZDX8G_*/hdl/DPUCZDX8G_*_dpu.sv