在该部分中,将描述不同场景下的发起时钟和捕获时钟且展示建立时间检查和保持时间检查是如何进行的。图8-28展示了该案例的具体情况。
案例1(case 1)
在此示例中,两个时钟具有相同的周期,但相位相反。以下是时钟定义,其波形如图8-29所示。
create_clock -name CLKM \
-period 20 -waveform {0 10} [get_ports CLKM]
create_clock -name CLKP \
-period 20 -waveform {10 20} [get_ports CLKP]
建立时间检查是从发起沿( 0 n s 0ns 0ns)到下一个捕获沿( 10 n s 10ns 10ns)的。半个时钟周期的裕量可用于保持时间检查,以验证在 20 n s 20ns 20ns处发起的数据是否在 10 n s 10ns 10ns处未被捕获沿所捕获。以下是建立时间检查的路径报告:
以下是保持时间检查路径时序报告:
案例2(case 2)
此示例与上一案例类似,不过发起时钟和捕获时钟的相位相反。以下是时钟定义,其波形如图8-30所示。
create_clock -name CLKM \
-period 10 -waveform {5 10} [get_ports CLKM]
create_clock -name CLKP \
-period 10 -waveform {0 5} [get_ports CLKP]
建立时间检查从 5 n s 5ns 5ns的发起时钟沿到 10 n s 10ns 10ns的下一个捕获时钟沿。保持时间检查从 5 n s 5ns 5ns的发起时钟沿到 0 n s 0ns 0ns的捕获时钟沿。以下是建立时间检查的路径报告:
以下是保持时间检查路径时序报告:
在此示例中,捕获时钟是发起时钟的二分频。以下是时钟定义:
create_clock -name CLKM \
-period 10 -waveform {0 5} [get_ports CLKM]
create_clock -name CLKP \
-period 20 -waveform {0 10} [get_ports CLKP]
波形如图8-31所示。建立时间检查是从 10 n s 10ns 10ns的发起沿到 20 n s 20ns 20ns的捕获沿,保持时间检查是从 0 n s 0ns 0ns的发起沿到 0 n s 0ns 0ns的捕获沿。以下是建立时间检查的路径报告:
以下是保持时间检查路径时序报告:
在此示例中,捕获时钟速度是发起时钟速度的 2 2 2倍。图8-32中为建立时间和保持时间检查对应的时钟沿:从发起沿 0 n s 0ns 0ns到下一个捕获沿 5 n s 5ns 5ns进行建立时间检查,保持时间检查是在建立时间捕获沿前一个周期的捕获沿进行的,也就是说,发起沿和捕获沿都为 0 n s 0ns 0ns。
以下是建立时间检查的路径报告:
以下是保持时间检查的路径报告:
在设计中通常会定义多个时钟,这些时钟的频率是彼此的整数倍。在这种情况下,会通过计算所有相关时钟(related clocks)之间的公共基本周期来执行 S T A STA STA(如果两个时钟域之间具有数据路径,则两个时钟相关)。建立公共基本周期的目的是以便所有时钟都同步。
以下是三个相关时钟的示例:
create_clock -name CLKM \
-period 20 -waveform {0 10} [get_ports CLKM]
create_clock -name CLKQ -period 10 -waveform {0 5}
create_clock -name CLKP \
-period 5 -waveform {0 2.5} [get_ports CLKP]
分析 C L K P CLKP CLKP和 C L K M CLKM CLKM时钟域之间的路径时,将使用 20 n s 20ns 20ns的公共基本周期,如图8-33所示。
Expanding clock 'CLKP' to base period of 20.00 (old period was
5.00, added 6 edges).
Expanding clock 'CLKQ' to base period of 20.00 (old period was
10.00, added 2 edges).
以下是建立时间检查的路径报告,用于从较快时钟 C L K P CLKP CLKP到较慢时钟 C L K M CLKM CLKM的路径。
相应保持时间检查的路径报告如下:
考虑当两个频率不是彼此整数倍的时钟域之间存在数据路径的的情况。例如,发起时钟是公共时钟的 8 8 8分频,而捕获时钟是公共时钟的 5 5 5分频,如图8-34所示。本节将介绍在这种情况下如何执行建立时间和保持时间检查。
以下是时钟定义(波形图如图8-35所示)。
create_clock -name CLKM \
-period 8 -waveform {0 4} [get_ports CLKM]
create_clock -name CLKQ -period 10 -waveform {0 5}
create_clock -name CLKP \
-period 5 -waveform {0 2.5} [get_ports CLKP]
时序分析会先计算相关时钟的公共周期,然后再将时钟扩展到该公共周期。请注意,仅针对相关时钟(即在它们之间具有时序路径的时钟)去计算公共周期。 C L K Q CLKQ CLKQ和 C L K P CLKP CLKP之间数据路径的公共周期仅扩展为 10 n s 10ns 10ns的公共周期, C L K M CLKM CLKM和 C L K Q CLKQ CLKQ之间数据路径的公共周期为 40 n s 40ns 40ns,而 C L K M CLKM CLKM和 C L K P CLKP CLKP之间数据路径的公共周期也为 40 n s 40ns 40ns。
让我们考虑一条从 C L K M CLKM CLKM时钟域到 C L K P CLKP CLKP时钟域的数据路径,这种情况下时序分析的公共基本周期为 40 n s 40ns 40ns。
建立时间检查在时钟发起沿和捕获沿之间的最短时间内进行。在我们从 C L K M CLKM CLKM到 C L K P CLKP CLKP的示例路径中,这就是 24 n s 24ns 24ns处的时钟 C L K M CLKM CLKM发起沿以及 25 n s 25ns 25ns处的时钟 C L K P CLKP CLKP捕获沿。
以下是保持时间检查的路径报告,最严格的保持时间检查是从 0 n s 0ns 0ns处的 C L K M CLKM CLKM发起沿到 0 n s 0ns 0ns处的 C L K P CLKP CLKP捕获沿。
现在,我们对从 C L K P CLKP CLKP时钟域到 C L K M CLKM CLKM时钟域的路径的建立时间进行检查。在这种情况下,最严格的建立时间检查是从 15 n s 15ns 15ns处的时钟 C L K P CLKP CLKP发起沿到 16 n s 16ns 16ns处的时钟 C L K M CLKM CLKM捕获沿。
以下是保持时间检查的路径报告,同样,最严格的还是0ns处的检查。
在以下示例中,两个时钟有 90 ° 90° 90°的相移(phase shift):
create_clock -period 2.0 -waveform {0 1.0} [get_ports CKM]
create_clock -period 2.0 -waveform {0.5 1.5} \
[get_ports CKM90]
图8-36给出了使用这两个时钟的示例。建立时间检查的路径报告如下:
0.5 n s 0.5ns 0.5ns处的 C K M 90 CKM90 CKM90第一个上升沿是捕获沿,保持时间检查是在建立时间捕获沿之前一个周期的时钟沿处。对于 2 n s 2ns 2ns的发起沿,建立时间捕获沿为 2.5 n s 2.5ns 2.5ns,因此保持时间检查沿就在 0.5 n s 0.5ns 0.5ns处的前一个捕获沿。保持时间检查的路径报告如下:
在第10章中还会介绍其它时序检查,例如数据到数据(data to data)检查和时钟门控(clock gating)检查。