草庐IT

FPGA时序约束与分析

☆柒⑦☆ 2023-05-14 原文

目录

1 时序约束概述

1.1 什么是时序约束 

1.2 为什么要做时序约束 

1.3 时序约束的基本路径 

1.4 时序约束的基本流程 

1.5 时序约束的主要方法  


参考书吴厚航的《FPGA时序约束与分析》

1 时序约束概述

1.1 什么是时序约束 

 对系统延时(时序)有要求的情况下,不能指望FPGA编译工具自己“猜测”或靠”碰运气“保证系统延时要求得到满足。需要将对系统的所有时序要求通过时序约束的方式告诉FPGA编译工具。这样,FPGA编译工具工作起来就会有的放矢。而且布局布线结束后,也可以通过查看开发工具给出的时序分析报告确认时序要求执行的状况。这正是对FPGA设计进行时序约束和时序分析的意义所在。

1.2 为什么要做时序约束 

 没有任何设计约束的工程如同“脱缰的野马”般漫无目的且随意任性;但是任何的设计过约束或欠约束都可能导致时序难以收敛(难以达到设计要求)。因此,为了达到特定应用的设计要求,设计者必须设定合理的时序约束。

过约束:约束过于严格,超过实际设计的要求,有限的资源无法合理分配,导致其他功能块收到影响

欠约束:设计过于松散,低于实际设计的要求

1.3 时序约束的基本路径 

 FPGA时序约束所覆盖的时序路径主要有如下4类

  • FPGA内部寄存器之间的时序路径,简称reg2reg
  • 输入引脚到FPGA内部寄存器的时序路径,简称pin2reg
  • FPGA内部寄存器到输出引脚的时序路径,简称reg2pin
  • 输入引脚到输出引脚之间的时序路径(不通过寄存器),简pin2pin

前三类约束的目标是确保数据信号在时钟锁存沿的建立时间和保持时间内是稳定不变的;

第四类约束目标是直接约束路径的时延值范围。

1.4 时序约束的基本流程 

 从时序约束本身来说,通常可以分为以下4个主要步骤,即

  • 时钟约束:主时钟、虚拟时钟、衍生时钟
  • 输入/输出接口约束:系统同步、源同步
  • 时钟分组和跨时钟约束:异步
  • 时序例外约束:多周期路径、虚假路径

以下按照时序约束的编译先后和优先级高低,自上而下的罗列了推荐的设计约束

##时序约束

#primary clocks(主时钟)

#virtual clocks(虚拟时钟)

#generated clocks(衍生时钟)

#clock groups(时钟组)

#bus skew constraints(总线偏斜约束)

#input and output delay constraints(输入和输出延迟约束)

##时序例外约束

#false paths(假路径)

#max delay/min delay(最大延迟/最小延迟)

#multicycle paths(多周期路径)

#case analysis(案例分析)

#disable timing(禁用时序)

##物理约束

1.5 时序约束的主要方法  

  1. 使用编译软件(Vivado或Quartus)提供的GUI进行时序约束 
  2. 手动编辑XDC文件的方式输入约束脚本 

2 基本的时序路径 

2.1 时钟偏差

FPGA内部集成的PLL产生的时钟信号:FPGA编译工具在做时序分析时可以直接套用既有的模型给出时钟的偏差参数,作为一部分需要预留的时序余量计算在内。

外部晶振所产生的时钟信号:设计者需要指定相关的时钟偏差参数,以时序约束的方式告诉FPGA编译工具,这些偏差参数的获取方式是查看晶振规格文档

重点关注文档中时钟精度(Frequency Tolerance)、时钟温漂(Frequency versus Temperature Characteristics)和时钟抖动(Jitter)这几个参数。 

规格书中15ppm意思是每秒会产生15微秒的偏差

2.2 建立时间与保持时间 

建立时间:指时钟上升沿来到之前数据必须保持稳定的时间

保持时间:指时钟上升沿到来以后数据必须保持稳定的时间 

导致亚稳态的原因:

  • 由于整个路径的延时过长,导致数据在时钟上升沿的建立时间内才到来,即建立时间内数据还未能稳定下来,则数据就无法在时钟上升沿被锁存,处于不确定状态。
  • 由于数据传输的太快,原本应该在下一个时钟沿到达的数据,竟然在当前时钟沿的保持时间还没过去就来到了,则数据也无法在时钟上升沿被锁存,处于不确定状态。

一个数据要想在时钟上升沿被锁存,那么这个数据就必须在这个时钟上升沿的建立时间和保持时间内保持稳定,即数据不能发生任何变化。

注:书中20页的例子有助于理解

2.3 寄存器到寄存器的时序路径分析 

 对于reg2reg路径,只要告诉FPGA编译工具他们的时钟频率时序设计工具便会将时钟周期,建立时间,保持时间等相关参数带入特定的公式,计算这条reg2reg路径允许的延时范围

建立时间余量的计算公式如下

保持时间余量的计算公式如下

2.4 引脚到寄存器的时序路径分析 

FPGA和外部芯片的通信接口,根据他们时钟来源可以分为系统同步接口源同步接口。

系统同步接口FPGA和外部芯片之间的通信时钟都由外部同一时钟源产生;

源同步接口:FPGA和外部芯片之间的通信时钟都由源寄存器的输出端产生;

2.4.1 系统同步接口的路径分析

建立时间余量的计算公式如下

 保持时间余量的计算公式如下

 式中只有数据从FPGA器件的引脚到目的寄存器的输入端的延时时钟信号从FPGA器件的引脚到目的寄存器的输入端的时钟网络延时不确定,其余参数都可以在芯片手册中查到,而时钟信号从FPGA器件的引脚到目的寄存器的输入端的时钟网络延时在编译时硬件会自动给出,是一个较小的定值,所以需要通过set_input_delay命令设置FPGA器件的引脚到目的寄存器的输入端的延时的最大最小值,最大最小值约束公式如下:

2.4.2 源同步接口的路径分析 

建立时间余量的计算公式如下

保持时间余量的计算公式如下

 用于建立和保持时间分析的set_input_delay(max)set_input_delay(min)公式如下

其中,不论是系统同步接口还是源同步接口,芯片手册中可能未给出的值,但是可以通过芯片的建立时间和保持时间计算:

  •  =时钟周期-建立时间
  •  =保持时间

2.5 寄存器到引脚的时序路径分析 

2.5.1 系统同步接口的路径分析 

建立时间余量的计算公式如下 

保持时间余量的计算公式如下 

同引脚到寄存器,这里不做分析,需要通过set_output_delay命令设置FPGA器件的目的寄存器到引脚的输入端的延时的最大最小值,最大最小值约束公式如下:

 2.5.1 源同步接口的路径分析 

  建立时间余量的计算公式如下 

保持时间余量的计算公式如下  

 最大最小输出延时计算公式

2.5 引脚到引脚的时序路径分析  

通过set_max_delayset_min_delay这两条约束命令分别指定某个输入引脚到某个输出引脚的最大最小时延值,这个时延值取决于实际应用,没有通用公式。 

3 主时钟与虚拟时钟约束

3.1 主时钟约束 

主时钟约束的基本语法如下 

create_clock -name<clock_name> -period<period> -waveform{<rise_time><fall_time>} [get_ports<port_name>]
  • clock_name是设计者自定义的主时钟名称,如果不指定,则会默认使用port_name所指定的时钟物理节点
  • period是主时钟周期,单位ns
  • get_ports表示定义的时钟是FPGA的物理引脚,除此之外FPGA内部网络也能作为主时钟的物理节点,使用get_nets定义。
  • waveform的rise_time是上升沿时间,默认0,fall_time是下降沿时间,默认时钟周期一半,单位ns.

在Vivado工具中,可以通过时钟网络报告(Clock Networks Report)和时序确认报告(Check Timing Report)对时钟约束情况进行查看 

  • 在Tcl console中输入report_clock_networks命令会打开时钟网络报告;
  • 在Tcl console中输入check_timing命令会打开时序确认报告;
  1. 使用GUI对时钟进行约束步骤见书45页的实例3.6
  2. clocking wzard ip时钟会自动被约束(如MMCM和PLL时钟)
  3. 如何查看主时钟时序路径报告见书中51页

3.2 跨时钟域约束 

对于同步时钟约束的建立时间关系中启动沿和锁存沿相差一个时钟周期;保持时间关系中,启动沿和锁存沿是同一个时钟沿,而在异步时钟约束时,建立时间关系最坏情况,寻找发射沿之后最近的锁存沿,保持时间最坏情况是寻找发射沿之前最近的一个锁存沿。 

 3.3 虚拟时钟约束

在主时钟约束的基本语法中,get_ports是指定主时钟的实际物理节点,该节点实际存在于FOGA中,而虚拟时钟并不是实际存在于FPGA器件中,他无需依附任何物理节点或者网络。虚拟时钟一啊不能被用于以下情况的输入和输出延时约束:

  • 时序分析(一般是I/O引脚相关的时序路径)的参考时钟并不是FPGA内部的设计时钟
  • 与FPGA器件的I/O路径相关的内部驱动时钟与其扳级驱动时钟并不是同步的
  • 设计者希望对I/O的驱动时钟指定一些特殊的抖动和延时值,但不希望影响此时钟在FPGA内部的时钟传输特性。

虚拟时钟同样用create_clock定义,只是省去了端口项

 3.4 时钟特性约束

真实世界中,当时钟在FPGA内部传输时,会经过各种时钟缓冲器,时钟管理单元,以及各种噪声,都会引起时钟沿的变形和延时,时钟的偏差特性通过时钟抖动和时钟不确定性约束定义

时钟抖动

可以通过set_input_jitter命令对单个时钟设置抖动延时,只能约束主时钟,除了MMCM和PLL外,主时钟所设定的抖动延时会传递给他的衍生时钟

如果噪声较大,Vivido会默认使用set_system_jitter命令产生0.05的抖动延时,可以通过该命令设置新的抖动延时值 

set_input_jitter基本语法

  • set_input_jitter  <clock_name> <延时值>

set_system_jitter基本语法

  • set_system_jitter  <延时值>

时钟不确定性

除了时钟抖动以外的所有可能影响时钟周期性偏差的因素,都可以使set_clock_uncertainty命令进行约束定义 ,基本语法如下:

set_clock_uncertainty -setup -from get_clocks<clock0_name> -to get_clocks<clock0_name> <不确定值>

  • setup表示定义建立时间不确定性,hold表示定义保持时间,如果不写,则默认定义建立和保持时间

时序分析时的clock uncertainty包括上面的时钟不确定性,其计算公式如下:

clock uncertainty=(sqrt(Tsj^2+Tij^2)+Dj)/2+PE+UU

  • Tsj表示最坏情况系统时钟抖动时间,即set_system_jitter的设定值
  • Tij表示set_input_jitter设定的输入抖动时间
  • Dj是一些硬件原语(MMCM和PLL)等产生的离散时钟抖动
  • PE是由MMCM和PLL产生的相位误差,是固定值
  • UU是使用set_clock_uncertainty设定的时钟不确定值

可用set_clock_uncertainty命令人为的增加时序余量。

  1. 使用GUI约束时钟抖动和不确定时间见书68页实例3.12
  2. 时钟抖动约束分析方法见书70
  3. 时钟不确定度约束分析方法见书72

3.5 时钟延时约束 

对于已经做过主时钟约束的内部时钟,FPGA会自动计算其时序延时值并给出时序报告 ,而FPGA外部的同步时钟信号需要设计者添加时钟延时约束,在引脚到寄存器接口时序约束中,并未专门约束时钟延时,因为在set_input_delay约束值中已经加入了。对于FPGA的时序约束而言,即便使用不同的时序约束方式,也可以达到同样的约束目的,条条大路通罗马。set_clock_latency的命令如下:
set_clock_latency -clock<时钟名称>  -rise -fall -min -max -source 延时值 

  • rise,fall指定时钟延时的边沿
  • source定义时钟延时的基本类型,即源延时,默认-network网络延时;源延时指外部引脚输入的时钟信号经过PCB板级延时到达FPGA引脚;网络延时指时钟信号从设计中的某个节点传输到寄存器的输入端口延时。
  • min,max指定延时的最大最小值,只能指定其中一个,如不指定则同时作为最大最小值进行定义

查看FPGA内部时钟延时,时钟偏斜见书75页实例3.15

如何用GUI对时钟进行延时约束见书76页实例3.16

4 衍生时钟约束 

4.1  衍生时钟定义

  • 由已有的主时钟进行分频,倍频,相移而产生出来的时钟信号,如时钟管理单元MMCM等所驱动产生的时钟信号
  • Vivado工具能够识别设计中的时钟调整模块CMB及其基于输入主时钟的变更特性,自动为CMB输出的时钟创建约束
  • 通过check timing命令查看未约束的衍生时钟,时序工具未能生成的约束,需要手动添加约束 

衍生时钟约束语法如下:

create_generated_clock -name 衍生时钟名字 -source 生成此衍生时钟的源时钟引脚或端口 -multiply_by 衍生时钟相对于源时钟的倍频系数 -divide_by 分频系数 <衍生时钟物理节点>

使用GUI约束衍生时钟见书82页实例4.1

有关FPGA时序约束与分析的更多相关文章

  1. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  2. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  3. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  4. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  5. ruby-on-rails - 如何使用 ruby​​-prof 和 JMeter 分析 Rails - 2

    我想使用ruby​​-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby​​-prof可以写入任何输出之前杀死它。如何在不中断ruby​​-prof的情况下停止mongrel服务器? 最佳答案

  6. 软约束、硬约束、Minimum Snap的轨迹优化方法 - 2

    文章目录前言约束硬约束的轨迹优化Corridor-BasedTrajectoryOptimizationBezierCurveOptimizationOtherOptions软约束的轨迹优化Distance-BasedTrajectoryOptimization优化方法前言可以看看我的这几篇Blog1,Blog2,Blog3。上次基于MinimumSnap的轨迹生成,有许多优点,比如:轨迹让机器人可以在某个时间点抵达某个航点。任何一个时刻,都能数学上求出期望的机器人的位置、速度、加速度、导数。MinimumSnap可以把问题转换为凸优化问题。缺点:MnimumSnap可以控制轨迹一定经过中间的

  7. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  8. FPGA 之 时钟,时钟域, 以及复位系统的设计 - 2

    FPGA时钟和时钟域时钟树所谓时钟树为FPGA内部资源,分:全局时钟树,区域时钟树,IO时钟树原则上优先使用全局时钟树,在GT接口上使用IO时钟树,一般工具也会对GT时钟加以限制;时钟树使用方式正确的物理连接FPGA会由物理管脚专门用于全局时钟设置,通过查询数据手册可以在PCB设计阶段进行确认,当外部时钟接入此管脚时,工具会自动占有全局时钟树资源,当接入普通信号时不会分配时钟树资源;恰当的代码描述原语的使用,即BUFG的使用,可以将PLL的输出等内部时钟进行全局时钟资源的分配;IO时钟资源需要参考相应接口手册,以ultrascale的GTH为例,其JESD204的时钟方案针对不同的子类会由不同

  9. 驱动开发:内核无痕隐藏自身分析 - 2

    在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,

  10. ruby-on-rails - 子域约束并排除某些子域 - 2

    在我的routes.rb文件中,我想使用rails3中的子域约束功能,但是我想从catchall路由中排除某些域。我不想在特定的子域中有特定的Controller。这样做的最佳做法是什么。#thissubdomainidontwantallofthecatchallroutesconstraints:subdomain=>"signup"doresources:usersend#hereIwanttocatchallbutexcludethe"signup"subdomainconstraints:subdomain=>/.+/doresources:carsresources:sta

随机推荐