目录
建立时间:时钟上升沿到来之前数据保持稳定的时间
保持时间:时钟上升沿到来之后数据保持稳定的时间
Launch是启动沿,Latch是锁存沿。
可以认为建立时间的Launch与Latch相差1个时钟周期,保持时间的Launch与Latch相差0个时钟周期(对齐)。

其中的Tcycle是源时钟周期,Tclk1和Tclk2分别是时钟源到一级寄存器和二级寄存器的时钟网络延迟,Tco是数据在寄存器内部传输的延迟,Tdata是线路上组合逻辑的延迟,Tsu是建立时间大小,我们需要保证建立时间余量大于零。

普通的公式:其中Latch Edge设为Tcycle,Launch Edge 设为 0
setup slack = DATA Required Time - DATA Arrival Time
=(Latch Edge+ Tclk2 - Tsu)- (Launch Edge+Tclk1+Tco+Tdata)
= (Tcycle + Tclk2 - Tsu)- (Tclk1+Tco+Tdata)
需要求得最小的setup slack,故有
setup slack(min) = (Tcycle + Tclk2(min) - Tsu)- (Tclk1(max)+Tco+Tdata)
考虑到以及CPR(Clock Pessimsm Removal ),CPR是指在考虑clk1和clk2路径上有共同的common部分,那么有

CPR = Tcommon(max)- Tcommon(min)
所以setup slack(min)公式中的Tclk2(min) - Tclk1(max)是不够精确的,还需要考虑到common是共有的,
正确的数值 [Tclk2(min)-Tcommon(min)] - [Tclk1(max)-Tcommon(max)]
我们计算的数值 Tclk2(min) - Tclk1(max)
二者相减正好 等于 CPR = Tcommon(max)- Tcommon(min),所以我们计算的结果还需要加上一个CPR的数值来补偿才是正确的建立时间余量。
再考虑时钟不确定性延迟clock uncertainly ,它会使得一个时钟周期不是一个完整的时钟周期,假设由于抖动会缩短一个周期的时间(比如10ns变成9ns)
有最后的公式
setup slack(min) = DATA Required Time - DATA Arrival Time
=[Tcycle -clock uncertainly time + Tclk2(min) - Tsu+ CPR]
- [Tclk1(max)+Tco+Tdata]

普通的公式:其中Latch Edge设为0,Launch Edge 设为 0
hold slack = DATA Arrival Time - DATA Required Time
= (Launch Edge+Tco+Tdata)-(Latch Edge+ Tclk2 - Tsu)
= (Tclk1+Tco+Tdata) -( Tclk2 + Th)
需要求得最小的hold slack,故有
hold slack(min) = (Tclk1(min)+Tco+Tdata) -( Tclk2(max) + Th)
考虑到以及CPR(Clock Pessimsm Removal ),CPR是指在考虑clk1和clk2路径上有共同的common部分,那么有
CPR = Tcommon(max)- Tcommon(min)
所以hold slack(min)公式中的Tclk1(min) - Tclk2(max)是不够精确的,还需要考虑到common是共有的,
正确的数值 [Tclk1(min)-Tcommon(min)] - [Tclk2(max)-Tcommon(max)]
我们计算的数值 Tclk1(min) - Tclk2(max)
二者相减正好 等于 CPR = Tcommon(max)- Tcommon(min),所以我们计算的结果还需要加上一个CPR的数值来补偿才是正确的建立时间余量。
再考虑时钟不确定性延迟clock uncertainly ,它会使得一个时钟周期不是一个完整的时钟周期,假设由于抖动会缩短一个周期的时间(比如10ns变成9ns)
有最后的公式
hold slack(min)=DATA Arrival Time - DATA Required Time
= [Tclk1(min)+Tco+Tdata]
- [Tclk2 (max)+ Th + clock uncertainly time-CPR]
所以建立时间和保持时间都需要一个CPR大小的补偿。
[1] 《FPGA时序约束与分析 吴厚航》
[2] 尤老师b站视频