參考博文:多周期路徑及set_multicycle_path詳解_Jackiezhang1993的博客-CSDN博客_multicycle path
默認情況下綜合工具會把每條路徑定義為單周期路徑,即源觸發器在時鍾的任一邊沿啟動(launch)的數據都應該由目的觸發器在時鍾的下一上升沿捕獲(capture)。
有的設計可能存在時序例外(timing exceptions),如多周期路徑、虛假路徑等。數據從起點到終點的傳輸時間需要一個時鍾周期以上才能穩定的路徑,這類路徑被稱為多周期路徑。在設計中很多地方都有涉及多周期路徑,比如當個兩個觸發器之間的邏輯如果一個周期執行不完,這種情況一般有兩個解決方案:
①插入流水線使得組合邏輯打散 ;
②使用使能信號控制,幾個周期讀取一次數據。
方法2就需要設定multi-cycle path,方法2和1之間是有區別的。方法1數據的吞吐量更大,方法2犧牲了數據吞吐量,但是設計中有的地方對吞吐量沒有要求是可以使用這種方法的。
一、set_multicycle_path命令
命令格式如下:
set_multicycle_path
path_multiplier
[-setup|-hold]
[-start|-end]
[-from from_list]
[-through through_list]
[-to to_list]
path_multiplier:默認值setup時為1,hold時為0;
setup|hold:表明多周期路徑設置是對setup(max_delay)或者是hold(min_delay),setup時默認移動capture_clk,hold時默認移動launch_clk;
start:表示強制移動的為start clock即launch clock;
end: 表示強制移動的為end clock即capture clock。
ps:當start clock和end clock同頻時,不用指定start/end,因為移動哪一個都一樣效果。
二、4種不同場景
1、同頻同相
如下圖所示,時鍾上升沿對齊,且默認的STA檢查情況為單周期:
此時的multicycle默認設置如下(單周期路徑默認關系):
set_multicycle_path 1 -setup -from CLK1 -to CLK2
set_multicycle_path 0 -hold -from CLK1 -to CLK2
即默認情況下:setup檢查是從launch_clk的一個上升沿到capture_clk的下一個上升沿,hold檢查是從launch_clk的一個上升沿到capture_clk的捕獲沿的前一個沿。
現進行設置:set_multicycle_path 2 -setup -from CLK1 -to CLK2 ,對應的時序檢查變為(capture_clk右移(2-1)個周期):
此時hold檢查還是默認設置,即跟隨capture_clk向右移動1個period。
根據STA中的“Hold Relationship”,hold檢查過於寬松,需要設置:
set_multicycle_path -hold 1 -from CLK1 -to CLK2
這樣hold檢查向后(左)移動(延遲)1個period,由於-hold默認移動launch_clk,也就是launch_clk向前(向右)移動了1個時鍾周期(也可看做capture_clk向左移動了1個時鍾周期),如下圖:
補充:對於多周期路徑,為什么要將保持檢查沿恢復到初始位置?
對於上述clk的周期為T=4ns,現在若只設置set_multicycle_path 2 -setup -from CLK1 -to CLK2后,由於hold檢查比setup檢查往左一個時鍾周期,則要求數據到達觸發器的時間范圍為:[4ns+Th,8ns-Ts],此時由於數據采集每2個時鍾周期一次,這樣對於保持關系過於苛刻,實際數據可到達的時間范圍是[0ns+Th,8ns-Ts]。所以,可以設置set_multicycle_path 1 -hold -from CLK1 -to CLK2,這樣使得數據到達觸發器的時間范圍變為上述范圍(Th為保持時間,Ts為建立時間),這樣多周期路徑部分電路的優化范圍就變大了。
2、同頻異相
①capture_clk比launch_clk稍晚一點(0.3ns),默認檢查關系如下:
此時時鍾周期為4ns,建立檢查為0.3ns過小,而保持檢查3.7ns過於豐富,時序很難收斂,需設置如下(hold檢查的多周期路徑無需設置,可以滿足):
set_multicycle_path 2 -setup -from CLK1 -to CLK2
②目的時鍾超前發送時鍾0.3ns
此時建立檢查3.7ns,保持檢查0.3ns,比較正常無需增加約束。
3、慢到快
默認檢查關系(最悲觀):
默認設置:
set_multicycle_path 1 -setup -end -from CLK1 -to CLK2
set_multicycle_path 0 -hold -start -from CLK1 -to CLK2
現將setup放松2個周期檢查,設置如下:
set_multicycle_path 3 -setup [-end] -from CLK1 -to CLK2
此時-setup默認右移capture_clk,增加-end便於可讀性。
此時為遵守嚴謹的保持關系,需設置如下:
set_multicycle_path 2 -hold -end -from CLK1 -to CLK2
此時注意:
①由於launch_clk和capture_clk的頻率不一樣,所以需要用-start/end來指定移動的clk,這樣PT檢查才不會出錯。
②由於-hold默認向右移動launch_clk,現在加上-end后即為指定向左移動capture_clk。
4、快到慢
時鍾關系如下圖,且分析最悲觀情況下的建立/保持關系:
此時默認設置還是:
set_multicycle_path 1 -setup -end -from CLK1 -to CLK2
set_multicycle_path 0 -hold -start -from CLK1 -to CLK2
現在放松2個周期檢查,設置如下:
set_multicycle_path 3 -setup -start -from CLK1 -to CLK2
根據嚴謹的保持關系,需要設置hold檢查如下,其中-hold參數默認向右移動launch_clk,但由於時鍾頻率的不同建議加上-start增加易讀性:
set_multicycle_path 2 -hold [-start] -from CLK1 -to CLK2
5、總結
①-setup/hold參數默認分別向右移動EndClock/StartClock;
②為了將保持沿恢復到初始位置,保持因子比建立因子小1;(異相情況除外)
對於N倍頻同步時鍾:
③建立數字等於兩個時鍾頻率比N;
④將較快的時鍾指定為設置對象
⑤需要使用-start/end參數對應指定強制移動StartClock/EndClock,若與setup/hold參數默認相反,則被強制移動的時鍾移動方向向左;