Xilinx系列软件Bug及解决方案集锦

Xilinx系列软件Bug及解决方案集锦

最近使用Vitis系列在ZYNQ-7000上开发,遇到的Bug众多且匪夷所思。官方文档对大部分关键信息都一笔带过,support forum上只有同样烦躁的用户抱团取暖。真的很讨厌这种垄断公司的巨无霸软件。

因此将自己遇到的各种bug汇集于此,为改善搜索环境尽一份力。

以下Bug与解决方案仅在Vitis/Vitis HLS/Vivado 2020.2 on Windows上验证。

Vitis HLS无法导出IP

现象

在使用Vitis HLS综合成功后导出为IP(Export RTL)时发生错误:

1
2
3
4
5
6
7
8
bad lexical cast: source type value could not be interpreted as target
    while executing
"rdi::set_property core_revision 2311221433 {component component_1}"
    invoked from within
"set_property core_revision $Revision $core"
    (file "run_ippack.tcl" line 1013)
INFO: [Common 17-206] Exiting Vivado at Wed Nov 22 14:33:52 2023...
ERROR: [IMPL 213-28] Failed to generate IP.

原因

“千年虫”同款。Vitis HLS 内部脚本使用32位有符号整数存储当前时间戳作为导出IP的revision,且以YYMMDDHHmm形式,例如上述报错中的revision 2311221433代表2023年11月22日14:33。

众所周知32位有符号整数的最大表示值为2147483647,所以只要在22年及之后使用这个版本的Vitis HLS导出IP,都会因为时间戳超出表示范围而报错。

解决方案

Xilinx官方已给出补丁,详见Xilinx的说明

下载上面链接页面底部提供的y2k22_patch-1.2.zip,解压得到y2k22_patch文件夹,复制到Xilinx安装目录下,即[install path]/Xilinx/y2k22_patch

而后在Xilinx安装目录打开powershell。根据y2k22_patch/README内的版本说明执行。

例如,使用Vivado 2020.2自带的python执行补丁程序:

1
Vivado\2020.2\tps\win64\python-3.8.3\python.exe y2k22_patch\patch.py

完成后再导出IP就不会报错了。

包含自定义IP的BSP在Vitis无法通过编译

自定义IP包括使用HLS生成的IP和用户在Vivado中创建并打包的IP。此处以HLS生成IP为例。

现象

在Vivado中设计ZYNQ的PL端硬件,如果其中使用了HLS生成的IP,或是用户自己打包的IP,导出硬件到Vitis后,在工程编译时会报错,输出(此处自定义IP名称为image_filter):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
make -C ps7_cortexa9_0/libsrc/image_filter_v1_0/src -s include  "SHELL=CMD" "COMPILER=arm-none-eabi-gcc" "ASSEMBLER=arm-none-ea
bi-as" "ARCHIVER=arm-none-eabi-ar" "COMPILER_FLAGS=  -O2 -c" "EXTRA_COMPILER_FLAGS=-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard
 -nostartfiles -g -Wall -Wextra"

process_begin: CreateProcess(NULL, #echo "Copying 'ximage_filter.h' to '../../../include/ximage_filter.h'", ...) failed.
make (e=2): 系统找不到指定的文件。
make[2]: *** [Makefile:40: ../../../include/ximage_filter.h] Error 2
make: Leaving directory 'B:/ProgramFiles/Xilinx/VitisWorkSpace/imageAcc_platform/zynq_fsbl/zynq_fsbl_bsp'

make[1]: *** [Makefile:42: ps7_cortexa9_0/libsrc/image_filter_v1_0/src/make.include] Error 2
make: *** [Makefile:18: all] Error 2
make -C zynq_fsbl_bsp

原因

参考这篇Xilinx支持论坛的帖子,虽然遇到的情况与上面链接中略有不同但类似。

查看export/<ip_name>/drivers/<ip_name_vx.x>/src/Makefile对应内容:

1
2
3
4
# Rule to release include files
$(INCLUDEDIR)/%.h: %.h
	#echo "Copying '$<' to '$@'"
	$(CP) $< $@

根据报错:

1
2
process_begin: CreateProcess(NULL, #echo "Copying 'ximage_filter.h' to '../../../include/ximage_filter.h'", ...) failed.
make (e=2): 系统找不到指定的文件。

可见make将#echo ....的注释行错误地当作指令运行了。测试了原生linux上的make并不会出现此问题,推测可能是Vitis Shell内置环境的make问题。

解决方案

找到HLS导出IP对应的export/<ip_name>/drivers/<ip_name_vx.x>/src/Makefile,将其中的Makefile有关echo行取消注释,然后保存。如果生成的IP不止在本机使用,则同时也需要修改IP对应zip压缩包里的Makefile,且每次导出IP都需要修改。

此时回到vivado的Block Design会提示IP有更新,点击report ip status后可以在下方底栏查看,选中IP然后点击底部的upgrade ip selected按钮就会自动更新。

然后需要重新generate product,综合、实现和生成比特流,并Export Hardware。

Vitis中:

右键platform project,选择update hardware specification,然后选择更新后的xsa文件。

然后打开platform.prj,在项目BSP Setting页面选择Reset BSP Settings,此时Vitis才会删除所有已有的IP driver头文件,重新载入修正后的driver。

Vitis程序中Xil_printf无法输出64位数据

现象

在VItis编写ZYNQ arm核运行的程序时,若使用xil_printf尝试输出64位整数,可能出现输出空白或者输出错误数字。

例如常见的使用xtime_l.h进行运行时间计数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
XTime start_time, end_time;
XTime_GetTime(&start_time);

//do something

XTime_GetTime(&end_time);
XTime elapsed_time = (end_time - start_time);

double elapsed_seconds = ((double)elapsed_time) / XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ;
xil_printf("%d,%d,%llu,%.9f\n", width,height,elapsed_time,elapsed_seconds);

此处使用xil_printf尝试输出elapsed_time,其类型为XTime,查看定义后就是64位无符号整数,但程序执行时在对应位置只会输出空白。

原因

xil_printf不支持64位整数输出,surprise!

解决方案

参考来自2008年的支持论坛帖子,换用stdio.h的printf。这问题十五年来居然一直没有更新或者修复,叹为观止!

Doc Nav无法打开文档

现象

在Vivado中打开IP配置页面,点击Product Guide时,DocNav显示白屏,或者报错invalid or corrupted pdf file

原因

未知。

解决方案

独立安装最新版本的DocNav,下载页面

然后打开DocNav,切换到Catalog View,点击Update Catalog,等待更新为up to date。

新版本的DocNav仍然可以兼容旧版本的Vivado,并且在Vivado中打开文档也会正常唤起。

0%