原创 TimeQuest就一定要搞定——时序分析基本公式

2009-10-9 11:59 18768 14 36 分类: FPGA/CPLD

以下内容译自Quartus II Version 7.0 Handbook Volume 3Verification6-28Clock Analysis部分。 riple


TimeQuest静态时序分析的对象包括:寄存器和寄存器之间的路径、I/O之间、I/O和寄存器之间的路径、异步复位和寄存器之间的路径。TimeQuest根据Data Arrival TimeData Required Time计算出时序余量(Slack)。当时序余量为负值时,就发生了时序违规(Timing Violation)。 riple


需要特别指出的一点是:由于时序分析是针对时钟驱动的电路进行的,所以分析的对象一定是“寄存器-寄存器”对。在分析涉及到I/O的时序关系对时,看似缺少一个寄存器分析对象,构不成“寄存器-寄存器”对,其实是穿过FPGA的I/O引脚,在FPGA外部虚拟了一个寄存器作为分析对象。 riple


 


一、 建立时间(Setup Time)检查: riple


遵循的原则是信号从Launch edge开始计时,经过一系列的时序路径,到达后级寄存器的数据输入Pin的速度不能太慢,时间不能太长,否则会侵占后级寄存器数据输入Pin相对于Latch edge的建立时间。刚好满足后级寄存器建立时间的数据到达时间是Data Required Time(相对于Latch edge计算),实际的数据到达时间是Data Arrival Time(相对于Launch edge计算)。显然,在建立时间检查中,Data Arrival Time要小于Data Required Time,否则就会造成建立时间违规。也就是说,Data Required TimeData Arrival Time的最大值。二者之差就是建立时间的时序余量。 riple


点击看大图



1)寄存器-寄存器(Register-to-Register)路径检查:  riple


Clock Setup Slack = Data Required Time – Data Arrival Time


Data Arrival Time = Launch Edge + Clock Network Delay Source Register +μtco + Register-to-Register Delay


Data Required Time = Clock Arrival Time – μtsu – Setup Uncertainty


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


2)输入引脚-寄存器(Pin-to-Register)路径检查: riple


Clock Setup Slack Time = Data Required Time – Data Arrival Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + Input Maximum Delay of Pin + Pin-to-Register Delay


Data Required Time = Clock Arrival Time – μtsu


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


3) 寄存器-输出引脚(Register-to-Pin)路径检查: riple


Clock Setup Slack Time = Data Required Time – Data Arrival Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtco + Register-to-Pin Delay


Data Required Time = Clock Arrival Time – Output Maximum Delay of Pin


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


从上面三组公式可以看出:Data Arrival Time的前两项是相同的;Data Required Time的第一项是相同的;Clock Arrival Time的公式是相同的。 riple


所以,第一组公式可以归纳如下: riple


Clock Setup Slack Time = Data Required Time – Data Arrival Time


Data Arrival Time = 时钟到达前级寄存器的时刻 + 前级寄存器时钟到后级寄存器数据输入的延迟 riple


Data Required Time = 时钟到达后级寄存器的时刻后级寄存器的建立时间 riple


其中,后两个公式的第二项在其他情况下适当修改即可。 riple


这就和一些书中讲到时序分析时采用的公式一致了。 riple


 点击看大图



report_timing -from [get_registers reg1] -to [get_registers reg2] -setup -npaths 1 -panel_name "Report Timing"


 


二、 保持时间(Hold Time)检查: riple


遵循的原则是信号从Launch edge开始计时,经过一系列的时序路径,到达后级寄存器的数据输入Pin的速度不能太快,时间不能太短,否则会侵占后级寄存器数据输入Pin相对于上一个Latch edge的保持时间。刚好满足后级寄存器保持时间的数据到达时间是Data Required Time(相对于Latch edge计算),实际的数据到达时间是Data Arrival Time(相对于Launch edge计算)。显然,在保持时间检查中,Data Arrival Time要大于Data Required Time,否则就会造成保持时间违规。也就是说,Data Required TimeData Arrival Time的最小值。二者之差就是保持时间的时序余量。 riple


相对于建立时间检查,保持时间检查稍微难懂一些。二者都是同步逻辑设计中对同一个规则的不同解释:当前时钟沿发出的数据要在下一个时钟沿被正确捕获,不能晚,也不能早。晚了,会造成下一个时钟沿的建立时间违规,当前时钟沿发送的数据不能被下一个时钟沿捕获;早了,会造成上一个时钟沿发送的数据保持时间违规,上一个时钟沿发送的数据不能被当前时钟沿正确捕获。 riple


二者在计算公式上的区别在于Slack计算公式中减数与被减数关系。 riple


点击看大图



1)寄存器-寄存器(Register-to-Register)路径检查: riple


Clock Hold Slack = Data Arrival Time – Data Required Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register +μtCO + Register to Register Delay


Data Required Time = Clock Arrival Time + μtH + Hold Uncertainty


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


2)输入引脚-寄存器(Pin-to-Register)路径检查: riple


Clock Setup Slack Time = Data Arrival Time – Data Required Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + Input Minimum Delay of Pin + Pin to Register Delay


Data Required Time = Clock Arrival Time + μtH


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


3) 寄存器-输出引脚(Register-to-Pin)路径检查: riple


Clock Setup Slack Time = Data Arrival Time – Data Required Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtCO + Register to Pin Delay


Data Required Time = Clock Arrival Time – Output Minimum Delay of Pin


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


需要注意的是,上面公式中的Latch Edge实际对应的是上一个Launch Edge。所以,当Launch ClockLatch Clock是同一个时钟时,上述公式中的Latch Edge等于0;当前级和后级时钟不同时,还需要具体计算Latch Edge的取值。 riple



点击看大图


report_timing -from [get_registers reg1] -to [get_registers reg2] -hold -npaths 1 -panel_name "Report Timing"


 


三、 恢复时间(Recovery Time)检查: riple


遵循的原则是异步控制信号变化的时刻不能介于寄存器的Latch edge和相应的建立时间之间,否则会导致寄存器的建立时间违规,数据输出进入亚稳态。即从前级寄存器的Launch edge开始计时,经过一系列的时序路径,前级寄存器数据输出到达后级寄存器异步控制Pin的速度不能太慢,时间不能太长,否则会破坏后级寄存器在Latch edge的数据建立时间。该检查主要应用于异步控制信号由有效电平向无效电平转换的时刻,在该时刻破坏数据建立时间会导致亚稳态;在异步控制信号由无效电平向有效电平转换的时刻破坏数据的建立时间不会造成亚稳态。 riple


从上述定义,可以得到和建立时间检查类似的公式。

  riple


1)寄存器-寄存器(Register-to-Register)路径检查: riple


Recovery Slack Time = Data Required Time – Data Arrival Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtCO + Register to Register Delay


Data Required Time = Clock Arrival Time – μtSU


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


2)输入引脚-寄存器(Pin-to-Register)路径检查: riple


Recovery Slack Time = Data Required Time – Data Arrival Time


Data Arrival Time = Launch Edge + Maximum Input Delay + Port to Register Delay


Data Required Time = Clock Arrival Time – μtSU


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


 

 点击看大图



report_timing -from [get_ports async_rst] -to [get_registers reg2] -recovery -npaths 1 -panel_name "Report Timing"


 


四、 移除时间(Removal Time)检查: riple


遵循的原则是异步控制信号变化的时刻不能介于寄存器的Latch edge和相应的保持时间之间,否则会导致寄存器的保持时间违规,数据输出进入亚稳态。即从前级寄存器的Launch edge开始计时,经过一系列的时序路径,前级寄存器数据输出到达后级寄存器异步控制Pin的速度不能太快,时间不能太短,否则会破坏后级寄存器在上一个Latch edge的数据保持时间。该检查主要应用于异步控制信号由有效电平向无效电平转换的时刻,在该时刻破坏数据保持时间会导致亚稳态;在异步控制信号由无效电平向有效电平转换的时刻破坏数据的保持时间不会造成亚稳态。 riple


从上述定义,可以得到和保持时间检查类似的公式。

  riple


1)寄存器-寄存器(Register-to-Register)路径检查: riple


Removal Slack Time = Data Arrival Time – Data Required Time


Data Arrival Time = Launch Edge + Clock Network Delay to Source Register + μtCO of Source Register + Register to Register Delay


Data Required Time = Clock Arrival Time + μtH


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


 


2)输入引脚-寄存器(Pin-to-Register)路径检查: riple


Removal Slack Time = Data Arrival Time – Data Required Time


Data Arrival Time = Launch Edge + Input Minimum Delay of Pin + Minimum Pin to Register Delay


Data Required Time = Clock Arrival Time + μtH


Clock Arrival Time = Latch Edge + Clock Network Delay to Destination Register


 点击看大图


 

report_timing -from [get_ports async_rst] -to [get_registers reg2] -removal -npaths 1 -panel_name "Report Timing"

五、多周期路径(Multicycle Paths)检查: riple


在上述的建立、保持时间检查中,都假设数据从Launch edge开始发送,在Latch edge被捕获;Launch edge和Latch edge是相邻最近的一对时钟沿。在多周期路径检查中,仍然采用Launch edge和Latch edge的概念;但是Launch edge和Latch edge不再是相邻的一对时钟沿,而是间隔一定时钟周期的一对时钟沿,间隔的时钟周期个数由用户指定。 riple


在同步逻辑设计中,通常都是按照单周期关系考虑数据路径的。但是往往存在这样的情况:一些数据不需要在下一个时钟周期就稳定下来,可能在数据发送后几个时钟周期之后才起作用;一些数据经过的路径太复杂,延时太大,不可能在下一个时钟周期稳定下来,必须要在数据发送后数个时钟周期之后才能被采用。针对这两种情况,设计者的设计意图都是:数据的有效期在以Lauch edge为起始的数个时钟周期之后的Latch edge。这一设计意图不能够被时序分析工具猜度出来,必须由设计者在时序约束中指定;否则,时序约束工具会按照单周期路径检查的方式执行,往往会误报出时序违规。 riple


不设置多周期路径约束的后果有两种:一是按照单周期路径检查的结果,虚报时序违规;二是导致布局布线工具按照单周期路径的方式执行,虽然满足了时序规范,但是过分优化了本应该多个周期完成的操作,造成过约束(Over-Constrain)。过约束会侵占本应该让位于其他逻辑的布局布线资源,有可能造成其他关键路径的时序违规或时序余量变小。 riple


在多周期路径的建立时间(Setup Time)检查中,TimeQuest会按照用户指定的周期数延长Data Required Time,放松对相应数据路径的时序约束,从而得到正确的时序余量计算结果;在保持时间(Hold Time)检查中,TimeQuest也会相应地延长Data Required Time,不再按照单周期路径的分析方式执行(不再采用Launch edge最近的时钟沿,而是采用Latch edge最近的时钟沿),这就需要用户指定保持时间对应的多周期个数。TimeQuest计算Hold Time的缺省公式等同于PrimeTime。PrimeTime会采用建立时间检查对应时钟沿的前一个时钟沿进行保持时间检查,并多会造成保持时间检查违规,需要用户指定保持时间检查对应的时钟沿为Launch edge最近的时钟沿。(西电出版社《数字IC系统设计》p189) riple


TimeQuest缺省的Hold Time检查公式是需要用户修改的——针对Setup Time多周期路径的设置也会影响到Hold Time的检查。究其原因,多周期路径是为了解决信号传播太慢的问题,慢到一个周期都不够,所以要把Setup Time的检查往后推几个周期——扩大Setup Time检查的时间窗口。而Hold Time检查信号是否传播得太快,如果把检查时刻往后推,就缩小了Hold Time检查的时间窗口。 riple


 


“信号跳变抵达窗口”:对Latch寄存器来说,从previous时钟对应的Hold Time开始,到current时钟对应的Setup Time结束。 riple


“信号电平采样窗口”:对Latch寄存器来说,从current时钟对应的Setup Time 开始,到current时钟对应的Hold Time结束。 riple


 


Launch寄存器必须保证驱动的信号跳变到达Latch寄存器的时刻恰好处于“信号跳变抵达窗口”内,才能保证不破坏Latch寄存器的“信号电平采样窗口”。 riple


时序检查的目的就是确认信号跳变发生在“信号跳变抵达窗口”内,而不会发生在“信号电平采样窗口”内。 riple


 


多周期路径的设置是通过延后Setup Time检查的时刻,扩大了“信号跳变抵达窗口”,放松了时序约束。通过窗口的概念,也很容易理解延后Hold Time,就会缩小“信号跳变抵达窗口”。 riple


背景资料: riple


Specify multicycle set-up paths constraints riple


Specifying multicycle hold requirements constraints riple


 


随文附上一个rar,可以采用上面的命令执行并观察结果。该实例改编自Altera的multicycle_exception。 riple


该实例由两个级联寄存器构成。 riple


点击看大图


学习时序分析一定要学会察看Technology Map Viewer。 riple


点击看大图


下一篇是我在使用中遇到的一个“异常现象”——负的寄存器建立时间。 riple

文章评论25条评论)

登录后参与讨论

markman_368591939 2012-10-21 08:29

我一个设计有2个时钟:clk1,20MHz和clk2,40MHz 其实这2个时钟,是由板上PLL产生的,已经由布线保证其上沿对其。 2个时钟同时给PFGA,SDC里面如何约束?

用户120485 2012-3-9 11:30

对于set_input_delay 和set_output_delay 还是有一些疑问。其中的一个就是:reference clock的选择上,在约束input/output delay的时候,参考时钟如何选择呢?altera的一些文档中,提到了virtual clock等等。这一块是不是参考时钟的选择是很灵活的呢? 选择不同的时钟参考点,是否估算output delay和input delay就不一样了?

用户382208 2011-8-17 10:54

您好,上文“五、多周期路径检查” 中的“ “信号跳变抵达窗口”:对Latch寄存器来说,从previous时钟对应的Hold Time开始,到current时钟对应的Setup Time结束。 “信号电平采样窗口”:对Latch寄存器来说,从current时钟对应的Setup Time 开始,到current时钟对应的Hold Time结束。” 如此说来,这两个窗口是有时间重叠的?重叠的有两部分:第一部分就是current时钟与previous时钟重叠的current时钟的setup time,第二部分就是current时钟与next时钟重叠的current时钟的hold time? 个人感觉是不是“信号跳变抵达窗口”指的是对于Latch寄存器来说,从previous时钟的hold time结束,到current时钟的setup time 之前? 本人菜鸟,还请多多指教。谢谢

用户1000403 2011-7-26 18:09

“可以采用上面的命令执行并观察结果” 为什么我跑这个例子一点反应也没有。 我的操作:copy命令行放在Time Quest界面下方 tcl命令符后面,然后回车 quatars9.0 没法贴图

ash_riple_768180695 2009-5-6 23:48

对,通过给STA工具提供信息,间接实现约束的效果。

用户209068 2009-5-6 23:32

哦,谢谢。 那我们在设置约束的时候,给出输出/输入最大最小延迟,应该就是为了约束IO的PIN的吧。

ash_riple_768180695 2009-5-4 22:08

我觉得,如果把FPGA作为一个整体,像考察一个IC元件的接口时序一样,那么Pin指的是IO;如果把LE作为一个考察对象,那么就是LE的pin。不同的是,STA工具对于FPGA器件外部的情况一无所知,但是对FPGA中LE内部和之间的信息了如指掌。所以,在分析FPGA接口时序时,需要设计者提供input/output delay;在分析FPGA内部寄存器之间的时序时,LE的input/output delay以及LE内部的组合逻辑路径延迟都是STA工具已知的,都是可以在STA工具中查看的。

用户209068 2009-5-4 18:09

你好。 请问下,这里Input Minimum Delay of Pin + Pin to Register Delay 所指的pin,是指IO的pin还是之前你的文章里说的,一个LE的pin? 谢谢。

ilove314_323192455 2009-2-5 22:14

FPGA输出数据达到外部器件输入管脚最快的时间=Tco+PCB布线延时,外部器件的Th应该小于上面的值,即外部器件的Th< Tco+PCB布线延时(先不讨论PCB时钟偏斜),那么Tco>Th-PCB布线延时才对,而不是Tco>输出最小延时=Th+PCB布线延时?还望指点http://blog.ednchina.com/ilove314/197310/message.aspx

ash_riple_768180695 2008-11-25 14:01

建立时间检查针对的是“过去(launch)对现在(latch)的影响”;保持时间检查针对的是“未来(launch)对现在(latch)的影响”。如果你根据“未来的launch影响现在的latch”的标准来选择hold“关系对”的话,你就能看懂图中的示意。
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
我要评论
25
14
关闭 站长推荐上一条 /2 下一条