今天先問問題:
1. DRC有點多,想修DRC用哪個命令?
2. 手動挪了一個std cell,它的繞線斷開了,想把它連好用哪個命令?
3. 只想繞一根線用哪個命令?
這些問題對ICC2老鳥來說,really easy。
但對freshman來講,有必要做些基礎知識普及,才會用的得心應手。
route相關的命令不多,主要有如下幾個:
route_auto
route_opt
route_eco
route_group
route_global
route_track
route_detail
今天就簡單介紹一下這幾個命令的作用和區別。
route_auto
繞線。主要指信號線。
因為時鍾樹的net在CTS階段已經繞線好了。當然,如果時鍾樹沒有繞線,route_auto會把clock tree和signal net一起做繞線。route_auto在P&R流程中只用一次,一次就好。
route_auto為啥叫auto,它其實是由三個子命令組成,且是automatically完成的。
route_auto=route_global+route_track+route_detail
反過來,如果您不想auto,也可以手動跑route_global+route_track+route_detail,效果是相同的。
三個子命令具體的功能是:
route_global:快速連線,但不創建真實的金屬(只創建了VIA)
route_track:根據route_global的結果,加上真實的金屬,但沒有考慮DRC
route_detail:修DRC
route_global
快速連線。
做完route_global后,所有的net都連上了。但是,沒有放真實的金屬,而是一根根沒有寬度的細線。這些細線有layer信息,也有真實的孔。
比如你去看一個net,它是從一個buffer_X 的Z pin輸出到下一個buffer_Y 的I pin。從buffer_X的Z pin出來,就有一個VIA12,然后連一段M2的細線,又通過VIA23走到M3,然后M3又通過VIA23,M2和VIA12連到了buffer_Y的A pin。如此,便是一條完整的global route。它有四個VIA和三段連線。
除了細線和孔,global route還有很多有用的信息,比如NDR。有些net有兩倍的space需求,global route會遵守,有些net只能放在某一層,global route也能遵守。
可以說,對net的約束,基本全靠global route來完成。同時,global route的結果,很大程度上決定了最后的繞線質量。所以要用timing_driven,effort可以設成high,便可以得到更好的結果。
route_global用處非常非常大,可以說在P&R里無處不有。比如initial drc調用global route可以把buffer tree長的更好;placer調用route_global來評估congestion;optimizer調用route_global做pre-route的RC評估;CTS調用global route長時鍾樹,甚至route_eco也會調用global route來連斷開的線。
要做好P&R,一定要善用route_global。以后可以有專門的文章介紹route_global。
route_track
根據global route的結果創建金屬(shape),不考慮DRC。
route_track完成之后,細線消失了,變成了有寬度的金屬。這個過程非常快,分分鍾完成,因為它基本不考慮別的cost,但是,也有timing_driven和crosstalk_driven,記得要打開哦。
route_detail (-incr)
修DRC。
route_track后的shape肯定存在大量的DRC,越復雜的工藝DRC越多。修DRC全靠route_detail這個engine。默認是40輪,但也不一定要等40輪才結束,icc2如果發現DRC數目修不下來了,route_detail便會提前退出。
route_group
對指定的net進行繞線。
可以說route_group是一個快速版本的route_auto,它對指定的net進行繞線,它也含有route_global,route_track,和route_detail三步。因為只對指定的net繞線,所以速度很快。
比較常用的場景是,提前對一些timing critical的net繞線:
route_group -net $critical_nets
讓這些net走直線。另外一種常見用法是給時鍾樹繞線:
route_group -all_clock_nets
它 = clock_opt -from route_clock -to route_clock
route_eco
把做eco(timing or function)后斷開的net(或新增加的net)做繞線並修DRC。
這個命令在修timing階段天天要用。做ECO后,繞線必然有斷開,或有DRC,或有新增加的net需要繞線。不管什么情況,統一用route_eco來搞定。
route_eco實際上有做二個動作:
-
連接新的/斷開的net (調用route_global + route_track)
-
修DRC (調用route_detail -incr)
第二步,可以只修ECO net的DRC,也可以修全部net的DRC,可以依自己的需求使用。
常用的錯誤用法是,用route_eco修DRC。雖然也不會有問題(route_eco的第一步沒起作用,只是第二部起作用了),但畢竟不建議這么玩。用route_detail -incr會更好。
route_opt
優化時序(同時還優化面積,功耗,transition,hold等),並做eco routing。
其實route_opt可理解成三步:
-
post route optimization
優化setup,面積,功耗,transition,hold等(size_cell 和insert_buffer為主)
-
legalize_placement
經過第一步的折騰后,有很多的cell 有overlap,或不在site row上,需要legalizer把它們放在legal location上。
-
route_eco
經過第一,第二步的折騰后,繞線損失挺大,需要調用route_eco來收拾殘局。工具默認是5輪,可以設成10或者更多。
route_opt也可以跑多輪,以便得到更好的PPA。