EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2007/4/28 23:08:36

6

标签: TimeQuest  Altera  timing  analysis  

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

以下内容译自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

系统分类: CPLD/FPGA   |   用户分类: Timing Analysis   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

该用户于2009/10/9 11:59:22编辑过该文章

阅读(5767)  |  评论(23)  |  收藏(6)  |  举报  

投一票您将和博主都有获奖机会!

最新评论

  • riple

    2009/5/6 23:48:47

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

  • fayfay521

    2009/5/6 23:32:51

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

  • riple

    2009/5/4 22:08:20

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

  • fayfay521

    2009/5/4 18:09:02

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

  • ilove314

    2009/2/5 22:14:43

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

  • riple

    2008/11/25 14:01:21

    建立时间检查针对的是“过去(launch)对现在(latch)的影响”;保持时间检查针对的是“未来(launch)对现在(latch)的影响”。如果你根据“未来的launch影响现在的latch”的标准来选择hold“关系对”的话,你就能看懂图中的示意。

  • 24272809

    2008/11/24 8:55:36

    呵呵,没事,我再补上。我也就是有问题没搞明白,在第三幅图中用HOLD CHACK A2作为保持关系的检查,我有些搞不明白,看英文文档也还是不清楚,你能不能给详细的解释一下为什么用HOLD CHACK A2而不用其他的来检测保持关系是否满足?尽找一些问题来麻烦你帮我解答,我才不好意思呢!

  • riple

    2008/11/23 20:17:28

    不好意思,不小心把24272809的评论删掉了!

  • riple

    2008/11/18 22:05:18

    有这种可能。还有一种可能是source clock第三个上升沿驱动的数据不会被采样到。我想,这幅图要表达的意思是静态时序分析工具会穷尽所有可能的launch-latch关系对,不会漏掉一个,这样才能找出最坏的情况。如果最坏的情况都通过了,那么设计就不存在问题。静态时序分析强于动态时序分析(时序仿真)之处就在于能够穷尽所有的时序情况。

  • 24272809

    2008/11/18 21:52:01

    riple,你好!有点问题向你请教。在这篇文章中的第一幅图中的source clock的第二个上升沿时,源触发器所发送的数据是不是目的触发器就接受不到啊?总感觉这块有些说不出道不明的变扭。

  • riple

    2008/4/15 13:36:02

    时许分析工具不知道你的设计是“过约束”的,只能按照你提供的约束条件进行分析,即9.9ns。

  • Sparten_Leaf

    2008/4/14 22:09:40

    搜到你的网页,请教一个问题:) 在设计中往往对一个时钟加比较严格的约束,比如100m的时钟,约束为9.9ns,那么这时如何去分析保持时间,按照10ns为基准,还是以9.9为基准?

  • riple

    2008/4/8 17:02:19

    由上面的分析可以看出,用户输入给TimeQuest的output_delay需要计入Data Arrival Time的计算公式中,用加法。在Slack的计算公式中,把这一项移入Data Required Time的公式中,就变成了减法。在set_output_delay -clock clk_out 1.200 [get_ports data_out]中,clk_out并不是output_delay的直接参考点,而是TimeQuest用来计算的间接参考点。

  • riple

    2008/4/8 16:28:45

    何为output_delay,如何设置这一参数?从FPGA内部的寄存器输出的信号依次经过FPGA输出引脚、PCB走线、外部器件的输入引脚,才能到达外部寄存器的输入引脚。output_delay是FPGA内部的寄存器与FPGA外部的寄存器之间时序路径上的特定阶段的延时取值。有了这一参数,上述路径的延时信息才算完整。这一参数TimeQuest无法计算得到,只能由设计者根据外部测量或估算的数值传递给TimeQuest。具体来说,这一延时包括从FPGA输出引脚到外部寄存器输入引脚的全部路径延时。

  • FIOG

    2008/4/6 23:12:49

    保持时间检查中,对于寄存器-输出路径的检查公式:Data Required Time = Clock Arrival Time – Output Minimum Delay of Pin中,输出的最小延迟一般是后级寄存器的保持时间,那么公式中的减号是否应该为加号才对!

  • riple

    2007/11/24 22:01:57

    对不起,我不知道。在网上搜一下吧。

  • 光明

    2007/11/23 21:37:04

    请问一下Multicycle Hold ,Source Multicycle Hold ,Clock Enable Multicycle Hold有什么区别?谢谢

  • monef

    2007/7/24 10:52:39

    非常感谢你的答复,现在终于对setup time和hold time有了更深入的理解,谢谢!!

  • riple

    2007/7/23 17:15:26

    经过你的提问,我上面的文字就更清晰了,谢谢!

  • riple

    2007/7/23 17:13:56

    谢谢你详细阅读上面繁琐的文字,我自认为没有写错,也相信你这么认真地读了一遍,会有些收获的。

    如果有收获,不要谢我,谢你自己。

  • riple

    2007/7/23 17:10:12

    "在上述的建立、保持时间检查中,都假设数据从Launch edge开始发送,在Latch edge被捕获;Launch edge和Latch edge是相邻最近的一对时钟沿。"

    上面给出的波形图是从Altera文档里剪出来的,说明的是一种最普遍的情况(不同频、不同相)。我们在同步设计里遇到的更多是同频不同相(同一时钟到达不同寄存器的时间不同)的情况:

    在Hold时间检查中,Launch edge是source的current时钟沿,Latch Edge是destination的current时钟沿。

    在Setup时间检查中,Launch edge是source的previous时钟沿,Latch Edge是destination的current时钟沿。

    上述表述都可以向后推一个时钟,也就是把current说成next,把previous说成current。

    Launch都是针对source说的,要不怎能称为Launch;Latch都是针对destination说的,所以是Latch。

    Hold和Setup的区别在于Launch和Latch是否是同一个时钟沿。Hold约束信号不能跑得太快,Setup约束信号不能跑得太慢。

    不知道说明白没?不明白的话,你试着把英文公式准确翻译成汉语试试。

  • monef

    2007/7/23 14:55:29

    sorry,上面写错了,应该是:

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

    Clock Setup Slack = Data Required Time – Data Arrival Time

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

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

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

  • monef

    2007/7/23 14:52:32

    你好,能详细说明一下hold time check公式中出现的launch edge 和latch edge是soucre 还是destination clock的current,previous,还是next edge??

    比如说在setup time check 公式中:

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

    Clock Hold Slack = Data Arrival Time – Data Required Time

    Data Arrival Time = Launch Edge(current)+ 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(current) + Clock Network Delay to Destination Register