set_multicycle_path约束命令:
set_multicycle_path N [-setup|-hold] [-start|-end] [-from ] [-to ] [-through ]
--setup:指定本约束是针对建立时间检查而设置的约束
--hold:指定本约束是针对保持时间检查而设置的约束
--from:数据发射端launch时钟
--to: 数据接收端capture时钟
--start:指定本约束是针对源端(多用于慢时钟采快时钟的场景)
--end: 指定本约束是针对目的端(多用于快时钟采慢时钟的场景)
其中,setup约束默认的是移动捕获沿(capture_edge),hold 约束默认的是移动发射沿(launch_edge)。
一、同频同相时钟的场景:
默认的约束配置:
set_multicycle_path 1 -setup -from CLK_FF1 -to CLK_FF2( -end)
set_multicycle_path 0 -hold -from CLK_FF2 -to CLK_FF2 (-start)
对应的setup和hold检查位置关系如下:
由于Slow logic的delay延迟过大,将setup约束放松一个capture时钟检查,所以设置multicycle约束,如下:
set_multicycle_path 2 -setup -from CLK_FF1 -to CLK_FF2( -end)
setup检查位置向右移动了一个capture时钟周期,同样hold检查的位置跟随setup的约束向右移动了一个clock周期,为了放松hold检查,需增加对hold的检查约束,如下:
set_multicycle_path 1 -hold -from CLK_FF1 -to CLK_FF2( -end)
这样,hold检查从CLK_FF1位置3回到位置1处了。
二、快时钟到慢时钟的场景:
默认的约束配置:
set_multicycle_path 1 -setup -from CLK_Fast -to CLK_Slow -end
set_multicycle_path 0 -hold -from CLK_Fast -to CLK_Slow -start
对应的setup和hold检查位置关系如下:
现在存在4种可能的时序检查,如上图种setup_1、setup_2、setup_3和setup_4,不难发现4个检查最严格的是setup_4,launch_edge时钟沿在CLK_FF1 时钟15处,capture_edge时钟沿在CLK_FF2时钟5处。同样,有4种可能的hold检查,上图画处最为严格的hold检查。为了满足setup时序检查,现将launch时钟放松3个时钟周期检查,设置multicycle约束如下:
set_multicycle_path 4 -setup -from CLK_FF1 -to CLK_FF2 -start
经过setup的约束设置后,hold的检查launch_edge移动到了位置3处:
由于setup检查的launch_edge向左移动了3个clock周期,hold检查的launch_edge同样向左移动了3个clock周期。为了保证保持hold检查原来的位置关系,hold检查的launch_edge需要向右移动3个时钟周期,则需要设置约束如下:
set_multicycle_path 3 -hold -from CLK_FF1 -to CLK_FF2 -start
这样,hold检查从CLK_FF1位置3回到位置9处了。
三、慢时钟到快时钟的场景:
默认的约束配置如下:
set_multicycle_path 1 -setup -from CLK_Fast -to CLK_Slow -end
set_multicycle_path 0 -hold -from CLK_Fast -to CLK_Slow -start
对应的setup和hold检查位置关系如下:
由于seup检查过于严格,现在将setup放松3个时钟周期检查,multicycle约束设置如下:
set_multicycle_path 4 -setup -from CLK_FF1 -to CLK_FF2 -end
经过setup的约束设置后,setup检查的capture_edge向右移动了3个时钟时钟周期,hold的检查同样向右移动到了3个capture时钟周期在位置7处,如下:
由于setup检查的capture_edge向右移动了3个clock周期,hold检查的capture_edge同样向右移动了3个capture时钟周期。为了保证hold检查原来的位置关系,hold检查的capture_edge需要向左移动3个capture时钟周期,则需要设置约束如下:
set_multicycle_path 3 -hold -from CLK_FF1 -to CLK_FF2 -end
这样,hold检查从CLK_FF2位置7回到位置1处了。