以下内容译自Quartus II Version 7.0 Handbook, Volume 3:Verification的6-28:Clock Analysis部分。 riple
TimeQuest静态时序分析的对象包括:寄存器和寄存器之间的路径、I/O之间、I/O和寄存器之间的路径、异步复位和寄存器之间的路径。TimeQuest根据Data Arrival Time和Data 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 Time是Data 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 Time是Data 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 Clock和Latch 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
从上述定义,可以得到和建立时间检查类似的公式。
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
从上述定义,可以得到和保持时间检查类似的公式。
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
随文附上一个,可以采用上面的命令执行并观察结果。该实例改编自Altera的multicycle_exception。 riple
该实例由两个级联寄存器构成。 riple
学习时序分析一定要学会察看Technology Map Viewer。 riple
markman_368591939 2012-10-21 08:29
用户120485 2012-3-9 11:30
用户382208 2011-8-17 10:54
用户1000403 2011-7-26 18:09
ash_riple_768180695 2009-5-6 23:48
用户209068 2009-5-6 23:32
ash_riple_768180695 2009-5-4 22:08
用户209068 2009-5-4 18:09
ilove314_323192455 2009-2-5 22:14
ash_riple_768180695 2008-11-25 14:01