以Vivado工具为例了解FPGA综合
Vivado设计流程
使用Vivado进行设计开发的步骤如下:
- 功能设计:使用HDL语言设计、自带或者第三方的IP、嵌入式处理器等。
- 综合:在综合时可以加入第三方的网表文件和约束文件。
- 实现:在Vivado实现的步骤中,必须要执行的有三个opt_design、place_design、route_design。
在设计过程中,各个阶段的生成的文件都是.dcp,Vivado使用的是通用的模型贯穿在设计。
Checkpoint文件
Checkpoint文件是Vivado运行工程设计后存储的信息及设计相关文件的文件格式,同时也是Vivado中使用的通用数据库,在Checkpoint中包含:
- 网表:Logical Netlist (EDIF)
- 约束:Constraints (XDC)
- 物理数据:Physical Data (XDEF)
不同情况下,不同dcp用到的网表文件可能不同。
IP为核心
Vivado设计理念是以IP为核心,使用过Vivado的人都知道在vivado中有block design这个类似画布的东西,在这个界面里可以把IP进行嵌入,通过鼠标进行连接链路,搭建属于自己的数字积木。
综合
综合是FPGA设计中不可缺少的环节,综合就是把HDL语言/设计转换为综合网表的过程。综合网表会包含已经转化后的逻辑设计所对应的资源模块,包括组合逻辑器件、寄存器,FPGA特有的各种原语(Primitive),内部的硬核模块等,同时会描述这些模块的属性和约束信息。
打开vivado后,右键综合选项,可以配置该工程的综合设计。
在综合设置中,可以根据实际需求进行设定综合的约束文件,综合策略,以及制定综合过程的相关优化策略。
综合选项使用分析(vivado 2020.2)
strategy
可以对综合进行不同优化策略设计,使得设计满足相应的需求。
下面对上述综合设计中的选项进行分析说明:
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被其他逻辑用做时钟,那么就构成了门控时钟电路。
门控时钟会对设计带来一些负面影响。典型的危害包括:时钟信号可能会有毛刺;时钟歪斜(Clock Skew)会恶化。同时,一个不可忽略的影响是Vivado并不会对门控时钟主动插入BUFG,这就意味着该时钟会占用传统的布线资源也就是Fabric中的布线资源而不会使用时钟网络资源,从而可能会跟其他关键路径争夺布线资源,影响时序。
-gated_clock_conversion可将门控时钟信号变为使能信号,对于上图所示门控电路,Vivado可将其优化为下图所示电路。此时,clk_div_2被转化为使能信号连接到了下级触发器的使能端口,而下级触发器的时钟端口则与主时钟clk连接,从而移除了门控时钟。
-directive
可以指定综合时的使用相关优化指令,可以针对性的去进行优化设计。
- 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资源。
例如下图:
乍一看,如果不使能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中,但此时需占用查找表资源。
UG949(V2017.4版本)Table 5-9 给出了控制集的百分比(适用于7系列FPGA和UltraScale FPGA),如下图所示。可以看到当这个百分比超过15%时,表明需要降低控制集。
-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种不同的值,填入不同值后,会生成不同的结构。
- (* 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资源:
- 乘法
- 乘加操作
- 乘减操作
- 乘累加操作
其余的加法,减法,累加则会默认使用逻辑资源去实现。该属性会覆盖默认行为并强制将这些结构强制转换为DSP48块,并将其置于RTL中signals,architectures和components,entities和module上,具有以下优先级:
Signals > Architectures and components > Modules and entities
dont_touch
使用dont_touch可以防止相关内容被逻辑优化,此属性可以放置在任何信号、模块、实体或组件上。例如:
(* dont_touch = "true" *) wire sig1;
reference
- vivado-百度百科
- 介绍FPGA的综合
- Vivado综合设置选项分析:-gated_clock_conversion
- Vivado综合操作中的重定时(Retiming)
- Vivado综合设置选项分析:-shreg_min_size和-no_srlextract
以Vivado工具为例了解FPGA综合相关推荐
- 通过vivado工具实现zynq的FPGA内部RAM读写
通过vivado工具实现zynq的FPGA内部RAM读写(调用vivado自带IP核),从新建工程到仿真并下载到FPGA开发板中,通过vivado自带的ILA逻辑分析仪查看读写数据是否正确,包含详细步 ...
- 什么样的电脑配置跑Vivado FPGA综合最快?
写在前面 刚好上个礼拜新配了一台12代酷睿12700F+32G内存的电脑拿来跑vivado,这么来看还是很符合作者观点的. 转载自:什么样的电脑配置跑Vivado FPGA综合最快? 开场白 本人业余 ...
- 无招胜有招-Vivado非工程模式下的FPGA设计流程
参考:UG892 UG835 Vivado集成开发工具为设计者提供了非工程模式下的FPGA设计流程.在Vivado非工程模式下,FPGA开发人员可以更加灵活地对设计过程的每个阶段进行控制,从而进一步提 ...
- 软件测试 通用技术03 测试用例 黑盒测试用例设计方法 等价类划分法 边界值分析法 判定表法 场景法 功能图法 其他用例设计方法 用例设计方法综合选择
文章目录 1 测试用例 1.1 测试用例的定义 1.2 测试用例模板 1.3 测试用例模板的内容 测试用例编号 测试项 依赖用例 测试步骤 测试数据 预期结果 测试结果 测试人 备注 2 测试用例编写 ...
- 【Vivado使用】从0开始 综合后生成门级网表
1.创建工程 vivado界面介绍 源码视图,加号添加文件.Design Sources 为设计源文件, Constraints 约束文件,Simulation Sources 仿真文件 工艺流程视图 ...
- 黑盒测试用例设计方法三(正交实验法、功能图法、用例设计方法综合选择)
测试步骤 一.正交实验法 1.1正交实验法介绍 1.2正交实验法实现步骤 1.3实际案例 二.功能图法 2.1功能图法原理介绍 2.2功能图法实现步骤 2.3实践案例 三.其他用例设计方法 3.1测试 ...
- 基于Quartus II软件的FPGA综合实验——多功能数字钟
有很多自制元器件,内部电路附在文章中 文章目录 前言 一.设计要求 二.设计原理 三.设计过程 1.数码管扫描模块 2.计时模块 3.闹钟模块 4.闹钟响铃模块 5.数码管显示模块 6.整点报时功能 ...
- 虹科干货 | BI软件如何实时连接本地Excel?—以HK-Domo商业智能工具为例
由于资源和人才的限制,很多中小微企业目前在数据收集和数据应用上还处于比较落后的阶段,没有合适的方法处理数据.最典型的情况就是通过Excel收集数据,然后频繁的手动生成报告.这样会导致数据质量差,流程重 ...
- Vivado 随笔(3) 其他综合属性 dont_touch、fsm_encoding?
目录 dont_touch fsm_encoding dont_touch 可以参考: Vivado中如何避免信号被优化掉? fsm_encoding 我们在RTL设计中,在状态机的设计中,会给状态变 ...
最新文章
- R语言单变量分析实战:汇总统计(Summary Statistics)、频率表(Frequency Table)、图表(charts: boxplot、histogram、density)
- linux下glew例子,一个简单的GLSL Shader例子
- 卸载阿里云服务器的mysql_阿里云服务器入门教程
- java web start error_java web start——启动文件错误,没法启动指定应用程序这个问题如何解决?谢谢...
- 计算机视觉与深度学习 | SLAM综述(自主移动机器人同时定位与地图创建)
- PHP手机壳DIY定制平台源码 Thinkphp内核开发
- python怎么隐藏输入法,隐藏输入法和弹出输入法
- springboot框架笔记——springboot提供的自动配置
- 阿里云云计算6 ECS的概念
- REACT打印页面组件
- 牛腩新闻发布系统-发布
- 商城项目(一) -- 项目简介、基础搭建及前端部分
- 【平面设计基础】01:抠图—薄、透、露的朦胧美
- 【Caffe安装】caffe安装系列——史上最详细的安装步骤
- 如何使用“友宝”app在自动售水机上使用“友宝钱包”支付。
- 感应熔炼设备市场现状及未来发展趋势分析
- 不等号属于不等式吗_什么是不等式
- 国产安路FPGA(一)-TD软件使用及问题记录
- 简单答题系统(判断题)
- 【前端必备】使用NodeJs写接口(本地连接MySQL + 连接到云服务MySQL)