本文原始位置:FPGANotes Blog

http://wiki.fpganotes.com/doku.php/ise:timing:my_summary

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跑多次实现挑最好的结果。

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

说说Timing这回事(转载)的更多相关文章

  1. 三、putty工具常见设置

    转载自:https://www.cnblogs.com/hdk1993/p/4769072.html Putty是一个免费小巧的Win32平台下的telnet,rlogin和ssh客户端. 它的主程序 ...

  2. 【转载】利用window.performance.timing进行性能分析

    利用window.performance.timing进行性能分析   性能分析... window.performance.timing中相关属性语义: // .navigationStart 准备 ...

  3. 转载:原来JavaScript的闭包是这么回事!

    相关阅读:https://www.itcodemonkey.com/article/8565.html

  4. [转载] TLS协议分析 与 现代加密通信协议设计

    https://blog.helong.info/blog/2015/09/06/tls-protocol-analysis-and-crypto-protocol-design/?from=time ...

  5. C#中的 特性 详解(转载)

    本篇幅转载于:http://www.cnblogs.com/rohelm/archive/2012/04/19/2456088.html C#中特性详解 特性提供了功能强大的方法,用于将元数据或声明信 ...

  6. 99%的人都理解错了HTTP中GET与POST的区别(转载

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  7. RS-232 vs. TTL Serial Communication(转载)

    RS-232串口一度像现在的USB接口一样,是PC的标准接口,用来连接打印机.Modem和其他一些外设.后来逐渐被USB接口所取代,现在PC上已经看不到它的身影了.开发调试时如果用到串口,一般都是用U ...

  8. S3C2440上RTC时钟驱动开发实例讲解(转载)

    嵌入式Linux之我行,主要讲述和总结了本人在学习嵌入式linux中的每个步骤.一为总结经验,二希望能给想入门嵌入式Linux的朋友提供方便.如有错误之处,谢请指正. 共享资源,欢迎转载:http:/ ...

  9. C# 中的委托和事件(转载)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

随机推荐

  1. C#的选择语句练习1

    1.请输入一个数x,若x<1,则y=x:若1<=x<10,则y=2x-1:若x>=10,则y=3x-11,要求随意输入一个x值,求出y值. 2.输入问题[你有房子吗?],若回答 ...

  2. final关键字

    1.final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的.在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会再 被扩展,那么就设计为fi ...

  3. dict

    1.创建新字典(根据语法和dict初始化方法) >>> my_dict={'a':1,'b':2,'c':3} >>> my_dict=dict({'a':1,'b ...

  4. 如何配置网络使得宿主机能够访问VM数据库?

    https://www.zhihu.com/question/23955166 背景:公司内外网区分,不能同时上,局域网内得手动切换两个网络,分别访问外网或者内网,ip是动态获取的.现在本机上装有vm ...

  5. Atom安装activate-power-mode插件(震动炫酷)

    1.下载安装Atom,地址:https://atom.io/ 2.下载安装activate-power-mode插件,地址:https://github.com/JoelBesada/activate ...

  6. epoll 反应堆

    epoll反应堆模型 ================================ 下面代码实现的思想:epoll反应堆模型:( libevent 网络编程开源库 核心思想) . 普通多路IO转接 ...

  7. js取整函数

    1.丢弃小数部分,保留整数部分parseInt(5/2) 2.向上取整,有小数就整数部分加1 Math.ceil(5/2) 3,四舍五入. Math.round(5/2) 4,向下取整 Math.fl ...

  8. SDDC-SDN-SDS

    SDDCSDNSDS软件定义存储是一个较大的行业发展趋势,这个行业还包括软件定义网络(SDN)和软件定义数据中心(SDDC). SDDC依赖于虚拟化和云计算技术, SDDC的目标是虚拟化数据中心的一切 ...

  9. D3的基本设计思路

    学习一项新技术,首先要搞清楚它的基本设计思路,有了这个宏观的技术架构,使用该技术起来,就会得心应手了.否则,就会不知道如何下手,即使看到人家的例子程序,可能也不知其所以然. 下面,就简单的结合自己研究 ...

  10. Three.js开发指南---使用构建three.js的基本组件(第二章)

    .gui本章的主要内容 1 场景中使用哪些组件 2 几何图形和材质如何关联 3 正投影相机和透视相机的区别 一,Three所需要的基本元素 场景scene:一个容器,用来保存并跟踪所有我们想渲染的物体 ...