TimeQuest学习之三------外部寄存器模型

clock skew = < destination reg clock delay > - < source reg clock delay >

为了使clock skew 的影响可以叠加到data delay上,给出如下三组公式(对于fpga2ic):

1.clock skew = <ext_clk delay> - < fpga_clk delay>

2.data delay' = <data delay> - <clock skew>

对于多位宽数据(以三位为例):在D[0]~D[2]三个位宽中,delay max 影响建立时间(建立关系), delay min 影响保持时间(保持关系)。对于多位数据而言,max对应着最大延迟的那一位数据,min对应着最小延迟的那一位数据。TimeQuest 在分析D[0..2]建立时间的时候,它只要注意“最危险的建立时间”即可,按逻辑而言,没有什么比“最危险”更危险。同样思路,TimeQuest 在分析D[0..2]保持时间的时候,它只要注意“最危险的保持时间”即可,因为没有什么比“最危险”更危险。

公式的推导都以fpga 为中心,因此fpga2ic 的公式又称output 公式,针对启动沿的 output 公式又名output max,换之针对下一个启动沿的output 公式又名output min。

output max= <fpga2ext delay max> - < clock skew > + ext_Tsu;

output min= <fpga2ext delay min> - < clock skew > - ext_Th;

ic2fpga 是ic 发送数据,fpga 读取数据的外部模型,不过不管位置怎么改变,大体上都是大同小异而已,

input max=<ext2fpga delay max> - < clock skew > + ext_Tco;

input min= <ext2fpga delay min> - < clock skew > + ext_Tco;

set_input_delay:

set output delay 与set input delay 好似一个“外包资料”,首先我们收集各种外部的延迟信息接着包裹在一个“外包资料”里,然后丢给TimeQuest 。TimeQuest 当然晓得某某delay max 是针对建立关系,又某某delay min 是针对保持关系。

set_output_delay:

TimeQuest 在分析内部的setup 与hold 时序时顺便参考一下“外包资料”的信息... 就这样TimeQuest 就可以独立分开外部延迟信息与内部延迟信息。

 set_clock_latency:对于时钟信息而言,max对应着这一时钟的最大延迟,min对应着同一时钟的最小延迟,当时钟只有延迟而没有抖动时(即延迟始终如一),成both。

set_clock_latency 约束行为不是为某个时钟设置延迟,而是告诉TimeQuest 有关外边时钟信号的延迟信息。

set_clock_uncertainly:我们也知道SLDE 时间差是针对建立关系,而SEDL 时间差是针对保持关系。在此之前我们先将它们从input/output 公式中除掉,然后再将SLDE 与SEDL 的时间差透过set_clock_uncertainly 告诉TimeQuest 即可。

也即:使用set_clock_latency的作用是人为告诉TimeQuest时钟的一些信息,由TimeQuest计算clock skew,所以使用了set_clock_latency时,就应该将input/output max/min中的clock skew去掉。

 在计算 set_input_delay 与set_output_delay 的时候,我们可以除掉clock skew,取而代之用set_clock_latency 约束命令告诉TimeQuest 关于外部模型中到底什么时钟信号,然而又有多少的延迟。其中时钟信号的产生源没有抖动,又或者说抖动的early 与late值(both)作为前提。此外,透过set_clock_latency 约束命令,在Data Arrival Path 与Data Required Path 的信息中clock network delay 也会显示对应的延迟。

set_clock_uncertainly 所谓的uncertainly 是指时钟信号抖动的信息,不过更正确一点说就是各种时钟抖动所产生的可能性时序里所隐藏的SLDE 时钟差与SEDL 时钟差,前者是针对建立关系,后者则是针对保持关系。

set_max_delay:

set_min_delay:

两个都是比较老的命令,set maximum delay 直接自定义建立关系,而set minimum delay 直接定义保持关系。

对于物理时钟来说,delay max(late)会造就最小的建立时间,换之delay min(early)会造就最小的保持时间。

create_generated_clock:是个笨蛋,只能一级衔接一级,不能跨级,否则出现错误:

Warning: No paths exist between clock target "ext1_clk" of clock "ext1_clk" and its clock source. Assumingzero source clock latency.

----------------------------------------------------------------------------------------------------------------------

 eetop前辈说:setup violation
主要就是设法剪掉critical path的delay,要么pipeline,要么retiming,要么把combination往前后级挪一挪。
hold time violation
hold time violation是clock tree的skew引起的。主要的宗旨就是设法加前面一级combination的delay,比如加buffer什么的。这时候hold time不满足必须让前前面延迟大一些,并大到比clock period还大出至少一个hold time来。也可以适当把clock period缩小。不过hold time并不是自己能控制的,挺闹心的。
在综合时,综上所述,
setup violation是由于前级组合的延迟过大引起的,因此要用set_max_delay来限制,
hold violation是由于前级组合延迟国小引起的,因此不能让他太小,要用set_min_delay来限制。