简介
博主参考了 Xilinx UG871 文档,记录了 Vivado HLS 学习过程中的一些知识点和技巧,本文主要简单介绍 Vivado HLS 的工作流和一些问题的解决方案,之后会在阅读推进 UG871 的文档的同时不断的更新。
开发环境
- Ubuntu 18.04 LTS.
- Xilinx Vivado HLS 2019.1.
学习笔记
- Vivado HLS 主要用于将 C/C++ 代码高层次综合成 RTL 级的硬件描述语言,并导出 IP 核,供 Vivado Design Suite 使用,HLS 的基本工作流程是
- C Simulation/Validation - 主要用来验证 C 代码的正确性。
- C Synthesis - 对 C 代码进行综合并生成报告(监测 performance and resource utilization)
- C/RTL Co-Simulation - 对 RTL 设计进行仿真和验证。
- Export RTL as IP - 将验证好的 RTL 代码导出为可用的 IP 核。
- 新建一个基本的 HLS 项目需要
- Design Source: 实现功能的 Source C files (functions written by C/C++)
- Test Bench: 用来验证功能正确性的 C file (include main function),其中也包含了一些参考的验证文件。
- Solutions,Clock period (对于一个功能有不同的解决方案,也需要确定基本的时钟周期)
- 设备型号。
其中 1 和 2 需要自己提供实现和验证的功能的 source codes,3 和 4 在 HLS 中自己配置即可。
- Solution
HLS 项目中可以有多个 Solution,不同的 Solution 对代码有不同角度的优化,resource, throughput 等,他们也会产生不同的结果。
- HLS GUI
在 HLS GUI 下,用户可以容易找到上面不同的部分,其中还提供了三种模式
- Debug: 用来调试 C 源程序。
- Sythesis: 用来综合,仿真,导出 IP。
- Analysis: 用来详细分析综合后的结果。
- 导出 IP 时的一个小 bug
按照正常的 HLS 开发流程到导出 IP 时,若使用的是老版本的 Vivado HLS,会有如下错误:
ERROR: [IMPL 213-28] Failed to generate IP.
这是由于 Xilinx 开发套件的时间设置所导致的,很多博客提出了调整时间的解决方案,方便的解决方式是打一个补丁即可,详情参考 Xilinx Customer Community.
导出的 IP 存储在 <project name>/<solution name>/impl/ip 下,里面有导出 IP 的 zip 文件
- 使用 Tcl 脚本进行 Vivado HLS 开发
正常使用 GUI 进行 HLS 开发时,在 <project name>/<solution name>/constraints 下会有 script.tcl 文件 (具体可以 GUI 执行完查看一下),此文件提供了一种无需打开 GUI 在命令行进行 HLS 开发的方式,Linux 下运行以下代码即可执行 run_hls.tcl 文件中的 HLS 流程。
vivado_hls -f run_hls.tcl
其中如果出现 vivado_hls: command not found 的问题,去 Vivado 的安装目录下 (例如 /opt/Xilinx/Vivado/2019.1, 需要确认自己的安装位置) 找到对应版本,source settings64.sh 即可。
脚本执行完后,在 <project name>/<solution name> 文件夹下
- syn 文件夹存储了综合的报告。
- sim 文件夹存储了仿真的结果
- impl 文件夹存储了 RTL 和 IP 相关的东西。
命令行启动 HLS 的方式如下
vivado_hls -p <project name>
- 优化设计方案
在 HLS 中,我们可以对 C 代码的不同部分添加 directive,从而实现对代码不同角度的优化。directive 可以单独存在在一个 tcl 文件中或是直接以 #pragma 的形式存在于 C source code 中。对于应用不同 directive 的 solution,我们会综合出不同的结果,生成不同的 report,不同 report 间可以比较。
总结
本文主要从宏观的角度介绍了 HLS 的开发流程,以及使用 HLS 开发软件的一些方式,遇到一些常见问题的解决方案,以及引出了对于同一个项目可以有不同角度的优化方案。之后的文章会基于 UG871 文档详细介绍 HLS 开发流程中的每个部分。