本文來自 XILINX 產品應用工程師 John Bieker
本文旨在提供一種方法,以幫助設計師判斷給定模塊是否能夠在空裸片上達成時序收斂。 如果目標模塊無法在空裸片上達成非關聯 (OOC) 時序收斂,則恐難以與設計其余部分達成關聯性時序收斂。設計師可從完整設計中提取目標模塊、對其進行布局規劃、約束,然后通過實現工具來運行這些模塊,以判斷是否能夠獨立達成時序收斂。
隨著設計復雜性和規模的持續增加,以可重復且可靠方式達成時序收斂的難度也變得越來越高。 完全完成大型設計的布局布線所需運行時間冗長,導致難以應對期間種種狀況,但對完全完成組裝的設計進行時序分析時,設計師一般會發現發生的大部分時序違例都集中于少數幾個關鍵模塊。
在此情況下,如下方法很有效:可通過執行可行性分析來查看存在大量違例的模塊本身在非關聯實現情況下能否達成時序收斂。此分析的目的是降低完全布局布線任務的復雜性,以便幫助設計師加速迭代,從而更快找到潛在解決方案。
在本文中,我們將講解一種常見用例,即從已布線的設計中提取出一個分層塊(目標模塊)進行非關聯實現。
(還有一種類似的方法可用,即將此類模塊標記為非關聯,并對其進行綜合)
1.從已完全布線的設計中識別具有嚴重時序違例的模塊
要直觀顯示可能存在時序收斂問題的模塊,有效方法之一是打開已布線的設計檢查點并生成一份列表,其中包含前 500-1000 個時序收斂失敗的端點。
report_timing -of [get_timing_paths -max_paths 1000 -slack_lesser_than 0] -file route_paths.rpt -rpx route_paths.rpx -name route_paths
最好使用 Vivado 中的“層級 (Hierarchy)”窗口來直觀顯示這些路徑,只需點擊 F6 功能鍵即可輕松喚起此窗口。
由于時序路徑在 Vivado 中屬于對象,因此可在“時序 (Timing)”窗口中將其選中,這樣即可在“Hierarchy”視圖中高亮顯示對應的單元/信號線。 高亮顯示的模塊中包含的時序違例最多。
這些模塊最適合使用此方法來進行分析。
2. 提取目標模塊
可使用 Tcl 命令 write_checkpoint 從已布線的設計檢查點中提取目標模塊。 檢查點將包含布局布線信息以及限定于目標模塊層級下的模塊范圍內的所有時序斷言和時序例外(包括多周期路徑、偽路徑等)。
先取消 target_module.dcp 的布局布線,隨后,即可對其進行非關聯布局布線。
write_checkpoint -quiet -force -cell [get_cells $target_module] target_module.dcp
?
從已布線的檢查點提取目標模塊
3. 創建簡單的布局規劃
為避免布局器將目標模塊散布于整個裸片上,最好創建 1 個 Pblock 以生成該模塊在完整設計上的布局方式的鏡像。
以下是 floorplan.tcl 文件的示例。
# 移除現有 Pblock if {[llength [get_pblocks]]} { delete_pblocks [get_pblocks *] } # 創建 Pblock 以生成完整設計中的目標模塊布局的鏡像 create_pblock target_top resize_pblock target_top -add CLOCKREGION_X0Y3:CLOCKREGION_X2Y4 add_cells_to_pblock target_top -top
?
目標模塊布局規劃
4. 創建一組簡單的時序約束
此步驟將基于連接到模塊的頂層時鐘來創建一組時鐘約束。 在目標檢查點中將保留范圍限定于目標模塊中所含模塊的時序例外。 為便于操作,最好將所有時鐘強制設置為異步。 以下提供的腳本用于:
創建時鐘
創建時鐘間的時序例外
創建 HD.CLK_SRC 屬性以便工具更準確計算時鐘偏差
在每個時鐘上添加 250 ps 的建立時間不確定性,以提高分析的真實性
要創建約束,請在 Vivado GUI 中選中模塊并運行腳本以創建名為 constraints.tcl 的文件,此文件將用于驅動模塊的非關聯實現。
set CONSTRAINT_FILE [open constraints.tcl w] set index 0 foreach pin [get_pins -filter {DIRECTION == IN} -of [get_selected_objects]] { if {[llength [set clock [get_clocks -quiet -of $pin]]] != 0} { set clk_name [get_property REF_PIN_NAME $pin] puts $CONSTRAINT_FILE "create_clock -quiet -name $clk_name -period [get_property PERIOD $clock] \[get_ports $clk_name\]" puts $CONSTRAINT_FILE "set_clock_groups -quiet -async -group \[get_clocks $clk_name\ -include_generated_clocks]" puts $CONSTRAINT_FILE "set_property -quiet HD.CLK_SRC BUFGCTRL_X0Y${index} \[get_ports $clk_name\]" incr index } } puts $CONSTRAINT_FILE "set_clock_uncertainty -quiet 0.250 -setup \[get_clocks\]" close $CONSTRAINT_FILE
生成的 constraints.tcl 文件如下所示:
create_clock -quiet -name clk_out1 -period 20.001 [get_ports clk_out1] set_clock_groups -quiet -async -group [get_clocks clk_out1 -include_generated_clocks] set_property -quiet HD.CLK_SRC BUFGCTRL_X0Y0 [get_ports clk_out1] create_clock -quiet -name clk_out4 -period 3.334 [get_ports clk_out4] set_clock_groups -quiet -async -group [get_clocks clk_out4 -include_generated_clocks] set_property -quiet HD.CLK_SRC BUFGCTRL_X0Y1 [get_ports clk_out4] create_clock -quiet -name clk_p -period 1.389 [get_ports clk_p] set_clock_groups -quiet -async -group [get_clocks clk_p -include_generated_clocks] set_property -quiet HD.CLK_SRC BUFGCTRL_X0Y2 [get_ports clk_p] create_clock -quiet -name dphy_clk_200M -period 5.000 [get_ports clk_200M] set_clock_groups -quiet -async -group [get_clocks clk_200M -include_generated_clocks] set_property -quiet HD.CLK_SRC BUFGCTRL_X0Y3 [get_ports clk_200M] set_clock_uncertainty -quiet 0.250 -setup [get_clocks]
時鐘交互報告會顯示時鐘內路徑的時序安全,而時鐘間的時序路徑將被忽略。 這正是此分析方法的目標,因為目標模塊中大部分時序路徑都屬于時鐘內部路徑。
時鐘交互報告
5. 以非關聯方式實現目標模塊
使用以下腳本構建非關聯目標模塊:
open_checkpoint target_module.dcp source constraints.tcl source floorplan.tcl route_design -unroute place_design -unplace place_design write_checkpoint -force place.dcp report_utilization -file util.rpt report_timing_summary -file placed_tim.rpt report_design_analysis -timing -logic_level_distribution -of_timing_paths [get_timing_paths -max_paths 10000 -slack_lesser_than 0] -file place_vios.rpt report_timing -of [get_timing_paths -max_paths 1000 -slack_lesser_than 0] -file place_paths.rpt -rpx place_paths.rpx route_design write_checkpoint -force route.dcp report_timing_summary -file route_tim.rpt report_design_analysis -timing -logic_level_distribution -of_timing_paths [get_timing_paths -max_paths 10000 -slack_lesser_than 0] -file route_vios.rpt report_timing -of [get_timing_paths -max_paths 1000 -slack_lesser_than 0] -file route_paths.rpt -rpx route_paths.rpx report_qor_suggestions -file route_rqs.rpt write_qor_suggestions -force -tcl_output_dir route_wqs route_wqs.rpt
?
實現的目標模塊
6. 分析并調整
完成實現運行后,即可分析時序、調整時序約束、實施布局規劃并快速重復此流程,以判定模塊是否能夠獨立達成時序收斂,然后在設計其余部分中以關聯方式來實現模塊。
通過使用此方法,設計師即可快速識別并解決時序瓶頸,從而縮短完整設計的時序收斂任務所需的時間。
審核編輯:湯梓紅
評論
查看更多