以Vivado工具为例了解FPGA综合

Vivado设计流程

使用Vivado进行设计开发的步骤如下:

1. 功能设计:使用HDL语言设计、自带或者第三方的IP、嵌入式处理器等。

2. 综合:在综合时可以加入第三方的网表文件和约束文件。

3. 实现:在Vivado实现的步骤中,必须要执行的有三个opt_design、place_design、route_design。

1.png

在设计过程中,各个阶段的生成的文件都是.dcp,Vivado使用的是通用的模型贯穿在设计。

2.png

Checkpoint文件

Checkpoint文件是Vivado运行工程设计后存储的信息及设计相关文件的文件格式,同时也是Vivado中使用的通用数据库,在Checkpoint中包含:

  • 网表:Logical Netlist (EDIF)

  • 约束:Constraints (XDC)

  • 物理数据:Physical Data (XDEF)

3.png

不同情况下,不同dcp用到的网表文件可能不同。

IP为核心

Vivado设计理念是以IP为核心,使用过Vivado的人都知道在vivado中有block design这个类似画布的东西,在这个界面里可以把IP进行嵌入,通过鼠标进行连接链路,搭建属于自己的数字积木。

4.png

综合

综合是FPGA设计中不可缺少的环节,综合就是把HDL语言/设计转换为综合网表的过程。综合网表会包含已经转化后的逻辑设计所对应的资源模块,包括组合逻辑器件、寄存器,FPGA特有的各种原语(Primitive),内部的硬核模块等,同时会描述这些模块的属性和约束信息。

打开vivado后,右键综合选项,可以配置该工程的综合设计。

5.png

在综合设置中,可以根据实际需求进行设定综合的约束文件,综合策略,以及制定综合过程的相关优化策略。

6.png

综合选项使用分析(vivado 2020.2)

strategy

可以对综合进行不同优化策略设计,使得设计满足相应的需求。

7.png

7.png

下面对上述综合设计中的选项进行分析说明:

tcl.pre:可以进行指定综合前所运行的tcl脚本。

tcl.post:可以进行指定综合后所运行的tcl脚本。

-flatten_hierarchy

none

该选项指示综合工具永远不会使层次结构改变,一些边界优化将无法进行。

综合的输出将具有与原始RTL完全相同的层次结构。

full

该选项指示工具将层次结构完全打平,只留下顶层,综合后的网表文件只有一个顶层。

Rebuilt

这是默认的flat _hierarchy选项。

Rebuilt选项允许工具扁平化层次结构,执行综合,然后重建基于原始RTL的层次结构。

Rebuilt选项允许跨边界优化,且最终的层次结构是与RTL相似,以方便分析。

-gate_clock_conversion

用于管理门控时钟(Gated Clock),门控时钟是指由门电路而非专用时钟模块例如MMCM或PLL生成的时钟。门控时钟会给设计带来一些负面影响,可通过-gated_clock_conversion移除,当时钟负载少且时钟频率低时比如小于5MHz,可以适当利用门控时钟(建议手工插入BUFG)。

一个典型的门控时钟如下图所示,即触发器和反相器构成的二分频电路。此时,若第一个触发器的Q端对应的信号clk_div_2被其他逻辑用做时钟,那么就构成了门控时钟电路。

8.png

门控时钟会对设计带来一些负面影响。典型的危害包括:时钟信号可能会有毛刺;时钟歪斜(Clock Skew)会恶化。同时,一个不可忽略的影响是Vivado并不会对门控时钟主动插入BUFG,这就意味着该时钟会占用传统的布线资源也就是Fabric中的布线资源而不会使用时钟网络资源,从而可能会跟其他关键路径争夺布线资源,影响时序。

9.png

-gated_clock_conversion可将门控时钟信号变为使能信号,对于上图所示门控电路,Vivado可将其优化为下图所示电路。此时,clk_div_2被转化为使能信号连接到了下级触发器的使能端口,而下级触发器的时钟端口则与主时钟clk连接,从而移除了门控时钟。

-directive

可以指定综合时的使用相关优化指令,可以针对性的去进行优化设计。

10.png


  • RuntimeOptimized:执行最短时间的优化选项,会忽略一些RTL优化来减少综合运行时间。

  • AreaOptimized_high/medium:执行一些通用的面积优化。

  • AlternateRoutability:使用算法提高布线能力,减少MUXF和CARRY的使用。

  • AreaMapLargeShiftRegToBRAM:将大型的移位寄存器用块RAM来实现。

  • AreaMultThresholdDSP:会更多地使用DSP块资源。

  • FewerCarryChains:位宽较大的操作数使用查找表(LUT)实现,而不用进位链。

-retiming

寻求通过组合门或LUTS自动调整寄存器(寄存器平衡)来改善时钟内顺序路径的电路性能。它维护电路的原始行为和延迟,不需要对RTL源进行更改。

有两种不同的重定时方法,向后重定时和向前重定时。向后重定时从门的输出中删除寄存器,并在同一逻辑门的输入出创建新的寄存器。向前重定时的作用正好相反,它从逻辑门的输入中删除寄存器,并在输出中创建新的寄存器。

在Vivado 综合操作中有两种方法实现自动重定时:全局重定时和局部重定时。

全局重定时是对整个设计而言的,基于设计时的时序要求优化大型组合逻辑结构中的寄存器设计。

这种方式需要分析设计中的所有逻辑,优化最坏路径情况下的寄存器从而使整体设计反应速度更快。为了实现这一点设计时必须在.xdc文件中规定准确的时间限制。在synth_design或Vivado GUI综合设置下通过-retiming命令启用全局重定时,此外该特性还可以与合成中的BLOCK_SYNTH特性一起用于设计中的特定模块。

局部重定时是指用户明确告诉工具使用retiming_forward、retiming_bbackward RTL属性时需要执行的重定时逻辑。

指定使用最大个数

该部分都是指定相关资源使用的最大个数的设置选项

-bufg:指定全局时钟的buffers最大使用个数。

-max_bram:指定bram最大使用个数。

-max_uram:指定ultra ram最大使用个数。

-max_dsp:指定dsp最大使用个数。

-max_bram_cascade_height:指定bram最大级联使用个数。

-max_uram_cascade_height:指定uram最大级联使用个数。

-no_lc

lc(LUT combining):查找表组合。

当两个输出都具有同样输入时,若不使能no_lc,则只会消耗一份LUT资源,如果使能no_lc,则会消耗两份LUT资源。

例如下图:

11.png

乍一看,如果不使能no_lc的check,这样不是更节省资源吗?

不进行no_lc的check,LUT组合利用双输出LUT(O5、O6)进行设计逻辑,确实可以节省资源,减小面积,但是带来的代价是可能造成布线的堵塞,而使用no_lc的check,将两个输出综合成两个LUT,位置比较灵活,这样可以方便工具进行优化布线。

对于Vivado来说,默认是禁用 LUT combine,XST/Synplify 工具默认是使能 LUT combine 。

赛灵思指导建议

如果O5、O6同时使用的LUT占比大于了15%, 建议在关闭LUT combining。

-fsm_extraction

用于设定状态机的编码方式,其可选值为one_hot, sequential, johnson, gray, auto和off。默认值为auto,此时Vivado会自行决定最佳的编码方式。

-keep_equivalent_registers

等效寄存器,即共享输入数据的寄存器。勾选时,等效寄存器不合并;不勾选时,等效寄存器合并。等效寄存器可以有效的降低扇出,可以通过综合属性keep避免其被合并。

-resource_sharing

设置不同信号间共享算数操作符,选择为auto时设计会根据设计时序判断是否进行资源共享。

-control_set_opt_threshold

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

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

12.png

UG949(V2017.4版本)Table 5-9 给出了控制集的百分比(适用于7系列FPGA和UltraScale FPGA),如下图所示。可以看到当这个百分比超过15%时,表明需要降低控制集。

13.png-shreg_min_size

当移位寄存器深度小于等于-shreg_min_size时,最终实现方式为触发器级联的形式;而当其深度大于-shreg_min_size时,实现方式则为FF + LUT + FF的形式。

-no_srlextract

选中该选项时,移位寄存器会用普通的寄存器实现,而不用FPGA内部专用的SRL资源。-no_srlextract则是阻止工具将移位寄存器映射为LUT,其优先级高于-shreg_min_size。例如,当移位寄存器深度为4,-shreg_min_size为3,-no_srlextract被勾选,那么最终实现形式是4个触发器级联的形式,而非FF + LUT + FF的形式。

-cascade_dsp

设置在求DSP块输出总数时使用多少个加法器,默认计算时会使用块内部的加法器链。设置为tree会强制将该计算在fabric结构中实现。

-assert

将VHDL中的assert状态纳入评估。失败或错误级别会停止综合进程并产生一个错误信息;警报级别会产生一个警告信息。

设计中常用的一些综合属性

移位寄存器

Xilinx 7系列的FPGA在实现移位寄存器,使用单个查找表(LUT)中实现的1到32个时钟周期移位寄存器。使用srl_style可对移位寄存器生成的结构进行不同类型的描述。

使用srl_style只需在设计的V文件中的目标寄存器前加上如下代码即可:

(* srl_style = "XXX" *) reg [WIDTH-1:0]shift_reg;

srl_style中可填入5种不同的值,填入不同值后,会生成不同的结构。

14.png

(* srl_style = “srl_reg” *),将会描述移位寄存器为SRL + FF结构。

(* srl_style = “reg_srl” *),将会描述移位寄存器为FF + SRL结构。

(* srl_style = “reg_srl_reg” *),将会描述移位寄存器为FF + SRL + FF 结构。

(* srl_style = “register” *),将会描述移位寄存器为纯FF结构。

(* srl_style = “srl” *),将会描述移位寄存器为纯SRL结构。

使用SRL好处

使用SRL可以有效减小面积,因为使用单个查找表(LUT)中实现的1到32个时钟周期移位寄存器。并且使用SRL相比级联寄存器的结构性能要更好(支持的最高频率更高)。

SRL+ FF结构的好处

触发器的时钟到输出时间远低于SRL的时钟到输出时间,这就是为什么在SRL的输出中添加触发器的原因。

RAM和ROM

使用(* ram_style = "distributed or block" *) ,可以

指导Vivado综合工具如何推断存储器资源的类型。

可使用distributed or block,描述存储器资源

distributed :指示工具推断LUT ram,将此属性放在为RAM声明的数组上。

block:指示工具推断RAMB类型组件。

DSP48

在模块或者寄存器中指定使用如,(*use_dsp48=“yes”*),可使得该部分的算术运算使用dsp资源进行实现。

在默认的情况下,如下的算术类型结构会综合成DSP48E资源:

1. 乘法

2. 乘加操作

3. 乘减操作

4. 乘累加操作

其余的加法,减法,累加则会默认使用逻辑资源去实现。该属性会覆盖默认行为并强制将这些结构强制转换为DSP48块,并将其置于RTL中signals,architectures和components,entities和module上,具有以下优先级:

Signals > Architectures and components > Modules and entities

dont_touch

使用dont_touch可以防止相关内容被逻辑优化,此属性可以放置在任何信号、模块、实体或组件上。例如:

(* dont_touch = "true" *) wire sig1;

reference

  1. vivado-百度百科

  2. 介绍FPGA的综合

  3. Vivado综合设置选项分析:-gated_clock_conversion

  4. Vivado综合操作中的重定时(Retiming)

  5. Vivado综合设置选项分析:-shreg_min_size和-no_srlextract

最新文章

最新文章