很多FPGA工程师都会遇到timing的问题,如何让FPGA跑到更快的处理频率是永久话题。决定FPGA的timing关键是什么?如何才能跑到更快的频率呢?

A. 第一步需要了解FPGA的timing路径:

图1.时序模型

在任何设计中最普通的时序路径有以下4种:

1 输入端口到内部时序单元路径;

2 从时序单元到时序单元之间的内部路径;

3 从内部时序单元到输出端口之间的路径;

4 输入端口到输出端口之间的路径;

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。

  1. 器件:

本身的走线延时差异。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:

  1. 一般情况下对时序影响最大的有 “更改RTL代码 – 改变综合策略(选项) – 改变布局布线策略 – 更改约束文件”;

  2. 工具选择:

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时序分析和仿真是前仿真也称为功能仿真;前仿真不带有时序信息,所以存在一定的布局布线不正常的可能性;如果出现上述问题,建议可以使用后仿真也就是时序仿真,这样的功能测试最为可靠、准确,因为带有布局布线的时序信息。

Intro

问:一个FPGA设计项目需要用哪些评判标准来检验?

  1. 功能正确;
  2. 时序收敛;
  3. 资源消耗少。

时序收敛,即Timing Closure,意思是使设计的各项时序指标能满足设计前所制定要求。因此,整个过程分为两部分:

  1. 制定时序要求
  2. 满足时序要求

Timing Constraints Classes

制定时序要求通常是由整个系统电路的外部环境来决定的,比如:

  • 整个电路系统提供给FPGA的时钟速度为多快
  • FPGA输入数据是同步信号还是异步信号以及它的频率
  • FPGA输出数据所需的频率
  • 输入/输出数据与时钟的相位关系

总结以上各种需求情况,得出FPGA芯片对外的三种时序约束:

  • Period(时钟周期约束):约束用同一时钟驱动的寄存器(或同步器件)所能使用的最低时钟频率来保证FPGA内部同步信号的采样时间与保持时间。
  • Offset:约束用时钟采样数据(offset in)或用时钟打出数据(offset out)时时钟与数据的相位差来保证FPGA采样数据的建立时间与下一级芯片得到数据的采样时间。
  • Pad to Pad:当输入数据进入FPGA后没有经过任何同步器件(即由时钟驱动的器件如寄存器、BRAM等),只经过组合逻辑后就输出片外时,Pad to Pad的From…To..约束用以保证内部的延迟时间。

有了以上三种约束类型,就可以描述外界的任何可能条件,并清楚的对最终设计需要满足的时序要求作出说明,FPGA实现工具就会依据此要求进行布局布线,并试图满足要求。Xilinx有许多文档对怎样书写时序约束进行了说明。在此要强调的一点是:时序约束首先是对外界环境的一个反映,其次才是对布局布线工具的要求。时序约束向工具说明上游器件所给的信号是怎样的,下游器件又要求怎样的输入,FPGA实现工具才好依照此标准来综合、布局、布线,时序收敛的设计才可能在真正的电路环境中正常工作。

Timing Constraint File

这里有一个误区需要澄清:多数人认为Timing约束是写在UCF文件中的,其实UCF中的Timing约束只有在布局布线过程中才起作用。为了达到最好的时序性能,我们应该从综合开始就使用约束。不管是Xilinx XST,还是Synplify或者其他综合工具都可以添加时序约束。在综合过程就添加时序约束可以使综合器努力综合出合适的网表,这样在布局布线时就更容易满足时序要求了。

Debug

设计时序不收敛通常有以下的现象:

  • par报告布线完成,但是有timing error;
  • par报告由于不可能达到时序收敛而停止布局布线;
  • Timing Analyzer报告显示设计的timing score不为0;
  • 实际电路板上给定时钟速率FPGA工作不正常,降低时钟速率FPGA工作正常

如果降低时钟速率能让FPGA工作正常,而Timing报告又没有显示时序错误,那么有足够的理由怀疑时序约束没有完全约束到所有片内路径,需要仔细研究并完整约束整个设计。

那么设计中的Timing Error我们该怎么解决呢? 最简单的,两眼一抹黑,让工具解决:把map, par等工具的effor level提到最高,但通常情况下对结果的提升是不明显的。我们需要有选择地针对不同的情况使用不同的方法。以下来分析几种常见的情况:

Timing报告显示某一段net走线延时特别长

通过在FPGA Cross Probing中找到这根net。如果输入输出距离的确比较长,那么是由于Place问题造成的,要解决Place问题,需要检查为什么工具会把两个LUT/FF放得那么远,是相关的逻辑布局问题,还是因为引脚锁定导致无法移动逻辑的问题。

常用的解决方法可以对前级寄存器做复制寄存器的操作。参考Xilinx AR9410。

如果是因为输入/输出端连接的寄存器被Pack到IOB中导致寄存器无法移动,那么可以使用IOB=false约束将寄存器放在Slice Logic中。

Timing报告显示逻辑层次比较多,而这些层次中没有延时特别长的

如果是LUT到LUT的层次太多,那么可以先使用XST的register balancing功能。如果还是无法满足,可能需要手动调整组合逻辑,在中间插一级寄存器,并修改其他相关的代码,使得相关数据的latency一致。其他方法参考Xilinx AR9417。

如果是进位链太长,那么就要考虑使用两个小一点的计数器/加法器级联。当考虑到进位逻辑是纵向排列的,当超出一列时,进位会导致延时变长很多时,更需要注意进位链的长度。

如果是BRAM到后续FF的延时比较长,那么考虑几种情况:

  • BRAM的输出直接驱动FF,而且目标频率比较高,比如400-500MHz。为降低这段从BRAM到FF的TCO延时,那么应该使用BRAM Primitive内部的寄存器
  • BRAM的输出经过一些组合逻辑后驱动FF,而且目标频率比较低,<300MHz。为了将BRAM的TCO从这段路径中去除,应该在使用CoreGen生成BRAM时选择输出寄存器在Core中而不用Primitive的。
  • 如果目标频率又高,BRAM输出又经过了LUT再驱动FF,那么Primitive和Core中的寄存器最好都使用。这样既降低TCO,又缓解后续逻辑的时序要求。

参考Xilinx AR9412

Hold Violation

Hold Violation通常都是由Gated Clock引起。检查设计中没有使用门控时钟。门控时钟通常会由计数器分频产生。尽量都使用FPGA提供的时钟资源,尽量使用DCM做deskew。

Offset约束不满足

首先必须保证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跑多次实现挑最好的结果。

如果所有的尝试都无法满足先前制定的时序目标,那么可能是时候重新考虑一下目标是否合理了。

FPGA Timing笔记的更多相关文章

  1. FPGA学习笔记(三)—— 数字逻辑设计基础(抽象的艺术)

    FPGA设计的是数字逻辑,在开始用HDL设计之前,需要先了解一下基本的数字逻辑设计-- 一门抽象的艺术. 现实世界是一个模拟的世界,有很多模拟量,比如温度,声音······都是模拟信号,通过对模拟信号 ...

  2. FPGA学习笔记(二)——FPGA学习路线及开发流程

    ###### [该随笔部分内容转载自小梅哥]       ######### 一.FPGA学习路线 工具使用 -> 语法学习 -> 逻辑设计 -> IP使用 ->接口设计 -& ...

  3. FPGA学习笔记(一)——初识FPGA

    ###### [该随笔部分内容转载自小梅哥]       ######### FPGA(Field-Programmable Gate Array,现场可编程门阵列),正如其名,FPGA内部有大量的可 ...

  4. FPGA学习笔记(七)——FSM(Finite State Machine,有限状态机)设计

    FPGA设计中,最重要的设计思想就是状态机的设计思想!状态机的本质就是对具有逻辑顺序和时序规律的事件的一种描述方法,它有三个要素:状态.输入.输出:状态也叫做状态变量(比如可以用电机的不同转速作为状态 ...

  5. Artix-7 50T FPGA试用笔记之Create a simple MicroBlaze System

    前言:之前笔者的试用博文提到安富利这块板子非常适合MicroBlaze开发,同时网上关于MicroBlaze的资料非常少(或含糊不清),没有一篇能完整介绍VIVADO SDK的设计流程,所以笔者带来这 ...

  6. Xilinx FPGA 学习笔记

    一.时序设计 方法1.通过状态机来实现,通过verilog控制FPGA,让它该快的时候快,该慢的时候慢. 方法2.FPGA中运行CPU 把逻辑控制顺序复杂的事情用C代码来实现,而实时处理部分用veri ...

  7. FPGA学习笔记之Altera FPGA使用JIC文件配置固化教程(转)

    很多做过单片机的朋友都知 道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部.即使MCU断电了再重新上电,程序也能继续运行.这是因为对MCU烧写固件 的实质就是将程序固件写入到M ...

  8. FPGA学习笔记(八)—— 状态机设计实例之独立按键消抖

    ###### [该随笔中部分内容转载自小梅哥] ######### 独立按键消抖自古以来在单片机和FPGA中都是个不可避免的问题,首先,解释一下什么叫做按键抖动,如图,按键在按下和松开的那个瞬间存在大 ...

  9. FPGA学习笔记(六)—— 时序逻辑电路设计

    用always@(posedge clk)描述        时序逻辑电路的基础——计数器(在每个时钟的上升沿递增1) 例1.四位计数器(同步使能.异步复位) // Module Name: coun ...

随机推荐

  1. Building a RESTful Web Service

    Reference: https://spring.io/guides/gs/rest-service/ 参照上述链接进行操作,使用gradle build. 因为total new to this. ...

  2. 【历史】JavaScript和Java没啥关系!————JavaScript简史

    文章的开始先上张图: 图片拍摄自北京图书大厦,代表着现在国内应该是绝大部分书店的现状--Javascript书籍放在Java类当中.甚至很多业内人也一直认为Javascript是Java语言在浏览器内 ...

  3. 原生AJAX封装

    var ajaxHelper = { /*1.0 浏览器兼容的方式创建异步对象*/ makeXHR: function () { //声明异步对象变量 var xmlHttp = false; //声 ...

  4. Python中的map( )和reduce( )

      1.变量可以指向函数,也可以使用变量和参数的形式完成函数调用.   2.那么函数名是什么呢?函数名其实就是指向函数的变量!对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个可以计算 ...

  5. spring3.0使用annotation完全代替XML(续)

    从回帖的反应来看,大多数人还是不赞成完全代替XML的,这点倒是在意料之中.我个人还是倾向于用代码来取代XML的Bean定义,当然这更多的是关乎个人偏好,不代表与我观点不同的人就是错的. 先来说说代码相 ...

  6. JAVA面试逻辑题1

    一.计算推理 烧香问题: 有两根不均匀分布的香,每一根烧完的时间都是一小时.用什么办法确定一段15分钟的时间? 解题步骤: 1.点燃第一根的两头,同时点燃第二根的一头: 2.等到第一根燃尽以后,再点燃 ...

  7. java分享第十七天-02(封装操作excel类)

     java解析EXCEL用的是POI的JAR包,兼容EXCEL2003及2007+版本的EXCEL所需要的JAR包:poi-3.8.jarpoi-ooxml.jarpoi-ooxml-schemas. ...

  8. About_PHP读写文件

    1.PHP部分文件操作函数:fopen ,fread ,filesize,fwrite,fclose 2.unlink() rmdir() 删除函数 unlink() 删除文件函数:unlink(路径 ...

  9. WIN32 窗口封装类实现

    CQWnd.h窗口类定义 // QWnd.h: interface for the CQWnd class. // ////////////////////////////////////////// ...

  10. [LintCode] Intersection of Two Linked Lists 求两个链表的交点

    Write a program to find the node at which the intersection of two singly linked lists begins. Notice ...