Time borrowing

latch 在高电平时透明,dff 在边沿采样。

 

image-20200622162330779

 

opening edge 指边沿跳变以后有效的边沿,closing edge 指边沿跳变之后无效的边沿。

 

通常触发器有建立时间和保持时间的要求,对于 latch 也是有类似的要求的。latch 可以在 opening edge 以后变化,这种情况类似于向后借时间了,所以称之为 Time borrowing。

 

 

一个 time borrowing 的例子,数据可以在建立时间之前到达(DIN),也可以在边沿以后到来(delay),翻转到边沿的时间称为 time borrowing,进一步下一个周期的时间余量就会变小。

 

 

三种 slack,如果在 opening 之前到来,成为 positive edge,在 opening 和 closing 之间成为 zero edge,可以使用 time borrowing 保证时序,如果在 closing 之后到来,那么就会产生时序违例,因为就算使用 time borrowing 也无法让数据正确采样。

 

 

使用 latch 的一个例子,缓和时序。

 

image-20200622163910240

 

UFF0 到 ULAT1 之间的逻辑延迟小于 5ns,那么数据在 opening edge 之前到来。

 

 

时序报告,期待您是 UFF0 终点时 ULAT1,发射路径:

 

image-20200622164715848

 

捕获路径,不需要借时间,时序满足。

 

 

下面是 zero slack,发射路径。

 

 

捕获路径,使用 time borrowing,借了 1.81ns。

 

 

下面分析发生 time borrowing 时 ULAT1 到 DFF1 的时序,首先发射路径,注意,类似半周期路径,clock CLK‘ incr 为 5。

 

image-20200622165141641

 

捕获路径,时序满足。

 

 

negedge slack,发射路径。

 

image-20200622165547742

 

捕获路径,就算借满所有时间,也无法满足时序(4.99 是要减去 setup 时间 0.01)。

 

 

Data To Data check

检查两个 pin 之间的关系,而且并没有时钟,一个为 constrainted pin 类似于 DFF 的数据端,一个 related pin 类似于 DFF 的 clock。

 

 

这种检查的不同之处为,建立时间检查是在同一个边沿检查的,因此称之为 zero-cycle check。

 

image-20200622170127811

 

data to data check 使用 set_data_check 约束进行检查。

 

 

这是用于约束外部引脚的约束。

 

 

一个例子,对于与门,为了避免毛刺,进行约束。

 

 

约束时序报告,注意时序报告中的是 data check setup time。

 

 

上面是建立时间检查,下面是保持时间检查,在发射路径中,是从 10 开始的,这相对于建立时间先前移动了一个周期。

 

 

如果现在同一个边沿检查 hold,可以使用多周期约束实现。

 

 

多周期约束以后,发射路径从 0 开始。

 

 

也可以将两个信号的约束反向,保持时间约束通过反向的建立时间约束实现,在同一个边沿进行检查。

 

 

data to data check 也可以用于约束要求信号在时间内保持不变。