關注並標星大同學吧
每天1次,打卡學習
積累1個新知識,增1分職場底氣
作者稱謂:Horizon
個人介紹: 愛生活愛分享,更愛探索IC設計的美
微信公眾號:集成電路設計及EDA教程
在研究生階段學習了一些DFT的東西,在自己的設計中做了DFT:Scan、Boundary Scan,由於當時沒有安裝Tessent,工藝比較新,不支持以前的mbistarchitecture,因此沒法做mbist;設計中有一個主時鐘它的2分頻時鐘,此外還有DFT的時鐘;在提高Coverage和做CTS階段遇到了很多問題,在此分享一些CTS的解決思路。主要是最近比較忙,所以把自己封印已久的筆記拿出來曬一曬,還有好多腳本分享喲。
時鐘網絡中含有2分頻網絡,並需要做DFT scan chain,Skew有何特殊,該如何處理Skew呢?
如果採用一般的策略,先做Function scenarios裡面做Function的clock tree,然後激活Scan scenarios,做scan chain的clock tree。那麼會得到下面的結果:
從圖中可以非常清晰的看出,insertion delay小的都是集中在fclk時鐘域的CK pin,而insertion delay非常大的則集中在:
可以看到是clk2二分頻時鐘域的。因此貌似這兩個時鐘域沒有進行balance。
正常情況下,在沒有做scan的CTS時,在function下報告一下時鐘skew:
由於在function的scenario裡面設置了如下的balance,所以兩個時鐘域是已經balance的,所以得到了如上圖所示的結果。可是,由於又做了scan chain的CTS,所以使得上面兩個時鐘域的時鐘樹發生了變化。
>set_inter_clock_delay_options-balance_group 「fclk clk2」
>report_inter_clock_delay_options#報告進行balance的clock group
>clock_opt -only_cts-no_clock_route -inter_clock_balance
正確的策略應該是先function做CTS,然後將它們的clock tree設置為dont_touch,然後去opt scan chain相關的clock tree。
#激活function scenarios,並關閉scan相關scenario的cts_mode
set_scenario_options -scenarios [get_scenarios FUNCTION*]
-cts_mode true -cts_corner max
set_scenario_options -scenarios
[lminus [all_scenarios] [get_scenarios FUNCTION*]]
-cts_modefalse -cts_corner none
report_scenario_options -scenarios [all_scenarios]
set clock_opt_cts_cmd"clock_opt -only_cts -no_clock_route"
if {!$DFT &&[get_scan_chain] == 0} {lappend clock_opt_cts_cmd -continue_on_missing_scandef}
if {$ICC_CTS_INTERCLOCK_BALANCING&& [file exists [which $ICC_CTS_INTERCLOCK_BALANCING_OPTIONS_FILE]]}{lappend clock_opt_cts_cmd -inter_clock_balance}
if {$ICC_CTS_UPDATE_LATENCY}{lappend clock_opt_cts_cmd -update_clock_latency}
if {$ICC_CTS_SELF_GATING}{lappend clock_opt_cts_cmd -insert_self_gating}
echo $clock_opt_cts_cmd
eval $clock_opt_cts_cmd
optimize_clock_tree -clock_trees{fclk tck clk2}
-search_repair_loop8
-operating_conditionmax
-routed_clock_stageNone
#設置function的clock tree為dont_touch
嘗試1::設置set_clock_tree_exceptions -dont_touch_subtrees
[get_pins {fclk_block/Ctck_block/C}]發現完全不管用,clk2的insertion delay還是變大了很多,說明clk2還是會被touch
-dont_touch_subtrees dont_touch_pin_collection
Specifies a collection of inputpins that the set_clock_tree_exceptions command is to set asdont_touch_subtree pins.
嘗試2:之前可能在dont_touch_subtrees裡面忘記把分頻時鐘寄存器的Q寫進去了,導致clk2的時鐘樹被改動了。所以進行如下設置:
set_clock_tree_exceptions-dont_touch_subtrees
[get_pins{fclk_block/C */clk2_reg/Q tck_block/C}]
發現仍然不管用,clk2還是會被touch
嘗試3:能在版圖中看到每條net的名字,屬於哪個時鐘域,上面都會給它打上相關時鐘的標籤,或者選擇一個cell右鍵找到property-net name也可以看到:
所以可以嘗試將這些nets設置為dont_buffer:
set_clock_tree_exceptions-dont_buffer_nets
[get_nets{*fclk* */clk2* *tck*}]
#然後激活scan相關scenarios,關閉function cts_mode:
set_scenario_options -scenarios[get_scenarios SCAN*]
-cts_mode true
-cts_corner max
set_scenario_options -scenarios
[lminus [all_scenarios] [get_scenarios SCAN*]]
-cts_modefalse -cts_corner none
report_scenario_options -scenarios [all_scenarios]
current_scenario SCAN_WCL_CW
clock_opt -only_cts-no_clock_route
optimize_clock_tree -clock_trees{tclk}
-search_repair_loop8
-operating_conditionmax
-routed_clock_stageNone
report_clock_tree -summary-scenarios [all_scenarios]
發現有一定效果,可是某些clock經過ICG之後時鐘名字就發生了改變,不再是{*fclk* */clk2**tck*}了,所以他們還是發生了改動:
嘗試:
set_scenario_options -scenarios
[get_scenarios FUNCTION*]
-cts_mode true
-cts_corner max
set_scenario_options -scenarios
[lminus [all_scenarios] [get_scenarios FUNCTION*]]
-cts_mode false
-cts_cornernone
report_scenario_options -scenarios [all_scenarios]
set clock_opt_cts_cmd "clock_opt -only_cts -no_clock_route"
if{$ICC_CTS_INTERCLOCK_BALANCING && [file exists [which $ICC_CTS_INTERCLOCK_BALANCING_OPTIONS_FILE]]} {lappend clock_opt_cts_cmd -inter_clock_balance}
if {$ICC_CTS_UPDATE_LATENCY} {lappend clock_opt_cts_cmd -update_clock_latency}
if {$ICC_CTS_SELF_GATING} {lappend clock_opt_cts_cmd -insert_self_gating}
echo $clock_opt_cts_cmd
eval $clock_opt_cts_cmd
optimize_clock_tree -clock_trees{fclk tck clk2}
-search_repair_loop20
-operating_conditionmax
-routed_clock_stageNone
report_clock_tree -summary-scenarios [all_scenarios]
結果:
set_clock_tree_exceptions -dont_touch_subtrees
[get_pins {mimo_inst/U262/Z */clk2_reg/Q tck_block/C}]
current_scenario FUNCTION_WCL_CW
report_clock_tree-clock_trees fclk
用下面的命令再試試:
set_clock_tree_exceptions -dont_touch_subtrees
[get_pins {mimo_inst/U262/Z */clk2_reg/Q mimo_inst/U261/Ztck_block/C}]
實現後生成的報告如下:
在SCAN下看insertion delay的分布圖:
可見,該方法是有效的。時鐘經過MUX之後,應該就斷掉了,必須在MUX之後也設置dont_touch_subtrees才能保證不被觸碰。
雖然在MCMM腳本中為MUX定義了set_case_analysis,但是dont_touch卻並沒有通過MUX往下傳遞,原因應該是sdc中定義了:
set_ideal_network -no_propagate [get_ports fclk_pad]
set_ideal_network -no_propagate [get_ports tck_pad]
因此dont_touch屬性並不會往下傳遞。
總結:經過嘗試之後最終採用的方法是,先激活Function的scenarios,做Function的clocktree。然後,將前面的function的tree全部設置為dont_dont_subtree,這裡需要注意的是他們在經過MUX之後dont_touch屬性便中斷了,因此在MUX之後也需要進行設置dont_touch_subtree。然後只激活跟scan相關的scenarios,用opt的方式來添加scan相關的clock tree。而Boundary scan相關的tree可以直接和Function相合併。
還有一個需要注意的是,由於進行了分頻,二分頻的那個寄存器的clk端在Function mode下是non-stoppin,而在Scan mode下卻是stoppin/sync pin,這是矛盾的。如果也將它包含在時鐘樹中,那麼在它這裡會有很大的skew。有工程師說,它可以直接從掃描鏈裡面剔除掉。上面我沒有採用這種方法,我也將它串入了掃描鏈,在CTS之後用CCD來修復相關的時序問題。
大同學吧,是全國100+重點高校IT電子類等理工科大學生都在關注的校招、內推、實習的求職服務平臺,提供海量網際網路及半導體行業實習、校招等招聘信息,免費分享面經筆經、求職內推、行業乾貨,助力學子順利拿下理想offer!!我們歡迎任何形式的合作,發布招聘信息,請添加微信號:lgsdt188。