高亚军(Lauren Gao)

赛灵思高级战略应用工程师,专注于 C/C++ 高层次综合,拥有多年利用 Xilinx FPGA 实现数字信号处理算法的经验,对 Xilinx FPGA 的架构、开发工具和设计理念有深入的理解。发布网络视频课程《Vivado入门与提高》点击率超过5万、出版《基于FPGA的数字信号处理(第2版)》一书,并广受好评。

Vivado综合设置选项分析:-control_set_opt_threshold

触发器的控制集由时钟信号、复位/置位信号和使能信号构成,通常只有{clk,rst/set,ce}均相同的触发器才可以被放置在一个SLICE中。但是,对于同步置位、同步复位和同步使能信号,Vivado会根据-control_set_opt_threshold的设置进行优化,其目的是减少控制集的个数。优化的方法如下图所示。在优化之前,3个触发器被分别放置在3个SLICE中,而优化后,被放置在1个SLICE中,但此时需占用查找表资源。


-control_set_opt_threshold的值为控制信号(不包括时钟)的扇出个数,表明对小于此值的同步信号进行优化,显然此值越大,被优化的触发器越多,但占用的查找表也越多。若此值为0,则不进行优化。通常情况下,按默认值auto运行即可。

Vivado综合设置选项分析:-flatten_hierarchy

-flatten_hierarchy有三个可选值,每个值的具体含义如下表所示。通常来讲,-flatten_hierarchy为none时,工具做的优化最少,因而消耗的资源也最多,但层次保留也最为完整。相反,当其为full时,工具做的优化最多,因而消耗的资源也最少,但层次完全被打平(只看到顶层)。从这个角度来说,-flatten_hierarchy的这三个值其实就体现了工具对设计层次完整性和优化力度两者的折中。通常情况下,使用默认值rebuilt即可。

-flatten_hierarchy是一个全局设置(凡是出现在综合选项设置菜单的均为全局设置),意味着对设计中的所有模块均生效。如果期望对设计中某个层次使用与-flatten_hierarchy的值不同的层次优化方式,就要用到综合属性(Synthesis Attributes)KEEP_HIERARCHY,它只能在RTL代码中使用,其优先级高于-flatten_hierarchy。具体使用方法如下:

Verilog版本:

关于Vivado HLS 的三大误读

目前,在高层次综合(HLS, High Level Synthesis)领域,Vivado HLS可谓独树一帜。它有效地拉近了软件工程师与FPGA之间的距离,加速了算法开发的进程,缩短了产品上市时间。对于工程师,尤其是软件工程师而言是一个福音。在实际工程中,如何利用好这一工具仍值得考究。本文将介绍使用Vivado HLS时的几个误区。

误区1:只要是C或者C++描述的算法都是可综合(可转换成RTL)的。
HLS的可综合功能是有限的,并不是所有的C或者C++语句都可转换成相应的RTL代码。下面这些情形是不可综合的。
1. 动态内存分配
2. 涉及操作系统层面的操作
3. 递归函数
4. 数组规模可变

误区2:既然Vivado HLS支持C、C++和System C,那么用三者任意一种都行。

HLS视频教程25:课程体系介绍与总结

本视频总结了 “跟 Xilinx SAE 学 HLS” 系列教学视频的总体框架,能更好地帮助您系统地观看本教学视频和学习视频,快速入门 Vivado HLS 的设计。

HLS视频教程24:案例分析

本节视频总结了三类 directives:
针对优化数据吞吐率的;
针对降低 Latency 的;
针对改善资源的;
最后结合 Cordic 算法介绍了如何使用 directives 以改善数据吞吐率。

HLS视频教程23:Vivado HLS 函数层面的优化

本视频介绍了几种针对函数的优化,包括 inline,allocation 和 dataflow,同时也介绍了这些优化方法对综合的影响。

HLS视频教程22:数组优化 - 其他优化方法

本节课中,我们将着重介绍在 Vivado HLS 中如何定义 ROM 以及如何对 RAM 初始化。

HLS视频教程21:数组优化 — 数组映射和重组

本视频将主要介绍:数组优化的另外两种方法:数组映射和重组。两者均可减少对存储资源(LUTRAM,BRAM 或 URAM)的消耗。

HLS视频教程20:数组优化 — 数组分割

在之前的课程我们介绍了了解 HLS 的入门,以及通过实例讲解了 HLS 的工作原理和对不同数据类型的介绍和处理 ... ... 上节课我们结束了对 FOR 循环的详细介绍。本节视频开始,我们将给大家介绍 Vivado HLS 中对于“数组优化”的一些方法进行分步讲解。本讲将主要介绍:通过对数组分割来实现数据吞吐率的提升。

HLS视频教程19:FOR 循环优化 — 其他优化方法

在之前的课程我们介绍了了解 HLS 的入门,以及通过实例讲解了 HLS 的工作原理和对不同数据类型的介绍和处理 ... ... 上节课我们介绍了接口综合的一些基本概念以及对“数组”的处理方式以及其他案例等。本节视频开始,我们将给大家介绍 Vivado HLS 所支持的 “FOR 循环” 的优化方法。本讲作为“FOR 循环优化”的收尾,介绍了其余的优化方法。包括:如何使独立的 FOR 循环并行执行、如何在使用 pipeline 时添加 rewind 以及如何处理循环边界为变量的情形。

同步内容