文章目录
8.3 多周期路径(Multicycle Paths)
在一些情况中,两个触发器之间的组合数据路径可能需要一个以上的时钟周期才能在逻辑中传播。在这些情况下,组合逻辑路径被称作多周期路径(multicycle path)。尽管数据在每个时钟沿被捕获触发器所捕获,我们仍需告知 S T A STA STA在指定数目的时钟周期后才会出现相关/有效的捕获时钟沿。
图8-14展示了一个例子。正如数据路径可以占据三个时钟周期,所以需要指定三个时钟周期的多周期建立时间。多周期建立时间约束指定的实现如下:
![](https://i-blog.csdnimg.cn/blog_migrate/202652578b2b3c213844e5b139815950.png)
create_clock -name CLKM -period 10 [get_ports CLKM]
set_multicycle_path 3 -setup \
-from [get_pins UFF0/Q] \
-to [get_pins UFF1/D]
多周期建立时间约束规定,建立时间检查时从 U F F 0 / C K UFF0 / CK UFF0/CK到 U F F 1 / D UFF1 / D UFF1/D的路径最多可以花费三个时钟周期,这意味着设计每三个周期才会使用一次 U F F 1 / Q UFF1 / Q UFF1/Q引脚上输出的数据,而不是每个周期都使用。
以下是一份具有多周期约束的建立时间路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/a9536e1925f47a013bd0344bb330be68.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9f4e9131c96e68a8d1174dc7a317f203.png)
![](https://i-blog.csdnimg.cn/blog_migrate/95716b133bb2e5f5ae52092bf23dcbcb.png)
注意捕获触发器的时钟沿现在已是三个时钟周期了,为 30 n s 30ns 30ns。
现在我们进行样例多周期路径的保持时间检查。在最常见的场景中,我们想要保持时间检查与单周期路径的情况保持一样,如图8-14所示。这样可以保证数据在三个时钟周期的时间里可以自由改变。只有指定多周期保持时间为 2 2 2,才可以获得与单周期建立时间检查情况相同的保持时间检查。这是因为若没有这个多周期保持时间的设定,默认的保持时间检查将在建立时间捕获沿前一周期的有效沿处进行,这不是我们想要的。需要将保持时间检查移动至默认保持时间检查沿的前两个时钟周期,因此多周期保持时间指定为 2 2 2。预想的行为如图8-15所示。有了多周期保持时间,数据路径的最小延迟可以比一个时钟周期更短。
![](https://i-blog.csdnimg.cn/blog_migrate/28dd631f3341261c706d5853b38fd739.png)
set_multicycle_path 2 -hold -from [get_pins UFF0/Q] \
-to [get_pins UFF1/D]
多周期保持时间的周期数目表明了要将其从默认保持时间检查时间沿向前移动多少个周期时间(也即是建立时间检查检查捕获时间沿之前的有效沿)。以下是路径时序报告:
![](https://i-blog.csdnimg.cn/blog_migrate/81f25a9d4e69e4823c2227b3f2bdf449.png)
![](https://i-blog.csdnimg.cn/blog_migrate/05f216aa0f28bb06798c57079a420cb0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a0c2b8fcc2ce10306277db12d369db10.png)
既然该路径的多周期建立时间是三个时钟周期,其默认保持时间检查是在捕获时钟沿前一个有效时钟沿上进行的。在大多数的设计中,如果最大路径(或建立时间)要求 N N N个时钟周期,那么将最小路径约束至比 ( N − 1 ) (N-1) (N−1)个时钟周期更大是不可行的(不能在发起时钟沿前?)。通过指定多周期保持时间为 2 2 2,保持时间检查进行的时钟沿移动至发起时钟沿,就如以上的路径时序报告所显示的那样。
因此,在大多数设计中,多周期建立时间设置为 N N N(个时钟周期),相应的多周期保持时间约束设置为 N − 1 N-1 N−1(个时钟周期)。
如果多周期建立时间设置为 N N N个时钟周期但对应的多周期保持时间没有设定会发生什么?在该情况下,保持时间检查在建立时间捕获沿的前一个有效时钟沿进行,这样的在多周期建立时间为 3 3 3的保持时间检查如图8-16所示。
![](https://i-blog.csdnimg.cn/blog_migrate/a3ed164a609f068af9013eb13fb947e1.png)
如上图所示,这样施加了限制使得数据只能够在建立时间捕获时间沿前的一个时钟周期内改变。因此数据路径必须最小有两个时钟周期的时延来满足该限制。以下是该情况下的路径时序报告:
![](https://i-blog.csdnimg.cn/blog_migrate/01d3bc6b68a7682ca48ac0159422ace2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5893b534bed8602e01e3a43267eaaeab.png)
![](https://i-blog.csdnimg.cn/blog_migrate/19f45a9b72800a78e4a0b77439e9ff91.png)
从路径时序报告中注意到保持时间检查在捕获沿的前一有效时钟沿进行,导致了很大的违例。实际上,保持时间检查要求组合逻辑电路的时延要在两个时钟周期及以上。
跨时钟域(Crossing Clock Domains)
让我们考虑在周期相同(the same period)的两个不同时钟之间存在多周期路径的情况。(时钟周期也不同的情况将在本章后面进行介绍。)
E x a m p l e I : Example\,\, I: ExampleI:
create_clock -name CLKM \
-period 10 -waveform {0 5} [get_ports CLKM]
create_clock -name CLKP \
-period 10 -waveform {0 5} [get_ports CLKP]
多周期建立时间约束指定了给定路径的时钟周期数,如图8-17所示。默认建立时间捕获沿总是与发起沿相隔一个时钟周期,约束多周期建立时间为 2 2 2会使建立时间捕获沿与发起沿相隔 2 2 2个时钟周期。
![](https://i-blog.csdnimg.cn/blog_migrate/c8e0941840a6b36d725860b0f6b46b4f.png)
多周期保持时间约束指定了保持时间检查应该在建立时间捕获沿之前几个时钟周期的时钟沿处执行,无论建立时间发起沿在何处,如图8-18所示。默认的保持时间检查是在建立时间捕获沿之前一个周期的时钟沿处执行的。约束多周期保持时间为 1 1 1会将保持时间检查放置于默认保持时间检查之前一个周期的时钟沿处,因此变为建立时间捕获沿之前两个周期的时钟沿处。
![](https://i-blog.csdnimg.cn/blog_migrate/42c4efb604df163b5e5d9bcda925d71a.png)
set_multicycle_path 2 \
-from [get_pins UFF0/CK] -to [get_pins UFF3/D]
# Since no -hold option is specified, the default option
# -setup is assumed. This implies that the setup
# multiplier is 2 and the hold multiplier is 0.
以下是对应于多周期指定的建立时间路径时序报告。
![](https://i-blog.csdnimg.cn/blog_migrate/77423dde8a97abe7fe0fbb593eca48ba.png)
注意到路径时序报告中的路径组总是依据捕获触发器的所处的时钟域来确定的,在该例中,是 C L K P CLKP CLKP。
接下来是保持时间检查的路径时序报告。多周期保持时间约束默认为 0 0 0,因此保持时间检查在 10 n s 10ns 10ns处进行,在建立时间捕获沿前一个时钟周期处的有效沿的位置。
![](https://i-blog.csdnimg.cn/blog_migrate/09b92d40fb3005bfea7a2a19efedba91.png)
上面报告显示了保持时间违例可以通过设置多周期保持时间约束为 1 1 1来消除。下面另一单独示例说明了这点:
E x a m p l e I I Example\,\, II ExampleII
如下给出另一个不同时钟域多周期设置的例子:
set_multicycle_path 2 \
-from [get_pins UFF0/CK] -to [get_pins UFF3/D] -setup
set_multicycle_path 1 \
-from [get_pins UFF0/CK] -to [get_pins UFF3/D] -hold
# The -setup and -hold options are explicitly specified.
以下是当多周期建立时间为 2 2 2个时钟周期时的建立时间检查路径报告。
![](https://i-blog.csdnimg.cn/blog_migrate/40b42d9e8ec84435c5e6f328d2b4e7f2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/25c22809fb3acded8e5dcc0d03cb5bba.png)
以下是多周期保持时间设定为 1 1 1时的保持时间检查路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/87b97e8959f86ac7a71100a3d5a1c554.png)
请注意,本节中建立时间检查和保持时间检查的示例报告是针对同一工艺角(corner)的。通常,在最坏情况的慢速工艺角下,建立时间检查最难满(裕量最小),而在最佳情况的快速工艺角下,保持时间检查最难满足(裕量最小)。
8.4 伪路径(False Paths)
在设计具体功能运行中,一些时序路径可能不真实(或不可能)存在。将这些路径设为伪路径可使得在进行 S T A STA STA时关闭它们。伪路径在 S T A STA STA分析中被忽略。
伪路径的例子可以是从一个时钟域到另一个时钟域,从一个触发器的时钟引脚到另一个触发器的输入,通过一个单元的引脚,通过多个单元的引脚或这些情况的组合。当指定伪路径通过某个单元的引脚时,所有通过该引脚的路径都会被时序分析所忽略。指出伪路径的好处是使得分析空间缩小,进而允许分析过程更专注于真实路径,这样可以帮助缩减分析所花费时间。然而,太多由-through
所通配指定的伪路径也会导致分析过程变慢。
可以使用set_false_path
命令来约束伪路径,例子如下:
set_false_path -from [get_clocks SCAN_CLK] \
-to [get_clocks CORE_CLK]
# Any path starting from the SCAN_CLK domain to the
# CORE_CLK domain is a false path.
set_false_path -through [get_pins UMUX0/S]
# Any path going through this pin is false.
set_false_path \
-through [get_pins SAD_CORE/RSTN]]
# The false path specifications can also be specified to,
# through, or from a module pin instance.
set_false_path -to [get_ports TEST_REG*]
# All paths that end in port named TEST_REG* are false paths.
set_false_path -through UINV/Z -through UAND0/Z
# Any path that goes through both of these pins
# in this order is false.
以下是设置伪路径的推荐方法。设置两时钟域间的伪路径使用:
set_false_path -from [get_clocks clockA] \
to [get_clocks clockB]
而不要使用:
set_false_path -from [get_pins {regA_*}/CP] \
-to [get_pins {regB_*}/D]
第二种形式要慢许多。
另一个推荐方法是减少-through
选项的使用,因为其增加了不必要的运行时复杂度。-through
选项只有在绝对必要和没有替代方法的情况下才用来指定伪路径。
从优化的角度出发,还有一个建议是不要将一条多周期路径约束为伪路径。如果需要在已知或可预测的时刻对信号进行采样,则无论时间间隔多大,都应使用多周期路径约束,以使路径具有一定的约束条件并进行优化以满足多周期约束。如果把一条许多时钟周期后进行采样的路径指定为了伪路径,则对设计中其余逻辑路径的优化可能会使该路径变长,甚至超出所需的时间。
8.5 半周期路径(Half-Cycle Paths)
如果一个设计同时有负边沿触发器(有效时钟沿是下降沿)和正边沿触发器(有效时钟沿是上升沿),设计中便很可能存在半周期路径。一个半周期路径可以是从一个上升沿触发器到下降沿触发器,或反之。图8-19展示的是在触发器 U F F 5 UFF5 UFF5的时钟下降沿发起,在触发器 U F F 3 UFF3 UFF3的时钟上升沿捕获的例子。
![](https://i-blog.csdnimg.cn/blog_migrate/ffcd26f0efcc7a275a78197088c95dea.png)
以下是建立时间检查路径时序报告:
![](https://i-blog.csdnimg.cn/blog_migrate/1a97ebceb9ad5d40a94f3411d454a4a9.png)
注意起始点(Startpoint
)和终止点(Endpoint
)的边沿设定。下降沿在
6
n
s
6ns
6ns时刻到达,上升沿在
12
n
s
12ns
12ns时刻到达。因此,数据仅花费了
6
n
s
6ns
6ns也即半个周期便传播至捕获触发器。
虽然在建立时间检查时数据路径仅有半个时钟周期,但额外的半个周期可用于保持时间检查。以下是保持时间检查的路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/c5ca1e40bb235ae8152292ecaa25e21b.png)
保持时间检查通常是在捕获沿之前一个周期的捕获沿上执行的。由于捕获沿是在 12 n s 12ns 12ns处,因此前一个捕获沿在 0 n s 0ns 0ns处,故将在 0 n s 0ns 0ns处检查保持时间。这为保持时间检查有效地增加了半个时钟周期的裕量,因此可以看见保持时间检查有较大的正裕量。
8.6 撤销时间检查(Removal Timing Check)
撤销时间检查(removal timing check)可确保在有效时钟沿与释放异步控制信号之间有足够的时间。该检查可确保有效时钟沿不带来影响,因为异步控制信号将保持有效状态,直到有效时钟沿之后一段撤销时间为止。换句话说,异步控制信号会在有效时钟沿之后被释放(变为无效),因此该时钟沿不会产生任何影响,如图8-20所示。
![](https://i-blog.csdnimg.cn/blog_migrate/6b911f67ec0614cbbf3fab99481d89c3.png)
该检查基于的是触发器异步引脚上指定的撤销时间。以下是单元库中与撤销时间检查有关的描述片段:
pin(CDN) {
. . .
timing() {
related_pin : "CK";
timing_type : removal_rising;
. . .
}
}
和保持时间检查一样,也是最小路径检查除了是在触发器的异步引脚上进行。
![](https://i-blog.csdnimg.cn/blog_migrate/22b5c36b866258e1375d6a27f54ddcfb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5d9caa662868a2a56c02bd909ebc90bd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/55b7d58e0e0d0e71da00bf109d9fa32e.png)
终止点(Endpoint
)显示这是撤销时间检查,在触发器
U
F
F
6
UFF6
UFF6的异步引脚
C
D
N
CDN
CDN上进行。该触发器的撤销时间在报告中以library removal time
显示为
0.19
n
s
0.19ns
0.19ns。
所有的异步时序检查均指派为async_default
路径组。
8.7 恢复时间检查(Recovery Timing Check)
恢复时间检查(recovery timing check)可确保异步信号变为无效状态的时刻与下一个有效时钟沿之间的时间间隔大于一个最小值。换句话说,此检查可确保在异步信号变为无效状态之后,有足够的时间恢复,以便下一个有效时钟沿可以生效。例如,考虑从异步复位变为无效的时刻到触发器有效时钟沿之间的时间间隔。如果该时间间隔太短即有效时钟沿在复位释放后太早出现,则触发器可能进入未知的状态。恢复时间检查如图8-21所示。
![](https://i-blog.csdnimg.cn/blog_migrate/fa8a9a64f37bd7d09be946eafdabdc51.png)
该检查基于的是触发器异步引脚上指定的恢复时间,单元库文件中与恢复时间有关的描述片段如下:
pin(RSN) {
. . .
timing() {
related_pin : "CK";
timing_type : recovery_rising;
. . .
}
}
与建立时间检查一样,该检查也是针对最大路径的,不过是在触发器的异步引脚上。
以下是一份恢复时间检查的路径报告:
![](https://i-blog.csdnimg.cn/blog_migrate/bbf2e2bf6d1201e5cab6543cdc902d21.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d60ba9fae09417146370fdbd939902c.png)
终止点(Endpoint
)显示这是一个恢复时间检查。触发器
U
F
F
6
UFF6
UFF6的恢复时间在报告中显示为library recovery time
,值为
0.09
n
s
0.09ns
0.09ns。恢复时间检查也属于async_default
路径组。
8.8 跨时钟域时序(Timing across Clock Domains)
8.8.1 慢速时钟域到快速时钟域(Slow to Fast Clock Domains)
让我们对一条从慢速时钟域到快速时钟域的路径进行建立时间和保持时间检查。如图8-22所示。
![](https://i-blog.csdnimg.cn/blog_migrate/89ea5ed6f3e48582063b97a258a4da77.png)
以下是该例子的时钟定义:
create_clock -name CLKM \
-period 20 -waveform {0 10} [get_ports CLKM]
create_clock -name CLKP \
-period 5 -waveform {0 2.5} [get_ports CLKP]
当发起触发器和捕获触发器的时钟频率不同, S T A STA STA进行分析时首先确定一个公共基本周期(common base period)。一个 S T A STA STA运行在这种情况下所产生的提示信息如下所示。较快的时钟频率进行分频延拓获得公共周期。
Expanding clock 'CLKP' to base period of 20.00
(old period was 5.00, added 6 edges).
![](https://i-blog.csdnimg.cn/blog_migrate/d28832bc7ed44a2bb373e52f310efe7c.png)
图8-23展示了建立时间检查。默认情况下,使用的是最严格的建立时间边沿关系,也即是下个周期的有效沿为捕获沿( 5 n s 5ns 5ns处)。以下是建立时间路径时序报告。
![](https://i-blog.csdnimg.cn/blog_migrate/2e996387ebe125d41c688ae6e3c52fb3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/10a5ea1dfe5f358e0452205abad78d20.png)
注意到发起时间为 0 n s 0ns 0ns,捕获时间为 5 n s 5ns 5ns。
正如先前所讨论的,保持时间检查与建立时间检查相关且确保了数据被时钟沿发起后不会影响上一个数据的捕获。以下是保持时间检查时序报告。
![](https://i-blog.csdnimg.cn/blog_migrate/644c8630c8b4680b8f4b7283c00fb0c0.png)
在以上例子中,可以看到发起数据在每第四个周期便可用(建立时间捕获沿是下一个有效沿,保持时间检查是建立时间捕获沿的前一个有效时钟沿)。让我们假定设计的目的不是在 C L K P CLKP CLKP的下一个有效沿上就捕获数据,二十在每第四个捕获沿上捕获数据。该假设给触发器之间的组合逻辑路径提供了四个 C L K P CLKP CLKP周期的时间,也即 20 n s 20ns 20ns。可以通过设置以下多周期路径约束来做到这点:
set_multicycle_path 4 -setup \
-from [get_clocks CLKM] -to [get_clocks CLKP] -end
![](https://i-blog.csdnimg.cn/blog_migrate/e79600ca4763e3878770ad134ca7f474.png)
-end
选项指定了多周期
4
4
4指向的是终止点或捕获时钟。该多周期路径约束改变了建立时间和保持时间检查为图8-24中的形式。以下是建立时间检查时序报告。
![](https://i-blog.csdnimg.cn/blog_migrate/4034119e6654b6f9fccdc6daf8d44fc2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aededaf25923febfd063690cca101dc0.png)
图8-24展示了保持时间检查——注意到保持时间检查由建立时间检查推导出来且默认为建立时间捕获时钟沿的前一个周期的有效时钟沿。以下是保持时间报告。注意到保持时间捕获沿在 15 n s 15ns 15ns处,建立时间检查捕获沿的前一个周期。
![](https://i-blog.csdnimg.cn/blog_migrate/7c44b64f2f1ac9629c8f67380baab6f5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/47ac006e50db6e80490ca9f623d3907b.png)
在大多数设计中,这并不是想要的检查,且保持时间检查应当在挪至发起时钟沿进行。我们通过设置多周期路径保持时间约束为 3 3 3来实现该要求。
set_multicycle_path 3 -hold \
-from [get_clocks CLKM] -to [get_clocks CLKP] -end
这样将保持时间检查的捕获沿向前移动了三个周期到了
0
n
s
0ns
0ns处。与多周期建立时间的不同之处是,在建立时间检查中其捕获沿向时间轴右移动指定数目的周期时间,而在保持时间检查中其捕获沿向时间轴左移动指定数目的周期时间(从建立时间检查捕获沿的前一周期开始)。-end
选项意味着我们想将终点(或捕获边沿)移回指定的周期数,即捕获时钟的周期数。代替-end
的另一种选项-start
指定了要移动的发起时钟周期数,-end
选项指定了要移动的捕获时钟周期数。-end
是多周期建立时间约束的默认值,-start
是多周期保持时间约束的默认值。
![](https://i-blog.csdnimg.cn/blog_migrate/014c1d8159b9b11e7edec618b8e3f856.png)
有了另外的多周期保持时间约束,用于保持时间检查的时钟沿向前移动,效果如图8-25所示。有多周期保持时间约束的保持时间时序报告如下。
![](https://i-blog.csdnimg.cn/blog_migrate/993cb930931cdf28681d515efb57baf3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3ef9594917997806a4c2612d6c67c3f9.png)
总而言之,如果多周期建立时间约束设置的为
N
N
N个时钟周期,那么多周期保持时间约束多设置为
N
−
1
N-1
N−1个时钟周期。对于慢速时钟域到快速时钟域的多频率多周期路径进行设置的经验法则便是使用-end
选项。有了该选项,建立时间和保持时间检查便会根据快速时钟进行相应调整(慢速到快速,捕获触发器时钟频率快,调整捕获时钟沿的位置,所以使用-end
选项)
8.8.2 快速时钟域到慢速时钟域(Fast to Slow Clock Domains)
在本小节中,我们考虑数据路径从快速时钟域到慢速时钟域的示例。使用以下时钟定义时,默认的建立时间和保持时间检查如图8-26所示。
create_clock -name CLKM \
-period 20 -waveform {0 10} [get_ports CLKM]
create_clock -name CLKP \
-period 5 -waveform {0 2.5} [get_ports CLKP]
![](https://i-blog.csdnimg.cn/blog_migrate/36cbbe26fafba34057333591d3cd445f.png)
总共可能有四种建立时间检查,请参阅图8-26中的 S e t u p 1 Setup1 Setup1, S e t u p 2 Setup2 Setup2, S e t u p 3 Setup3 Setup3和 S e t u p 4 Setup4 Setup4。其中,最严格的是 S e t u p 4 Setup4 Setup4检查。以下是此最严格检查的路径报告。请注意,数据发起时钟沿为 15 n s 15ns 15ns,捕获时钟沿为 20 n s 20ns 20ns。
![](https://i-blog.csdnimg.cn/blog_migrate/7385678024f7a1393391e60208d51aca.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ce7593c50677c9c1f824cd0d260c461e.png)
与建立时间检查相似,也有四种可能的保持时间检查。图8-26展示了最严格的保持时间检查,以确保在 0 n s 0ns 0ns的保持时间捕获沿不会捕获到在 0 n s 0ns 0ns发起的数据。以下是保持时间检查的时序报告:
![](https://i-blog.csdnimg.cn/blog_migrate/ca8aba30b0556c264df3e5be38ade1b9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/22479f8522012b145f84e6d721d813fc.png)
一般而言,设计者可能会指定从快速时钟域到慢速时钟域的数据路径为一个多周期路径。如果将数据路径的建立时间检查放松到对于快速时钟域的两个时钟周期,以下指定将包含在多周期路径的设置当中:
set_multicycle_path 2 -setup \
-from [get_clocks CLKP] -to [get_clocks CLKM] -start
set_multicycle_path 1 -hold \
-from [get_clocks CLKP] -to [get_clocks CLKM] -start
# The -start option refers to the launch clock and is
# the default for a multicycle hold.
![](https://i-blog.csdnimg.cn/blog_migrate/07cbaa78b0c4300d4c27e6bf0d1dd340.png)
在这种情况下,图8-27展示了用来建立时间和保持时间检查的时钟沿。-start
选项指定了单位发起时钟周期(这里是
C
L
K
P
CLKP
CLKP)中所包含的时钟周期数目(这里是
2
2
2)。约束多周期建立时间为
2
2
2会将发起沿移动到默认发起沿之前的一个时钟沿,即在
10
n
s
10ns
10ns而不是默认的
15
n
s
15ns
15ns处。多周期保持时间约束确保了在
0
n
s
0ns
0ns处发起沿发起的数据,不会被
0
n
s
0ns
0ns处的捕获沿捕获到。
以下是建立时间检查的路径报告。与预期一样,发起时钟沿为10ns,捕获时钟沿为20ns。
![](https://i-blog.csdnimg.cn/blog_migrate/e0ff4e2edb517eece955cd319890c6d9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c2a543a1230387180d11b98a12906043.png)
以下是保持时间检查的路径报告。保持时间检查是在0ns处执行的,此时捕获时钟和发起时钟均为上升沿。
![](https://i-blog.csdnimg.cn/blog_migrate/0b9ed06f6058d40024e9048d1170dde1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/83ee18c8bbe3d6bd690bcc904183725d.png)
与从慢速时钟域到快速时钟域的路径不同,在从快速时钟域到慢速时钟域的路径中,多周期路径约束的一个经验法则是使用-start
选项,然后再根据快速时钟调整建立时间和保持时间检查。