不少FPGA工程师都会遇到timing的问题,如何让FPGA跑到更快的处理频率是永久话题。决定FPGA的timing关键是什么?如何才能跑到更快的频率呢?算法
A. 第一步须要了解FPGA的timing路径:编程
图1.时序模型api
在任何设计中最普通的时序路径有如下4种:多线程
1 输入端口到内部时序单元路径;异步
2 从时序单元到时序单元之间的内部路径;工具
3 从内部时序单元到输出端口之间的路径;布局
4 输入端口到输出端口之间的路径;post
B.第二步须要可以读懂FPGA的timing报告,从而找到影响timing的问题;性能
图2.时序路径报告测试
1. FPGA的工具都会有详细的timing report;从ISE的结果咱们能看到是否知足timing?timing score的数字越大表明和预期结果误差越大;
图3. Timing summary
一般大的FPGA设计中跑一次bit文件时间很长,为了可以一次把不知足的timing报告出来,首先须要将ISE的设置从默认的3更改成较大的数字(100,200等);
图4.ISE map setting
2. 时序报告的阅读
一般时序单元(寄存器)之间的组合逻辑计算延时和布线时间是影响FPGA timing的关键。
其中组合逻辑计算和逻辑深度(级数)相关;而布线延时和信号的扇出大小、器件类型、版本的资源占用状况相关;
通常状况下图2中logic和route 都在50%附近是比较均衡的,也是比较理想的状况;
逻辑工程师可以经过阅读时序路径报告,找到代码中相应存在的时序问题;
最好结合timing analyzer 和FPGA editor 一块儿使用,可以直观看到路径走线,延时信息等;(点击蓝色路径便可)
时序路径报告一般按类分析
图5.时序分类
FPGA的Timing Part 2
FPGA中影响时序的因素
咱们知道FPGA和ASIC的区别之一是FPGA可以屡次编程,而屡次版本的结果是每次布线的结果都不尽相同,每次布线结果能够在FPGA editor 中查看。
随着FPGA器件规模和代码功能复杂度的提升,FPGA工程师在完成代码编写后,极可能至关大一部分精力是在完成bit file ,可测试的合格的加载文件首先须要知足Timing。影响时序的因素能够分为器件、工具和策略、设计和coding。
器件:
自己的走线延时差别。FPGA根据器件的不一样,速率等级的不一样都会有响应的时序模型差别,图1是寄存器CLK to Q的在Kintex7 器件不一样速率等级的差别,
红色框表明-3器件,也是最快的。这些参数在每款器件的datasheet都有详细的数值。图1只是一个举例,LUT的查表延时更为关键。
图1.器件手册延时信息
另外器件不一样,FPGA自己的布线资源多少也不一样;若是须要完成FPGA的P &R和同时知足时序,有足够的布线资源固然最好。然而布线资源并不像逻辑规模同样可以以LE or LC数目体现。咱们知道Spartan6 的布线资源就比较紧张,必定程度上就限制了版本的资源占用率(Timing 要求高时)。
B.工具和策略:
咱们知道FPGA的工具都有不少选项和设置,最容易理解的是area/speed/Balance ; 这些不一样的设置可以影响到综合、布局、布线的效果。从而在不更改FPGA代码的前提下有效地影响timing;固然,工程师须要理解设置含义,不然不合理的设置会拔苗助长哦!
图2.ISE的综合设置
C. 设计和coding
组合逻辑的深度极大的影响FPGA的时序,这个比较容易理解;LUT or Slice的级数决定了关键路径。工程师coding的技巧和能力决定了整个代码timing的结果,若是写代码时可以联想到综合结果将RTL转化到电路的结构,Slice的占用状况;Timing 必定很好了,^_^ 请你们平时积累设计技巧和方法!
改善FPGA时序的Tips
咱们知道不少方法能够改变时序,好比优化代码,改变综合策略等。下面一块儿讨论比较通用的改善时序的Tips:
通常状况下对时序影响最大的有 “更改RTL代码 – 改变综合策略(选项) – 改变布局布线策略 – 更改约束文件”;
工具选择:
FPGA工具:xilinx目前有ISE和Vivado,对于大的设计和28nm器件工具自己的效率和算法改善会极大的影响布线结果。图3是很早的布线结果对比,对比很直观明显。
图3. ISE VS vivado 布线结果对比
第三方综合工具:
在V5-V6的时代,第三方综合工具synplify等综合结果对时序的改善仍是很明显的。这里多是由于synplify等在综合时有时序约束信息的导入。目前vivado一样在综合时一样有时序概念,个别设计第三方工具改善效果不明显了。
3. 改善关键信号的扇出;
A. 对于信号的大扇出在复杂的设计中很是容易出现,大扇出的存在首先影响到时序,其次会影响布线时间,引发congestion. 大扇出首先会引发布线延迟的增长,成为工具分析的关键路径,改善大扇出信号首先经过工具。
B. 另外经过手工RTL复制寄存器的方法最为有效、直接。
4. 分析工程时序约束是否合理;
FPGA工程师首先要明确时序约束是否合理,通常状况下不要过约束时钟频率。
另外设计自己是否可以放松部分路径,设置multi- cycle / false path,这样可以释放布线资源解决关键路径。
5. 改善clock uncertainty;
A. 锁相环的VCO越高越可以有效减少clock uncertainty;
B. 当锁相环输出多路时钟时,较高的时钟设置在clk_out1;
C. 锁相环抖动option设置为 输出最小抖动模式;
改善FPGA时序的Tips
A.代码的写法、多用寄存器pipeline;
随着FPGA规模愈来愈大,寄存器资源更是成倍增加;当设计时尽可能可以充分pipeline,尤为是关键模块之间,关键信号和大位宽信号的多级延时可以有效改善时序。
Remember FFs are cheapin the FPGA. Timing closure is not!
图1.代码没有充分pileline是不会工做到高频率
B.FPGA尽可能使用硬核资源;
工程师实现功能时,尽量使用硬核资源,如BRAM、DspSlice等;这些硬核具备内置pipeline,不占用额外布线资源,并且运行速度比逻辑快得多。
C.当不知足时序时,经过多线程的方法尽快找到最佳策略;
Vivado工具可以支持多核多线程,若是您的电脑是多核;能够同时运行综合和布局布线的多个策略,这样可以快速时序收敛。
图2.vivado不一样策略 create New Runs
D.IP、硬核的设置;
图3. IP FIR的优化选项
E. 关于代码复位原则,能同步复位不用异步复位,能不用复位尽可能不复位。经过寄存器初值设定;若是复位,则是高复位。
附:目的是减小布线资源使用,减小额外LUT的使用。这一点在xilinx 推荐的代码规范中都会介绍。
F. 尽可能减小高级约束语句,如区域约束的Pblock;
高级约束语句,From To 、Pblock等优先级很高;在必定程度上可以改善时序,但若是版本增长不少高级约束,则会影响布局布线的效果,反而会恶化整个版本的时序。
G.硬件设计对Timing的影响
随着FPGA愈来愈大,跨bank之间的走线延迟也会增长。在硬件设计时,FPGA工程师须要使用Floorplan 来查看数据流的走向,按照数据流来分配FPGA的管脚;这样可以提高IO 接口的Timing;
在设计初期常常打开底层还能有效下降额外走线延迟,FPGA目前有不少硬核,如PCI-E、PowerPC 、MCB、ARM等;这些硬核会影响信号的走线的,请务必注意。
图4.充分利用工具的IO plan 和Floor plan
Timing几个问题和解决方法:
布线看起来走线很短,但延迟很大,可能性?
A. 布线收到了硬核的影响,布线须要绕过硬核;通常是不合理的pinout引发;
图1.硬核对布线的影响
B. 在资源占用尤为大的状况下,工具为了解决congestion 也会弯曲走线;
版本有chipscope 测试功能正常,去掉chipscope反而出现功能不稳定,可能性?
不少客户测试都会增长探针来测试,方便定位代码bug;加入探针先后客户测试功能会有异常,因而客户对布局布线有必定怀疑。
A. 是否加入chipscope 会引发布局布线的变化,若是时序知足约束;首先要检查设计是否有异步设计存在风险? 由于你们知道跨时钟域的代码是经过设计来保证的,工具不可以正常分析。
B.重点检查接口代码是否存在设计的不可靠性;
一个很大的设计布线完成,但存在较小的Timing score,是否有办法解决?
A. 对于大的设计,工具的布局布线每每占用工程师不少精力;不少状况下,布局布线会存在不多不知足的路径。这类路径常常出如今接口上,对于不知足Timing的bit文件,测试也会以为不可靠,是否有版本尽快的close Timing呢 ?
1. 首先使用FPGA editor 打开不知足的时序的post place and Route的设计;
图2.FPGA editor 找到fail 路径
2.找到接口中不知足Timing路径的寄存器或Slice或BRAM;
3.经过阅读时序信息,手工布局布线拖动位置(屡次尝试);
4.Tool – DRC – Timing Report (修改布线位置后的Timing结果);
5.若是DRC检查ok, Timing 结果知足;FPGA editor直接能够 Run bitgen;
这样作的好处是可以很快的(几分钟)产生须要测试的版本。
时序知足,功能不正常,有哪些可能性?
一般FPGA时序分析和仿真是前仿真也称为功能仿真;前仿真不带有时序信息,因此存在必定的布局布线不正常的可能性;若是出现上述问题,建议可使用后仿真也就是时序仿真,这样的功能测试最为可靠、准确,由于带有布局布线的时序信息。
问:一个FPGA设计项目须要用哪些评判标准来检验?
时序收敛,即Timing Closure,意思是使设计的各项时序指标能知足设计前所制定要求。所以,整个过程分为两部分:
制定时序要求一般是由整个系统电路的外部环境来决定的,好比:
总结以上各类需求状况,得出FPGA芯片对外的三种时序约束:
有了以上三种约束类型,就能够描述外界的任何可能条件,并清楚的对最终设计须要知足的时序要求做出说明,FPGA实现工具就会依据此要求进行布局布线,并试图知足要求。Xilinx有许多文档对怎样书写时序约束进行了说明。在此要强调的一点是:时序约束首先是对外界环境的一个反映,其次才是对布局布线工具的要求。时序约束向工具说明上游器件所给的信号是怎样的,下游器件又要求怎样的输入,FPGA实现工具才好依照此标准来综合、布局、布线,时序收敛的设计才可能在真正的电路环境中正常工做。
这里有一个误区须要澄清:多数人认为Timing约束是写在UCF文件中的,其实UCF中的Timing约束只有在布局布线过程当中才起做用。为了达到最好的时序性能,咱们应该从综合开始就使用约束。无论是Xilinx XST,仍是Synplify或者其余综合工具均可以添加时序约束。在综合过程就添加时序约束可使综合器努力综合出合适的网表,这样在布局布线时就更容易知足时序要求了。
设计时序不收敛一般有如下的现象:
若是下降时钟速率能让FPGA工做正常,而Timing报告又没有显示时序错误,那么有足够的理由怀疑时序约束没有彻底约束到全部片内路径,须要仔细研究并完整约束整个设计。
那么设计中的Timing Error咱们该怎么解决呢? 最简单的,两眼一抹黑,让工具解决:把map, par等工具的effor level提到最高,但一般状况下对结果的提高是不明显的。咱们须要有选择地针对不一样的状况使用不一样的方法。如下来分析几种常见的状况:
经过在FPGA Cross Probing中找到这根net。若是输入输出距离的确比较长,那么是因为Place问题形成的,要解决Place问题,须要检查为何工具会把两个LUT/FF放得那么远,是相关的逻辑布局问题,仍是由于引脚锁定致使没法移动逻辑的问题。
经常使用的解决方法能够对前级寄存器作复制寄存器的操做。参考Xilinx AR9410。
若是是由于输入/输出端链接的寄存器被Pack到IOB中致使寄存器没法移动,那么可使用IOB=false约束将寄存器放在Slice Logic中。
若是是LUT到LUT的层次太多,那么能够先使用XST的register balancing功能。若是仍是没法知足,可能须要手动调整组合逻辑,在中间插一级寄存器,并修改其余相关的代码,使得相关数据的latency一致。其余方法参考Xilinx AR9417。
若是是进位链太长,那么就要考虑使用两个小一点的计数器/加法器级联。当考虑到进位逻辑是纵向排列的,当超出一列时,进位会致使延时变长不少时,更须要注意进位链的长度。
若是是BRAM到后续FF的延时比较长,那么考虑几种状况:
Hold Violation一般都是由Gated Clock引发。检查设计中没有使用门控时钟。门控时钟一般会由计数器分频产生。尽可能都使用FPGA提供的时钟资源,尽可能使用DCM作deskew。
首先必须保证offset写得是正确的。
而后保证输入/输出数据一进FPGA就用寄存器打一拍,中间不要加组合逻辑。寄存器Pack到IOB中能最大限度得保证Offset约束被知足。(同理,如上所述,不把寄存器放在IOB中将有利于Period约束。)
若是仍是知足不了,可能须要调整一下时钟和数据的相位。可使用DCM Phase Shift调整时钟相位或IDELAY调整数据相位。
在制定Pinout时能够有意地将一组总线按内部IOB的位置排列,低有效位在下方,高有效位在上方,而不是按外部Pinout的位置排列。
若是以上方法都已经使用而且离目标还差一点点,那么能够试图使用工具的某些属性,好比:
map * Timing Driven Packing * Effort Level, Extra Effort * Global Optimization * Allow Logic Optimize Across Hierarchy * Combinational Logic Optimization * Cost Table par * Effort Level * Extra Effort
也可使用MPPR或Xplorer跑屡次实现挑最好的结果。
若是全部的尝试都没法知足先前制定的时序目标,那么多是时候从新考虑一下目标是否合理了。