前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一张图看懂HLS设计优化流程

一张图看懂HLS设计优化流程

作者头像
Lauren的FPGA
发布2019-10-30 19:25:02
1.4K0
发布2019-10-30 19:25:02
举报
文章被收录于专栏:Lauren的FPGALauren的FPGA

思考空间

如果b_vect采用如下声明方式:

logic [0 : 31] b_vect;

那么b_vect[0 +: 8]和b_vect[15 -:8]分别选取b_vect的哪些位?

b_vect[0 +: 8]选取b[0:7];b_vect[15 -:8]选取b[8:15]。

Vivado HLS实现了从C/C++到RTL代码(VHDL/Verilog)的转化,同时,HLS还提供了很多pragmas,以提高转化的效率。转化效率的衡量标准有三个,分别是:period,II(Initial Interval),Latency(三者的具体含义可查看这篇文章:一张图看懂Vivado HLS设计性能指标)。其中period决定了系统的Fmax;II决定了系统的数据吞吐率;Latency决定了数据处理周期。此外,资源利用率(Resource Utilization)在某些场景下也是不可忽视的一项指标。Pragmas的一个重要作用就是提升转换效率,使得最终生成的RTL代码能够满足期望的性能。

就pragmas而言,从作用对象来看,有针对循环的;有针对数组的;有针对函数的;有针对形参的(设置接口类型);从功能来看,有针对提升吞吐率和改善Latency的,例如DATAFLOW和Pipeline;有针对资源优化的,例如array_partition。那么,如此之多的pragmas,在实际工程中该如何使用,或者哪些该优先使用。对此,Xilinx给出了一套方法学。具体流程如下图所示。

图片来源:page 13, ug1270(v2018.1)

从这个图片中,不难看出,对设计执行C仿真之后,开始执行C综合。在C综合阶段,有5个子步骤。第一步,初始优化,这个阶段只定义接口类型,同时设定循环边界(如果存在循环边界未知或者是个变量的情形)。该阶段C综合的结果可做为参考。第二步,设置pipeline和dataflow。Pipeline和dataflow均可作用于for循环和函数。这一步的主要目的是提升吞吐率、改善Latency。第三步,优化数组,改善Memory性能。例如,设置RAM类型,从单端口改为双端口,可提高数据吞吐率;去除伪数据依赖,可缩短Latency。在这一步完成之后,设计基本达到最优结果。第四步和第五步属于“锦上添花”。

实际操作时,建议创建不同的Solution,用于对比不同的pragmas对性能改善的力度,同时把pragmas以Tcl形式保存在独立的文件中(暂时不要保存在C代码中)。待到最终选取合适的pragmas组合,达到最终性能指标之后,可以在把pragmas保存在C代码中(这个并不是必需的)。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lauren的FPGA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思考空间
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档