每日學習:深度好文 | 一個考慮了Scan、Boundary Scan、分頻時鐘、門控時鐘的CTS的分析設計示例(含腳本)

2021-02-23 大同學吧

關注並標星大同學吧

每天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。

相關焦點

  • 數字設計中的時鐘與約束
    記得我剛剛學習FPGA的時候,在verilog代碼中,經常使用內部產生的時鐘,也就是用內部的一個信號充當另外一個always塊的時鐘沿敏感列表,如下圖所示:       對於系統要求非常嚴格的,比如時鐘切換很頻繁,有不能夠在復位的時候切換,而且也不允許有短暫的錯誤,那麼時鐘就不能這樣子進行切換了,就要使用其他的時鐘切換方案或者進行時鐘同步了。至於多時鐘切換的方案,以後有時間再學習補充。 門控時鐘可是低功耗設計的寵兒,關於門控時鐘的資料也有一大堆,下面就來寫寫門控時鐘吧。
  • 每日學習:多時鐘域的設計和綜合技巧(一)
    作者稱謂:wonder個人介紹:前瞻性的眼光,和持之以恆的學習微信公眾號:數字晶片實驗室純粹的單時鐘同步設計是一種奢望。大部分的ASIC設計都由多個異步時鐘驅動,並且對數據信號和控制信號都需要特殊的處理,以確保設計的魯棒性。大多數學校的課程任務都是完全同步(單時鐘)的邏輯。
  • 一文搞定時鐘相關的概念(時鐘頻率、波特率、分頻因子、預分頻因子、倍頻)
    時鐘分為內部時鐘和外部時鐘,即提供時鐘的源是片上還是片外的問題。     晶振即為外部時鐘,晶片可以做內部時鐘,但一般不如內部時鐘穩定可靠。     時鐘振蕩的快慢頻次即為此時鐘的時鐘頻率,它就相當類似人的心臟,是一種計時基準,有了此基準,通過分頻等方式就可適配不同的外設。
  • FPGA設計小技巧(時鐘/性能/編程)
    只用一個時鐘沿來寄存數據,使用時鐘的兩個沿是不可靠的,如果時鐘沿「漂移」,就會導致時序錯誤。 不要隨意將內部信號作為時鐘,如門控時鐘和分頻時鐘,而要使用CLKDLL或者DCM產生的時鐘,或者可以通過建立時鐘使能或者DCM產生不同的時鐘信號。
  • 時鐘晶體振蕩器作用是什麼 時鐘晶體振蕩器種類
    晶振產生振蕩必須附加外部時鐘電路,一般是一個放大反饋電路,只有一片晶振是不能實現震蕩的。 於是就有了時鐘振蕩器,將外部時鐘電路跟晶振放在同一個封裝裡面,一般都有4個引腳了,兩條電源線為裡面的時鐘電路提供電源,又叫做有源晶振,時鐘振蕩器,或簡稱鍾振。好多鍾振一般還要做一些溫度補償電路在裡面,讓振蕩頻率能更加準確。
  • STM32的時鐘學習
    本文引用地址:http://www.eepw.com.cn/article/201611/321595.htmSTM32中有一個全速功能的USB模塊,其串行接口引擎需要一個頻率為48MHz的時鐘源。該時鐘源只能從PLL輸出端獲取,可以選擇為1.5分頻或者1分頻,也就是,當需要使用USB模塊時,PLL必須使能,並且時鐘頻率配置為8MHz或72MHz。
  • 採用FPGA設計SDH設備時鐘
    當參考源切換時,通過濾波器的平滑設計,保證了頻率控制字緩慢變化,可靠地實現了參考源的平滑切換。數控時鐘產生器模塊由高頻時鐘在頻率控制字的作用下進行受控分頻得到。為了減小數控時鐘產生器輸出時鐘在受控分頻過程中產生的數字相位噪聲,TSP8500晶片設計時採用了獨特的「微小相位調整技術」,使數控時鐘產生器輸出時鐘的Cycle-Cycle抖動僅0.4ns。  SEC一般都採用主備備份設計。
  • 時鐘設備如何滿足複雜系統的高性能時序需求?
    • DIV_R(DIV_R1 和 DIV_R2)是輸入頻率參考的分頻因子。此類分頻器名為預分頻器。• DIV_N 為小數 N 分頻因子。• DIV_O(DIV-O1、DIV-O2、DIV-O3 和 DIV-O4)為輸出前的後分頻因子。
  • 一文看懂rtc實時時鐘和單片機時鐘的區別
    打開APP 一文看懂rtc實時時鐘和單片機時鐘的區別 發表於 2018-05-14 15:48:10 在個人計算機上這些部份被分成若干塊晶片,安裝一個稱之為主板的印刷線路板上。   rtc實時時鐘如DS1302是一個單獨的時鐘晶片,和單片機連接後,可以設置時間和鬧鈴時間,並讀取時間進行顯示,普通單片機要做時鐘需要佔用其較多資源,並且斷電後沒法保持。
  • 每日學習:IR-drop的分析與修復(含腳本分享)(一):Partition boundary cells clustering
    設計的美微信公眾號:集成電路設計及EDA教程沒有在最想做的時候去做的事情,都是人生的遺憾。《IR-drop問題的分析與修復(含腳本分享)(一):Partition boundary cells clustering-> Add Inst Padding》最近有粉絲留言IR-drop的分析與修復技巧,這裡先分享其中一種Case的分析解決技巧
  • 每日學習:靜態時序分析入門面面觀
    靜態時序分析工具很好地解決了這兩個問題。它不需要激勵向量,可以報出晶片中所有的時序違例,並且速度很快。STA在設計中的位置如下(不止一個環節哦)。4.5考慮時鐘路徑悲觀移除的OCV模式考慮時鐘路徑悲觀移除(CPPR)的OCV模式。可以分為不考慮時序減免和考慮時序減免情況。4.6 PT guide中關於三種模式的描述建立時間分析如圖37所示。保持時間如圖38所示。
  • msp430系統時鐘詳解
    SP430 系列單片機基礎時鐘主要是由低頻晶體振蕩器,高頻晶體振蕩器,數字控振蕩器(DCO),鎖頻環(FLL)及 FLL+等模塊構成。由於 430 系列單片機中的型號不同而時鐘模塊也將有所不同。雖然不同型號的單片機的時基模塊有所不同,但這些模塊生出來的結果是相同的。
  • 可提高實時時鐘長期計時準確度時鐘程序算法
    摘 要: 通過對引起實時時鐘計時誤差因數的分析,給出了一種提高實時時鐘長期計時準確度的實用而有效的軟體方法。時鐘源的頻率通常為幾十kHz乃至幾十MHz,而常用時鐘的最小計時單位一般在0.01s~1s。高頻的時鐘源脈衝通過分頻器後產生基本定時脈衝。電子計時器的計時部分就是對基本定時脈衝進行累加,產生秒、分、時等時間信息乃至日、月、年等日期信息。
  • 基於lpc1768的系統時鐘設計
    基於lpc1768的系統時鐘設計 工程師周亮 發表於 2018-11-15 16:11:12 #define XTAL_FREQ 12000000 #define VECT_TAB_OFFSET
  • 基於單片機旋轉時鐘的設計
    時鐘晶振電路使用12MHz的晶振,給單片機提供時鐘信號。STC12C5A60S2晶片的31腳(/EA端)接高電平,使其從內部的程序存儲器讀取指令,為了防止31腳意外輸出低電平而將單片機燒壞,需要在31腳外接一個10K的電阻。3.2 無線供電模塊分析與設計無線供電模塊由發送模塊和接收模塊組成。
  • MSP430F449單片機RTC時鐘C語言程序(帶鬧鐘)
    //初始化時鐘voidkey_scan(void);//時鐘初始化>while(1){key_scan//250ms16分頻
  • implicit nonstop pins,工具幫你定義的時鐘需求
    ),然後工具可以自動trace所有其扇出的clock sinks 如果一個時鐘具有generated clock,工具可以從generated clock trace到相應的master clock ,當然這是在正確定義generated clock的情況下
  • 奇數分頻的Verilog實現
    所以在Verilog實現中主要考慮兩點:1)   實現一個模N計數器2)   在模N計數器計滿時,將輸出時鐘翻轉根據上面的兩點,寫出Verilog代碼always@(posedge clk or negedge rst_n)            // 實現模N計數器begin if(rst_n) count<=0;
  • STM32通用定時器(時鐘選擇,模式選擇)
    也就是選擇CK_INT做時鐘,這個簡單,但是有一點要注意,定時器的時鐘不是直接來自APB1或APB2,而是來自於輸入為APB1或APB2的一個倍頻器,當APB1的預分頻係數為1時,這個倍頻器不起作用,定時器的時鐘頻率等於APB1的頻率;當APB1的預分頻係數為其它數值(即預分頻係數為2、4、8或16)時,這個倍頻器起作用,定時器的時鐘頻率等於APB1的頻率兩倍。
  • 時間管理的小工具——「番茄時鐘工作法」
    接下來,結合我自身使用這一方法的體會,向大家介紹「番茄時鐘工作法」的具體操作步驟:通常情況下,我會準備一個計時器,由於電子工具的普及,這個計時器可以是手機、平板電腦、手環等電子產品,原則是使用起來感覺舒服。一份《番茄時鐘每日記錄表》(具體式樣請參見下表)和一支用於記錄的筆。