本文來自 XILINX 產(chǎn)品應(yīng)用工程師 John Bieker
本文旨在提供一種方法,以幫助設(shè)計(jì)師判斷給定模塊是否能夠在空裸片上達(dá)成時(shí)序收斂。 如果目標(biāo)模塊無法在空裸片上達(dá)成非關(guān)聯(lián) (OOC) 時(shí)序收斂,則恐難以與設(shè)計(jì)其余部分達(dá)成關(guān)聯(lián)性時(shí)序收斂。設(shè)計(jì)師可從完整設(shè)計(jì)中提取目標(biāo)模塊、對(duì)其進(jìn)行布局規(guī)劃、約束,然后通過實(shí)現(xiàn)工具來運(yùn)行這些模塊,以判斷是否能夠獨(dú)立達(dá)成時(shí)序收斂。
隨著設(shè)計(jì)復(fù)雜性和規(guī)模的持續(xù)增加,以可重復(fù)且可靠方式達(dá)成時(shí)序收斂的難度也變得越來越高。 完全完成大型設(shè)計(jì)的布局布線所需運(yùn)行時(shí)間冗長,導(dǎo)致難以應(yīng)對(duì)期間種種狀況,但對(duì)完全完成組裝的設(shè)計(jì)進(jìn)行時(shí)序分析時(shí),設(shè)計(jì)師一般會(huì)發(fā)現(xiàn)發(fā)生的大部分時(shí)序違例都集中于少數(shù)幾個(gè)關(guān)鍵模塊。
在此情況下,如下方法很有效:可通過執(zhí)行可行性分析來查看存在大量違例的模塊本身在非關(guān)聯(lián)實(shí)現(xiàn)情況下能否達(dá)成時(shí)序收斂。此分析的目的是降低完全布局布線任務(wù)的復(fù)雜性,以便幫助設(shè)計(jì)師加速迭代,從而更快找到潛在解決方案。
在本文中,我們將講解一種常見用例,即從已布線的設(shè)計(jì)中提取出一個(gè)分層塊(目標(biāo)模塊)進(jìn)行非關(guān)聯(lián)實(shí)現(xiàn)。
(還有一種類似的方法可用,即將此類模塊標(biāo)記為非關(guān)聯(lián),并對(duì)其進(jìn)行綜合)
1.從已完全布線的設(shè)計(jì)中識(shí)別具有嚴(yán)重時(shí)序違例的模塊
要直觀顯示可能存在時(shí)序收斂問題的模塊,有效方法之一是打開已布線的設(shè)計(jì)檢查點(diǎn)并生成一份列表,其中包含前 500-1000 個(gè)時(shí)序收斂失敗的端點(diǎn)。
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 中的“層級(jí) (Hierarchy)”窗口來直觀顯示這些路徑,只需點(diǎn)擊 F6 功能鍵即可輕松喚起此窗口。
由于時(shí)序路徑在 Vivado 中屬于對(duì)象,因此可在“時(shí)序 (Timing)”窗口中將其選中,這樣即可在“Hierarchy”視圖中高亮顯示對(duì)應(yīng)的單元/信號(hào)線。 高亮顯示的模塊中包含的時(shí)序違例最多。
這些模塊最適合使用此方法來進(jìn)行分析。
2. 提取目標(biāo)模塊
可使用 Tcl 命令 write_checkpoint 從已布線的設(shè)計(jì)檢查點(diǎn)中提取目標(biāo)模塊。 檢查點(diǎn)將包含布局布線信息以及限定于目標(biāo)模塊層級(jí)下的模塊范圍內(nèi)的所有時(shí)序斷言和時(shí)序例外(包括多周期路徑、偽路徑等)。
先取消 target_module.dcp 的布局布線,隨后,即可對(duì)其進(jìn)行非關(guān)聯(lián)布局布線。
write_checkpoint -quiet -force -cell [get_cells $target_module] target_module.dcp
?
從已布線的檢查點(diǎn)提取目標(biāo)模塊
3. 創(chuàng)建簡(jiǎn)單的布局規(guī)劃
為避免布局器將目標(biāo)模塊散布于整個(gè)裸片上,最好創(chuàng)建 1 個(gè) Pblock 以生成該模塊在完整設(shè)計(jì)上的布局方式的鏡像。
以下是 floorplan.tcl 文件的示例。
# 移除現(xiàn)有 Pblock if {[llength [get_pblocks]]} { delete_pblocks [get_pblocks *] } # 創(chuàng)建 Pblock 以生成完整設(shè)計(jì)中的目標(biāo)模塊布局的鏡像 create_pblock target_top resize_pblock target_top -add CLOCKREGION_X0Y3:CLOCKREGION_X2Y4 add_cells_to_pblock target_top -top
?
目標(biāo)模塊布局規(guī)劃
4. 創(chuàng)建一組簡(jiǎn)單的時(shí)序約束
此步驟將基于連接到模塊的頂層時(shí)鐘來創(chuàng)建一組時(shí)鐘約束。 在目標(biāo)檢查點(diǎn)中將保留范圍限定于目標(biāo)模塊中所含模塊的時(shí)序例外。 為便于操作,最好將所有時(shí)鐘強(qiáng)制設(shè)置為異步。 以下提供的腳本用于:
創(chuàng)建時(shí)鐘
創(chuàng)建時(shí)鐘間的時(shí)序例外
創(chuàng)建 HD.CLK_SRC 屬性以便工具更準(zhǔn)確計(jì)算時(shí)鐘偏差
在每個(gè)時(shí)鐘上添加 250 ps 的建立時(shí)間不確定性,以提高分析的真實(shí)性
要?jiǎng)?chuàng)建約束,請(qǐng)?jiān)?Vivado GUI 中選中模塊并運(yùn)行腳本以創(chuàng)建名為 constraints.tcl 的文件,此文件將用于驅(qū)動(dòng)模塊的非關(guān)聯(lián)實(shí)現(xiàn)。
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]
時(shí)鐘交互報(bào)告會(huì)顯示時(shí)鐘內(nèi)路徑的時(shí)序安全,而時(shí)鐘間的時(shí)序路徑將被忽略。 這正是此分析方法的目標(biāo),因?yàn)槟繕?biāo)模塊中大部分時(shí)序路徑都屬于時(shí)鐘內(nèi)部路徑。
時(shí)鐘交互報(bào)告
5. 以非關(guān)聯(lián)方式實(shí)現(xiàn)目標(biāo)模塊
使用以下腳本構(gòu)建非關(guān)聯(lián)目標(biāo)模塊:
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
?
實(shí)現(xiàn)的目標(biāo)模塊
6. 分析并調(diào)整
完成實(shí)現(xiàn)運(yùn)行后,即可分析時(shí)序、調(diào)整時(shí)序約束、實(shí)施布局規(guī)劃并快速重復(fù)此流程,以判定模塊是否能夠獨(dú)立達(dá)成時(shí)序收斂,然后在設(shè)計(jì)其余部分中以關(guān)聯(lián)方式來實(shí)現(xiàn)模塊。
通過使用此方法,設(shè)計(jì)師即可快速識(shí)別并解決時(shí)序瓶頸,從而縮短完整設(shè)計(jì)的時(shí)序收斂任務(wù)所需的時(shí)間。
審核編輯:湯梓紅
評(píng)論
查看更多