0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在不改变RTL代码的情况下,优化FPGA HLS设计

454398 来源:赛灵思中文社区 作者:赛灵思中文社区 2020-12-20 11:46 次阅读

用软件从 C 转化来的 RTL 代码其实并不好理解。今天我们就来谈谈,如何在不改变 RTL 代码的情况下,提升设计性能。

本项目所需应用与工具:赛灵思HLS、Plunify Cloud 以及 InTime。

前言
高层次的设计可以让设计以更简洁的方法捕捉,从而让错误更少,调试更轻松。然而,这种方法最受诟病的是对性能的牺牲。在复杂的 FPGA 设计上实现高性能,往往需要手动优化 RTL 代码,这也意味着从 C 转化得到 RTL 基本不可能。其实,使用 FPGA 工具设置来优化设计可以最小限度地减少对性能的牺牲,这种方法是存在的。

高效地找到合适的FPGA工具设置
尽管工程师们知道 FPGA 工具的设置,但是这些设置往往并没有充分利用。一般而言,工具设置只有在出现时序问题的时候才会派上用途。然而,对于已经达到性能目标的设计来说,如果继续调整工具设计,仍然有10%-50%的性能提升潜力。

真正的难点在于选择正确的工具设置,毕竟各种 FPGA 工具一般都有有30-70个不同的布局布线设置,可选的设置组合实在是太多了。您可以写脚本来运行不同的推荐指令/策略。市面上也有工具,来自动管理并运行设计探索。

另一个难点就是不充裕的计算能力。典型的嵌入式应用是在单台电脑上设计的。运行多个编译需要更多的计算能力,这就要求更多的时间。如果您可以(使用云计算)并行运行,周转时间就会变短。

如何优化高层次的设计 - “Sobel滤镜”项目
这是一个用于视屏处理的参考设计,来自赛灵思的官网 https://china.xilinx.com/support/documentation/application_notes/xapp890... 。该设计的功能是 Sobel 滤镜,目标器件是拥有双核Dual ARM® Cortex®-A9MPCore 的 FPGA。

我们使用赛灵思 HLS 来打开这个设计。

图一:参考设计– Sobel滤镜

图一:参考设计– Sobel滤镜

它的时钟周期是5.00ns,也就是200MHz。从下图的时序预估中可以看出,它离时序目标还差506ps(181MH1),也就是比目标速率还差10%。

图二:当前时序结果

图二:当前时序结果

导出成 RTL 项目
不需要改变 C++ 代码,把设计输出成一个RTL 的 Vivado 项目。在 “Solution”下面,选择“Export RTL”。

图三:从HLS输出Vivado项目

图三:从HLS输出Vivado项目

它会在后台执行 Vivado,并生成一个项目文件(XPR)。它同时也会编译设计,您应该在控制台(Console)看到真实的时序细节。一旦完成,您可以在 /solution/impl/verilog/ 文件夹下找到项目文件。

图四:Vivado 项目文件

图四:Vivado 项目文件

找到这个 XPR 文件之后,您可以用 Vivado 打开它来验证。您将看到生成好的 RTL 源文件。

图五:从 HLS 生成的 RTL

图五:从 HLS 生成的 RTL

时序优化
下一步,是使用 InTime 设计探索工具,当然,您也可以自己写脚本来尝试 Vivado 工具中自带的指令和策略。请申请 InTime 的免费试用在本地运行,也可以注册一个 Plunify Cloud 云平台的账户,试用所提供的免费云币来在云端运行预置好的 FPGA 工具。

启动 InTime 之后,打开项目文件。在选择 Vivado 版本时,请使用“相同的”版本。例如,如果您使用2017.3 HLS,请选择2017.3 Vivado。

选择“Hot Start”配方(recipe)。此配方包含一系列更具以往其他设计的经验而推荐的策略。

图六:选择

图六:选择 "Hot Start" 配方

点击“Start Recipe”来开始优化。如果您在云端运行,您应该并行运行多个编译来减少周转时间。

优化过程和结果
第一轮结束之后 (“Hot Start”配方),最好的结果是“hotstart_1”策略。然而,它仍然距离目标时序90ns。

我们在“HotStart_1”的结果上使用了第二个配方,叫做“Extra Opt Exploration”。这一轮将集中优化关键的路径。这是一次迭代优化,并且只要仍有提升,就不断地重复自己。如果达到时序目标或者不再提升的时候,它就会停止。

图七:仅通过工具设置完成时序收敛

图七:仅通过工具设置完成时序收敛

经过两轮优化,总共15此编译后,设计达到了目标时序,200MHz。而这一切完全没有修改 RTL 源代码。

让性能更进一步
让性能更进一步需要各方面的优化 – 结构设计、代码和工具。工具设置的探索可以克服高层次设计的性能牺牲,并且不会让生产效率的好处减少。对于高层次设计的工程师来说,这是一种共赢。

编辑:hfy


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593201
收藏 人收藏

    评论

    相关推荐

    使用增量式编码器,在PI参数不改变情况下,为什么MCSDK初始定位后转速波动大?

    使用增量式编码器,第一次启动时,转速波动较大,然后第二次启动转速波动就平稳了,我想问一,在PI参数不改变情况下,为什么MCSDK初始定位后转速波动大?
    发表于 03-20 06:03

    何在不更换固件的情况下控制cyusb3014在USB 2.0和USB 3.0模式的读写速度?

    您好,我想通过上层机测试cyusb3014在 USB 2.0和 USB 3.0模式的读写速度。 如何在不更换固件的情况下控制是通过上位机以 USB 2.0 还是 USB 3.0 速度连接? 谢谢。
    发表于 02-27 06:24

    何在不改变频率的情况下改变PWM占空比?

    我需要支持来改变 PWM 的到期周期,而不会发生故障,每 10 毫秒就会改变频率。 目前我遇到了故障,这导致 PWM 在驱动电机方面出现了意想不到的功能。
    发表于 01-29 08:37

    AMD-Xilinx的Vitis-HLS编译指示小结

    ;j++) { b = 2; } } 由于这条指令的应用条件十分苛刻,因此很少使用。一般直接通过代码重构的方式对连续循环进行优化。 参考文档 官方vitis-hls的ug1399文档 FP
    发表于 12-31 21:20

    研讨会:利用编译器指令提升AMD Vitis™ HLS 设计性能

    将 C/C++ 代码为 AMD 设备上可编程逻辑的 RTL 代码加速 IP 创建。 在 Vitis HLS 中,优化指令脱颖而出成为最强大的
    的头像 发表于 12-05 09:10 223次阅读
    研讨会:利用编译器指令提升AMD Vitis™ <b class='flag-5'>HLS</b> 设计性能

    何在电压不稳的情况下保障SSD的稳定性能?

    何在电压不稳的情况下保障SSD的稳定性能?
    的头像 发表于 11-24 15:50 227次阅读
    如<b class='flag-5'>何在</b>电压不稳的<b class='flag-5'>情况下</b>保障SSD的稳定性能?

    何在不烧写的情况下使用软件读取ESP8266内存容量?

    何在不烧写的情况下使用软件读取ESP8266内存容量
    发表于 11-10 08:06

    何在不拆芯片的情况下读取出esp8266烧写的固件?

    何在不拆芯片不使用编程器的情况下读取出esp8266烧写的固件
    发表于 11-09 06:45

    如何优化FPGA HLS设计呢?

    用工具用 C 生成 RTL代码基本不可读。以下是如何在不更改任何 RTL情况下提高设计性能。
    的头像 发表于 10-30 14:34 617次阅读
    如何<b class='flag-5'>优化</b><b class='flag-5'>FPGA</b> <b class='flag-5'>HLS</b>设计呢?

    优化FPGA HLS设计

    用工具用 C 生成 RTL代码基本不可读。以下是如何在不更改任何 RTL情况下提高设计性能。
    的头像 发表于 10-30 11:41 377次阅读
    <b class='flag-5'>优化</b><b class='flag-5'>FPGA</b> <b class='flag-5'>HLS</b>设计

    HLSRTL无法导出IP核是为什么?

    请教一,我在HLS里面要将以下程序生成IP核,C Synthesis已经做好了,但是在export RTL的时候一直在运行 int sum_single(int A int B
    发表于 09-28 06:03

    何在Vitis HLS GUI中使用库函数?

    Vitis™ HLS 2023.1 支持新的 L1 库向导,本文将讲解如何下载 L1 库、查看所有可用功能以及如何在 Vitis HLS GUI 中使用库函数。
    的头像 发表于 08-16 10:26 621次阅读
    如<b class='flag-5'>何在</b>Vitis <b class='flag-5'>HLS</b> GUI中使用库函数?

    何在没有USB连接的情况下对电路板进行编程的说明?

    了如何在没有 USB 连接的情况下对电路板进行编程的说明。 我有几个问题: 合适的董事会的下一步是什么?我通常只需要几个 I/O 连接,并且知道有些引脚我不能使用,有些是上拉或下拉。 如何编程 - 让代码
    发表于 05-29 08:57

    ADC如何在存在大信号情况下同时处理小信号?

    对于 ADC,SFDR 展示了 ADC 如何在存在大信号的情况下同时处理小信号。例如,考虑一个接收器应用程序。假设 ADC 输入包含一个 +1 dBm 阻塞信号和一个 -75 dBm 所需信号。
    发表于 05-06 10:00 791次阅读
    ADC如<b class='flag-5'>何在</b>存在大信号<b class='flag-5'>情况下</b>同时处理小信号?

    MCUXpresso如何在不更新代码情况下退出时钟配置?

    如果我选择 ConfigTools->Clocks 菜单选项,我会得到时钟的视图/透视图(我对 Eclipse 部分的术语感到困惑),但我似乎无法在不更新代码情况下退出它。 有没有一种简单的方法可以返回到应用程序中包含我的代码
    发表于 05-04 08:22