點論 | 組合邏輯環 Combinational loop 知多少

  • 2020 年 1 月 13 日
  • 筆記

新年第一盤乾貨走起,本文涵蓋如下內容:

  • 什麼是Combinational loop?
  • 常見的Combinational loop 有哪些?
  • Genus 如何處理Combinational loop?
  • LEC 如何處理Combinational loop?
  • Innovus/Tempus 如何處理Combinational loop?

什麼是Combinational loop


在數字集成電路中有許多許多的專有名詞,特別難用一個漢語詞或一段漢語句子清晰表述,有時候直接引用英文並不是為了裝逼也不是偷懶,只是為了不曲解。對Combinational loop 的定義:

  • Combinational loop: A combinational feedback loop is a path that can be traced through combinational logic – back to the starting point.
  • 組合邏輯環:起始於某個組合邏輯單元經過一串組合邏輯又回到起始組合邏輯單元的邏輯環路,稱為組合邏輯環。

常見的Combinational loop


跟Latch 一樣,Combinational loop 如果不是用於特別用途,通常是不應該出現在代碼中的,所有不預期的Combination loop 都要當做bug 處理,需清除,除此之外常見的Combinational loop 有:

  • 偽隨機數生成器,由奇數個反相器組成的迴環;
  • DFT Bypass 邏輯,在DFT 模式有組合邏輯環;

Genus 如何處理Combinational loop


默認,綜合工具都會對RTL 代碼做QA 檢查,當發現代碼里有不期望的東西存在時就會報警,比如遇到Latch 會報警,遇到位寬不一致會報警,遇到未定義的module 會報警,遇到Combinational loop 同樣會報警,在Genus 中,如果RTL 中有Combinational loop 工具會在elaborate 的時候報TIM-20 的警告:

本質上,Combinational loop 是timing 問題,會導致某些path 分析不到,所以不論是綜合跟P&R 還是STA 都需要把Combination loop 打斷。通常有以下兩種方式來處理Combination loop:

  • 交給工具處理,需要額外的分析時間,而且不一定可以得到期望的『斷點』。
  • 用戶通過命令設置,老驢推薦這種方式,如果Combination loop 不是設計意圖,請及早修掉,如果是設計意圖,請在期望的點上用對應命令將其打斷。

Genus 命令 check_timing_intent 檢查SDC QA 時,會檢查代碼中的Combination loop. 如果代碼中有Combination loop 且SDC 中沒有對應的命令 "set_disable_timing" 將其打斷,則:

  • 如果在syn_gen 之前執行report_timing , 那工具會自動插入 cdn_loop_breaker;
  • 如果在syn_gen 之前未執行report_timing, 那工具會在syn_gen 過程中插入cdn_loop_breaker.

所謂的cdn_loop_breaker 是工具從庫中選擇的一個buffer, 並且disable 了對應cell input pin 到output pin 的timing arc.

處理起來看似很簡單,但是如果電路本身比較複雜,讓工具自己分析去打斷Combinational loop 有時候是不經濟的有時候是不科學的有時候是不可行的,如下一個簡單的電路:

  • 有多個點可以插入loop breaker 將loop 打斷,但是哪種選擇是Designer 期望的?是所謂『經濟』的?對於工具而言沒有足夠的輸入信息無法做出經濟的抉擇;
  • 在任何一個點插入loop breaker 將loop 打斷都會導致某條真正的timing path 斷掉,哪條path 是可以被拋棄的『子兒』,如何選擇才合理公平科學?
  • 對於更複雜的電路,工具分析了許久,就是找不到可以插入的點,於是工具會像個傻子一樣在原地愛的魔力轉圈圈。

忠告:不論電路複雜簡單,所有意圖之內的Combinational loop 請用set_disable_timing 打斷,所有意圖之外的Combinational loop 請修掉。

LEC 如何處理Combinational loop


Combinational loop 在LEC 中是不允許存在的,LEC 會在modling 的時候插入CUTPOINT 打斷Combinational loop, CUTPOINT 屬於keypoints. LEC 插入CUTPOINT 的過程:

  • LEC 在modling 時插入CUTPOINT;
  • LEC 先對Golden 進行處理,並將插入CUTPOINT 的pin/net 記住;
  • LEC 首先根據記錄的信息在Revised 中尋找對應點插入CUTPOINT;
  • 如果根據記錄的對應點處理之後,還有額外的Combinational loop, LEC 會用內嵌算法進一步插入CUTPOINT

可以通過如下命令來report modeling 的具體過程:

report message -modeling –verbose

通常,如果Golden 跟Revised 有相同或極類似的Combinational loop, 工具可以會找到對應的位置插入CUTPOIN, 那麼都不會有什麼問題。但真實case 總會有一些特別情況,如優化之後Revised 中Combinational loop pin/net 的名字完全改變,數量也有變化;如Combinational loop 跨了邏輯層;對於這些複雜情況,首先需要依靠工具內嵌算法去做分析,如可以加一些modeling 選項,打開某些更複雜的算法去分析:

set flatten model -cut_remove_redundant

set flatten model -cut_place_algo 1

也可以讓工具給出更多信息:

set flatten model -cut_show_net

也可以讓工具進一步分析cut point, 如果設置了set_analyze_option -auto, LEC 會自動分析cut point, 對於複雜設計這一步可能需要較長時間:

analyze setup -cut

經過如上分析之後,如果還有由CUTPOIN 引起的不等,則需要進一步分析處理,可以用如下命令分別報出工具已經插入的CUTPOIN, 設計中所有的Combinational loop 及其在代碼中對應的位置:

report gate -type cut

REPort PAth -feedback

report path -feedback -source

忠告:不論電路複雜簡單,所有意圖之內的Combinational loop 請用add cut point 打斷,所有意圖之外的Combinational loop 請修掉,否則不僅可能導致LEC 不等,還可能導致runtime 過長。

  • 可用set flatten model -nocycle_cut 不讓工具加cut point.
  • 可用set analyze option -nocut 不讓工具分析cut point.
  • 可參考如下腳本自己加cut point.

Innovus/Tempus 如何處理Combinational loop?


默認,Innovus 跟Tempus 見到Combinational loop 同樣會報警會,並且自動將其打斷。

CTE_loops.rpt 中有如下信息:

可用check_timing 報出設計中所有的Combinational loop:

如上所述,工具自動打斷Combinational loop 有可能將其它需要check 的timing path 也打斷,在Innovus 跟Tempus 中可以設置如下變量,使能工具更先進的算法,在打斷Combinational loop 的時候盡量不打斷需要check 的timing path.

timing_dynamic_loop_breaking

忠告:不論電路複雜簡單,所有意圖之內的Combinational loop 請用set_disable_timing 打斷,所有意圖之外的Combinational loop 請修掉.

寫在最後,Combinational loop 是常規設計必須要規避的電路結構,如果不得不有,若交給工具,因為每個工具的算法不同,得到的結果會有差異,所以最好由硅農用命令設掉。Combinational loop 除對綜合,形式驗證,布局布線,靜態時序分析有影響之外,對DFT 同樣有影響,此處引用一段原話:

Feedbacks may cause oscillations, races or memory-like behavior in logic, which complicates the test generation process, this may cause:

  • Long ATPG runtime
  • Long or hanging gate-level simulations (indication of an oscillating loop)
  • Failing gate-level simulations

驢說IC