锁存器中的时间借用

对于基于锁存器的设计,静态时序分析会应用一个称为时间借用的概念。本篇博文解释了时间借用的概念,若您的设计中包含锁存器且时序报告中存在时间借用,即可适用此概念。

随后,本文进一步解释静态时序分析 (STA) 工具如何应用这个概念。

假设时钟周期为 10 且占空比为 50%:

时钟周期1.png

另假设存在如下简单电路:

电路.png

为便于理解,假设每个触发器的建立时间和保持时间均为“0”。同时,假设时钟偏差和时钟延迟均为“0”。

在 0 时从 F1 发送的数据会在 10 时被 F2 采样。因此,如果数据在 10 之后到达 F2,则 F2 将无法捕获正确的数据。同样,从 F2 发送的数据有 10 个时间单位到达 F3,并在下一个时钟沿被 F3 采样。

现在我们用锁存器 L2 替换 F2,其中锁存器的“门控”由同一时钟线驱动:

时钟线驱动.png

先来理解时间借用的概念,稍后再对基于锁存器的设计进行实际的静态时序分析。

对于从 F1 发送的数据:

如果该数据稍早于 10 时到达锁存器输入,则会在锁存器的 D 管脚处等待。这与 F2 表现出的行为类似。

但当数据在 10 时之后到达 L2 时会发生什么? L2 在 10 到 15 的时间段内是“透明”。因此,即使数据在 10 之后到达 L2,只要数据在 15 之前到达 L2,L2 就能够使用它。

例如,如果数据在 12 时到达 L2,这意味着锁存器提供了(相对于触发器)2 个时间单位的优势。

在此示例中,L2 能够提供的最大优势是 5 个时间单位。现在来看看从 L2 到 F3 的路径。数据在 12 时从 L2 输出,并将在 20 时被 F3 采样。因此,从 L2 到 F3 的路径只获得 8 个时间单位。

在包含全部触发器的电路中,第二条路径有 10 个时间单位。然而在这个电路中,它少了 2 个时间单位。

本质上:

馈入锁存器的路径获得了额外的 2 个时间单位。因此,锁存器之后的路径不得不从其份额(10 个时间单位)中“让出”这 2 个时间单位。换言之:馈入锁存器的路径从锁存器之后的路径“借用”了 2 个时间单位。

因此,馈入锁存器的路径可以从后续路径借用额外的时间(相当于锁存器透明的时间)。然而,实际借用的时间不一定就是可以借用的全部时间。实际借用的时间是路径满足时序所需的最小值(受限于锁存器透明时间的最大限制)。

对于所述示例:

可以借用的时间量 = 5 个时间单位。

实际借用的时间量 = 2 个时间单位。

除了默认可用的时间外,还额外使用了 2 个时间单位来满足时序。

现在我们理解了在锁存器场景下的时间借用概念,接下来看看 STA 工具如何对基于锁存器的设计进行时序分析。

对于在 0 时由 F1 触发的数据而言:

L2 在 0 到 5 的持续时间内是开放的。这是 L2 可以捕获数据的窗口。因此,在 0 时从 F1 发送的数据可以在 0 到 5 期间被 L2 捕获。

对于建立时间分析:

- 0 会被视为 L2 的捕获沿,借用容量为 5。

STA 工具会执行以下操作:在 0 时发送并在 0 时捕获,附加借用容量为 5。就 L2 到 F3 的路径而言:在 0 时发送,在 10 时于 F3 处被捕获。因此,从 F1 到 F3 的路径为 10,其中最多 5 个时间单位在 L2 之前可用,其余则在 L2 之后可用。

现在来看看保持时间分析:

对于保持时间分析,我们希望确保数据不会在前一个周期内被捕获。由 F1 在 0 时发送的数据可以在 0-5 期间被 L2 捕获。或者说,L2 在 0-5 期间捕获的数据应该是 F1 在 0 时发送的数据。

那么 F1 将在 10 时发送的下一个数据呢? 

如果这个数据在 5 之前到达 L2,那么它会干扰 F1 在 0 时发送的数据。因此,保持时间检查应确保 F1 在 10 时发送的数据不得在 5 时之前到达 L2,即针对 F1 在 10 时发送的数据和 L2 在 5 时捕获的数据会进行保持时间检查。

文章来源:AMD xilinx开发者社区