优化 FPGA HLS 设计
用工具用 C 生成 RTL 的代码基本不可读。以下是如何在不更改任何 RTL 的情况下提高设计性能。
介绍
高级设计能够以简洁的方式捕获设计,从而减少错误并更容易调试。然而,经常出现的问题是性能权衡。在高度复杂的 FPGA 设计中实现高性能需要手动优化 RTL 代码,而这对于HLS开发环境生成的 RTL 代码来说是不可能的。然而,存在一些解决方案,可以通过使用 FPGA 工具设置优化设计本身来最大限度地减少性能损失。
高效找到正确的 FPGA 工具设置
尽管设计人员知道 FPGA 工具设置的存在,但这些设置往往没有得到充分利用。通常,只有在出现设计问题时才使用工具设置。然而,对于已达到性能目标的设计,还有额外10% 至 50% 性能改进的巨大潜力。
上面的核心问题在于选择正确的工具设置,因为不同的 FPGA 工具提供 30 到 70 种用于综合和布局布线的设置。可能的组合太多了。可以编写脚本来创建不同的运行并尝试推荐的标准指令/策略。
最后一个挑战问题是计算能力不足。典型的嵌入式应用程序是在单台计算机上设计的。运行多个编译需要更多的计算能力。这是与时间的权衡。如果可以同时运行更多(使用云)综合策略,周转时间将会更短。
如何优化高级设计 - Sobel 滤波器
Sobel 滤波器是视频处理中常用的参考设计。该参考设计针对具有 Dual ARM® Cortex®-A9 MPCore™ 的 FPGA。
我们使用 Xilinx HLS 工具来打开此设计。
它的时钟周期为 5.00 ns,即 200 MHz。从时序估计(见下文)来看,它仍然缺少 506 ps 的时序,这相当于 181 MHz,比目标速度低 10%。
导出到 RTL 项目
在不更改 C++ 代码的情况下,将设计导出到 RTL 中的 Vivado 项目中。在“解决方案”下,选择“导出 RTL”。
它将在后台执行 Vivado 并生成项目文件 (XPR)。它还应该编译设计,并且应该在控制台中看到实际的时序详细信息。完成后,在/solution/impl/verilog/文件夹中找到项目文件。
找到一个 XPR 文件。可以通过Vivado打开它来验证它,可以看到生成的RTL源码。
优化时序
下一步是使用名为InTime 的设计探索工具(https://www.plunify.com/en/free-evaluation/)。(同样,可以自己编写脚本来尝试 Vivado 工具中提供的标准指令或策略)可以使用免费评估许可证在本地运行 InTime 。或者,使用一些免费积分和预装 FPGA 工具注册 Plunify云帐户。
启动InTime后,打开项目文件。当提示要使用的 Vivado 版本时,请使用“相同”的 Vivado 版本。例如,如果使用2017.3 HLS,请使用2017.3 Vivado。
选择“热启动”。“热启动”是基于之前其他设计经验的推荐策略列表。
单击“Start Recipe”开始优化。如果在云上运行,则应同时运行多个编译以减少时间。
优化过程和结果
在第一轮(“热启动”)之后,最好的结果是“hotstart_1”策略。然而,它仍然缺少-90ps 的时序。
我们对“HotStart_1”的结果应用了名为“Extra Opt Exploration”的第二个秘诀。这侧重于优化关键路径。这是一种迭代优化,只要每次迭代都显示出改进,就会不断重复。如果达到时间目标或未能显示出改进,它最终将自动停止。
经过两轮优化,共15次编译,该设计能够满足200Mhz的性能目标。这是无需对 RTL 源代码进行任何更改即可实现的。
更高水平的性能
要达到更高的性能水平,需要在所有方面进行优化——架构设计、代码和工具。工具设置探索可以克服更高级别设计的性能权衡,而不会失去它首先带来的生产力优势。这对于高级设计师来说是双赢。