時鐘樹合成(CTS)
想像一座花園,裡面每一棵植物都必須在同一瞬間被澆到水。如果你只接一根水管通到最近的植物,再讓水順勢往遠處的角落慢慢流,那麼近處的植物先喝到水,遠處的就要等很久。於是你換一種做法:搭一套不斷分叉、每一段管長都相等的供水歧管,一次次地一分為二,讓水幾乎在同一時刻到達每一個噴頭。時鐘樹合成(CTS)對時鐘訊號做的就是這件事。佈局把每個單元放在哪裡固定下來之後,時鐘在源頭仍然只是一根網路(net),若放任不管,它會極不均勻地扇出到成千上萬乃至上百萬個正反器。CTS 把這根樸素的網路拆掉,重新建構成一棵由時鐘緩衝器和反相器組成的平衡樹,對它們做尺寸選擇並擺放到合適位置,使有效時鐘邊緣幾乎同時落到每一個正反器的時鐘接腳上。一種常見的結構是 H 樹(H-tree),導線真的按一層套一層的 H 形狀分叉,讓每一片葉子到樹根的距離都相等。
有兩個數字用來衡量這棵樹平衡得好不好。插入延遲(insertion delay,也叫 latency)是邊緣從時鐘源穿過所有這些緩衝器、一路傳到某個正反器所花的時間。偏斜(skew)則是你所關心的那些正反器之間到達時間的離散程度:如果一個正反器在 1.10 ns 看到邊緣,另一個在 1.13 ns 才看到,它們之間的偏斜就是 30 ps。你沒法把插入延遲做到零,因為緩衝器和導線本身就要花掉實實在在的時間,但你會拼命把偏斜壓小,因為時序收斂(timing closure)就指望它。建立時間(setup)檢查的是資料必須在下一個時鐘邊緣之前提前多久到達,保持時間(hold)檢查的是資料不能在當前邊緣之後太快到達。偏斜會讓這些邊緣彼此之間相對挪位,所以一棵馬虎的時鐘樹會憑空製造出時序違規,而這種違規靠把邏輯做得再快也救不回來。
CTS 在佈局之後、詳細繞線之前執行,而它在不止一個意義上都是一種權衡。更大的緩衝器、更多的平衡層級能壓低偏斜,卻會燒掉動態功耗,因為這些緩衝器每一個都在每個週期翻轉一次,而時鐘網路往往是整顆晶片上功耗最大的部分之一。工具還會為晶片上變異(OCV)預留餘量——現實中,兩個完全相同的緩衝器位於晶片的不同角落時,會因為電壓跌落和製程離散而以略微不同的速度翻轉,所以一棵在標稱條件下看起來完美平衡的樹,仍然需要留出裕量才能熬過真實的矽晶片。現代流程往往放寬了過去那種追求全域近零偏斜的目標,轉而採用有用偏斜(useful skew),故意延遲某些正反器,為吃緊的路徑借來時間,但其底層任務沒有變:馴服一個時鐘,讓它到達那一整片正反器之海時足夠整齊,以滿足時序要求。
兩個正反器之間的時鐘偏斜,就是時鐘邊緣到達各自接腳的時間之差;CTS 所做的就是盡量把這個差距壓小。
務必拿繞線後、提取得到的實際時序來校驗時鐘樹,而不要只信 CTS 引擎自己的估算,因為真實的 RC 寄生參數和 OCV 降額(derating)經常會把建樹階段看起來很乾淨的偏斜和插入延遲數字重新捅出問題。