ICC布局規劃
寫在前面的标注: 這裡的流程參照guide,以及微信公衆号:數字內建電路設計及EDA教程
首先,簡單的介紹一下floorplan的重要性,在之前的我學完成,本人之前的學Encounter忽略這個,這裡特别的說明一下。
Floorplan為什麼這麼重要呢?
floorplan設計将 影響到晶片的面積、速度、信号完整性和設計周期。一個好的Floorplan,不僅能獲得 更好的QoR ( Quality of Result ),也将大大 減少後續布局布線以及時序收斂所耗費的時間和精力。是以後端設計上流程中的反複主要是發生在這一步。如果這一步做得比較好,則後面一次通過的幾率就比較高,反之如果回溯到這一步,則花費的時間開銷就會很大。同時, floorplan也是在數字IC的後端設計中人工手動參與最多的相比較place,CTS,route等階段而言。是以可以說,做好Floorplan設計,晶片設計就成功了一半。
Floorplan的功能?
Floorplan的主要目的是為子產品、I/O接口、電源焊盤配置設定相對的位置,并定義時鐘和電源配置設定。在Floorplan之前我們需要知道每個子產品的門級電路尺寸和運作頻率,以及子產品之間的連接配接關系,這樣才能設計出更好的Floorplan。同時也不能等到網表完全确定後才開始這一步,Floorplan是确定晶片面積、線長、線擁塞情況的決定要素,現代EDA工具在Floorplan階段就可以估計線延遲。是以,實際項目中,往往是前端邏輯初步定義好之後就要開始嘗試Floorplan,這樣可以發現一些邏輯設計階段不能發現的問題。對于面積很大的ASIC晶片實體設計,往往采用階層化設計方案,通過頂層設計規劃、子子產品劃分和實作,以及晶片頂層組裝實作。對于頂層劃分,往往綜合考慮設計層次,連接配接關系以及面積,将整個設計劃分成多個子子產品,然後再對每個子子產品分别進行實體設計,而頂層就可以将這些子產品當成僅有IO口的黑盒子宏子產品進行實體設計。
ICC floorplan的主要内容:
- 确定晶片的尺寸
- 标準單元的排列形式
- IO單元及宏單元的位置
- 電源地網絡的分布
ICC floorplan流程
1. 在設計中添加physical only cells
2. 讀入IO限制檔案
3. 建立Floorplan
4. 加入Pad filler
5. 宏單元放置
6. 布局障礙的放置
7. 添加N well和襯底接觸單元
8. 電源地規劃
9. 自動做floorplan的placement,作為floorplan的參考
-
- 在設計中添加physical only cells
- 讀入IO限制檔案
- 建立Floorplan
- 加入Pad filler
- 宏單元放置
- 布局障礙的放置
- 添加EndCap
- 添加N well和襯底接觸單元
- 電源地規劃
- 常見Core PG Rings
- 建立Macro PG RingsMacroPG Straps并連接配接Macro的PGpins
- 将IO的電源地連接配接到CorePG Rings上
- 建立PG Strap
- 電源地Rail布線給标準單元供電的電源和地線
- 檢查IR-drop
- 自動做floorplan的placement作為floorplan的參考
在設計中添加physical only cells
Physical onlycells是那些在網表中沒有,而在實際晶片中需要存在的一些單元,如電源地IO、給IO供電的IO、corner Pad cells、填充單元 以及一些襯底、阱接觸單元等。需要在讀入IO限制檔案之前添加。
在Layout Window的菜單欄中依次選擇“ECO”→“Create Cell”。
1)添加IO Corner
IO Corner的作用是連接配接晶片拐角處兩邊的IO Pad,連接配接襯底以及襯底以上的各個層,使得IO Pad内部的電路形成一個電源地的供電環路。同時也使它們的襯底、阱 等各個層連續,不至于出現DRC的違反。
2)添加為Core供電的IO
3)添加為IO供電的IO
create_cell {vss_l vss_r vss_t vss_b} io_lib/pv0i
create_cell {vdd_l vdd_r vdd_t vdd_b} io_lib/pvdi
create_cell {CornerLL CornerLR CornerTR CornerTL} io_lib/pfrelr
讀入IO限制檔案
在LayoutWindow的菜單欄中依次選擇“Floorplan”→“Read Pin/Pad Physical Constraints”,在欄中填寫前邊準備好的tdf檔案,然後點選OK。
相應的指令為:
read_pin_pad_physical_constraints /xxx/data/main_pad.tdf
建立Floorplan
在Layout Window的菜單欄中依次選擇“Floorplan”→“Create Floorplan”。
在ICC中有三種布局規劃控制方案,其中:
1)Aspect ratio:
這種是指定晶片高度和寬度比值的方案,可以設定Core的使用率。
2)Width/Height
指定高度和寬度,一般對于含有Macro的設計,多用這種方案。
相應的指令為:
create_floorplan [-options]
建立Floorplan之前,所有的IO、宏單元以及标準單元都是疊放在一起的;Floorplan之後,所有的IO都已經擺放正确,且所有的宏單元都随機排列在晶片上方,所有的标準單元都排列在晶片右方。
加入Pad filler
Pad filler連接配接兩個兩鄰的IO pad,實作從襯底到各層金屬的相連,為IO内部電路形成電源地供電環路,如果IO之間沒有間隙則可以不插入這些單元。除此之外,如果IO中間沒有插入的話,可能會出現供電問題以及DRC的違反。插入的方法如下:
在LayoutWindow的菜單欄中依次選擇“Finishing”→“Insert Pad Filler”,在“Pin/Blockage cells”框中填寫Pad Filler的Cell名。“Pin/Blockage overlap cells”在框中填寫那些尺寸小的允許交疊的Pad Filler的名字,因為某些情況下不允許交疊的話可能這些Pad沒法連成一個環,一般這些PadFiller的寬度小于1 μm。例如某個Pad Filler的名字是PFILL10RN,則後邊的數字一般代表了該Filler的寬度,也就是說這個Filler寬10 μm,PFILL01RN代表它的寬度為0.1 μm。在填寫時要注意:一定要按照從大到小的順序進行填寫,因為軟體會按照從前到後的順序插入Pad Filler。
相應的指令為:
insert_pad_filler
宏單元放置
對于Floorplan而言,人們更傾向于靠自己的經驗去擺放Macro,擺放它們時不僅要考慮面積、互聯線長等傳統問題,還需要考慮Place階段,Macro的擺放對于Place的影響。因為Macro從本質上講就是一個巨型的标準單元,很多Macro也存在于各個子產品内,在Floorplan階段并不能和子產品對等的考慮。對于這個問題,人們根據實際生活中的經驗,提出一種邊緣擺放(edge place)的方法。
邊緣擺放的好處主要來源于下面兩點:
  1)從目前晶片設計的趨勢來看,晶片中除了計算單元外就是随機存儲單元RAM、隻讀存儲單元ROM等。這些存儲單元占據的晶片面積在有些設計中甚至超過百分之五十。對于存儲單元來說,存在資料端口和存儲端口,并且周圍需要有一些可測性電路。這使得這些單元引線衆多且功耗巨大。将它們貼邊放置,不僅有利于這些單元的供電,而且防止這些單元過多的引腳對其他單元的布線造成影響。
  2)标準單元在布局時,按照Row所劃定的高度一排一排的擺放,這樣既有利于算法的設計,又有利于工業制造。并且在給各個器件供電時,可以使用橫向的電源線将處于同一高度的器件連接配接在一起統一供電。若是将标準單元都擺放在晶片區域的中心,而大的Macro擺放在四周,就可以使标準單元友善的隻用一條電源線連接配接在一起,而不會被高度不統一的Macro打斷。對電源網格的設計提供了巨大便利。
Macro的擺放原則基本如下,可以參照下面這張圖:

1)子產品盡量擺放在靠近相應輸入輸出口(IO pad)的位置。一般來說對于大型的Macro,他們不僅僅需要與晶片内部的其他Macro或者标準單元進行資料交換,還需要與晶片外部的器件進行通信。比如,鎖相環單元需要接收外部晶振信号,存儲單元需要接收外部位址等。這種資料交換就是靠IO pad進行的,是以擺放在離相應的資料端口附近,有利于減少互聯線長度,減少線上延遲,并節約布線資源。
2)大的Macro擺放盡量貼近版圖的邊緣和角落,這樣有利用空間的利用。
3)Macro與Macro之間要留有一定空隙,給予布線資源。特别是在Macro的間隙有端口的時候更是如此,設計者可以通過相鄰Marco邊界上端口的多少來決定留有多大的間隙比較合适。在使用EDA軟體的Floorplan設計時,同樣可以給Macro加上暈環(halo)來控制Macro與Macro之間的距離。在ICC中這被成為KeepoutMargin,有hard和soft之分,hard區域不允許任何Cell放置在該區域,soft則在coarse place的時候不允許任何Cell放入其内,但是在optimization以及legalization的時候是允許Cell放入其内的,也就是隻允許Buffer加入其中。Keepout Margin與Placement Blockage不同,它并不是獨立存在的,而是依附于Macro周圍,可随Macro移動的。是以它是專門用來控制Macro和其他單元之間距離的一種功能。
4)合理設定Macro擺放的角度。在考量Macro擺放的角度時,不僅僅考慮空間擺放的因素,還要根據端口的連接配接關系與互連子產品的位置來決定。如前面原理圖中存儲子產品的端口方向朝向中央,因為中間的标準單元需要與存儲子產品進行資料交換,存在互連關系。在實際設計時,不僅要根據端口與标準單元之間的連接配接關系,還要考慮Macro與Macro之間的互連關系進行綜合判斷。
手工對宏單元進行擺放後,需要将他們設定為dont_touch屬性,以防止在布局階段軟體對它進行移動。指令為:
set_dont_touch_placement [all_macro_cells]
。效果如下:
布局障礙的放置
擺放完Macro之後需要在Macro周圍放置Hard Placement Blockage,它會阻止任何Cell放置在該區域,甚至包括後邊的Tap Cell以及Core Filler Cell。同時它也會阻止離它很近的地方放置太多的Cell,如果放置的Cell太多,就會在Macro出pin的地方産生一些Congestion。如果不放置Hard Placement Blockage,那麼軟體就會在布局階段自動在Macro周圍放置Cell,是以就會産生一些N Well或者P注入、N注入等層次間距的違反,同時也可能會産生一些Congestion。
添加EndCap
在28 nm以及更小尺寸的工藝中,為了保證栅以及氧化層的一緻性,需要在标準單元Row兩端放置EndCAP(如下圖所示)。它相當于一種Dummy管子,用來保證兩邊的标準單元左右環境的一緻性。避免在光刻時,由于最兩端标準單元左右環境的不一緻導緻其性能有所差異。
一般對于28 nm以及更高端的工藝中才會有這類單元。如果工藝庫中含有這類單元,最好加上。
添加N well和襯底接觸單元
在超深亞微米工藝中,由于标準單元的N阱和襯底接觸占的面積比較大,是以不在每個标準單元中都做相應的接觸,而是單獨做一個Cell,每隔一定的間距放一些,由此能夠節省很多面積。在該單元中包含了N阱接觸和襯底接觸。不同的工藝庫可能名稱不一樣,一般名字為FILLTIE*。
一般标準單元庫中會給出兩種擺放方式,一種是Normal(如圖4所示),另一種是Flipped(如圖5所示)。
庫中一般會定義Normal放置方式中兩個TapCell之間的最大間距,以20 μm為例,則每個Tap Cell距離它最近的Tap Cell的間距最大應該是20 μm。圖5所示的方案滿足同樣的規則,不過由于每一行Row上面都有Tap Cell(且臨近兩行Row上面擺放的Tap Cell是反轉的),是以同一行的兩個F之間的間距最大可以是40 μm。
在ICC的菜單欄中依次選擇“Finishing”→“AddTap Cell Array”,得到圖6
ICC有三種方式來放置Tap Cell,如上圖所示,一種是Normal,也是工具預設的選項,工具會按照設定的間距在每一行Row上面都放置Tap Cell。第二種是every_other_row,這種模式是隔行放置方式,對應于前面的圖4。第三種是stagger_every_other_row,這種是每行均放置Tap Cell,不過相鄰兩行是以stagger的方式放置的,對應于前面的圖5。
電源地規劃
- 電源地規劃包括以下内容:
- 建立Core PG Rings;
- 建立Macro PG Rings,并連接配接Macro的PG pins;
- 将IO的電源地連接配接到CorePG Rings上;
- 建立PG Strap;
- 電源地Rail布線;
- 檢查IR-drop。
其中,建立CorePG Rings和PG Strap這兩個步驟可以用手工指定的方式來設計,也可以用ICC中的SynthesizePower Network來實作,後者隻需要設計者對功耗、電壓降、金屬層次、寬度等給出相應的限制,軟體就會給出一個盡量滿足要求的電源地規劃方案。前提是設計庫中已經指定了TLU+檔案,且進行IR-drop分析也需要用到該檔案。
電源地規劃中過多的電源地會占用太多的布線資源,另外,在電源地下方會盡量限制擺放的标準單元的密度,以防止出現擁塞,是以,電源地是不能太多的,否則整個設計的使用率會大大降低。是以其實這是在IR-drop和Congestion之間的折衷。在不影響Congestion的情況下可以盡量多布電源地線。
1 常見Core PG Rings
這裡采用手工建立的方式,在菜單欄中依次選擇
“Preroute” → “Create Rings”
,之後在最上方選擇“Rectangular”表示以矩形方式建立,另一選項“Rectilinear”表示以線條方式建立,該選項可以建立非矩形形狀的環。對于Core PGRings的建立一般用矩形來建立,是以選擇“Rectangular”。
在“Nets”欄中填寫為哪些nets建立電源地環,在“Around”一欄中填寫為哪些區域/子產品建立電源地環,由于這裡是為Core建立,是以選擇“Core”。此外還可以為Macro以及Region來建立。
在“Side”一欄中選擇為哪條邊建立環,可以為其指定偏移“Offset”、寬度“Width”、以及層次“Layer”。如果設定了偏移,還需要指定該偏移是相對于Core的絕對偏移還是滿足DRC間距的偏移。
使用操作的指令:
create_rectangular_rings [-options]
2 建立Macro PG Rings、MacroPG Straps,并連接配接Macro的PGpins
如果是為Macro建立PG Rings,則有三種選擇:
- Specified Macro : 可以為選中的單/多個Macro分别建立
- Specified as a Group: 可以為某些標明的組的外圍來建立,組内部則不建立
- ExceptMacros: 可以為那些標明的Macro之外的Macro來進行建立
該操作使用的指令也是:
create_rectangular_rings [-options]
或者使用template來建立Macro的PG Ring。
為了降低整個Macro的IR-drop,可以在Macro上邊多打一些PG Strap,另外某些Memory的datasheet上面也可能會對它上面的Strap的數目以及寬度做出很多限制。
3 将IO的電源地連接配接到CorePG Rings上
相應的GUI操作依次為:
“Preroute” → “Preroute Instances”
,相應的指令為:
preroute_instances [-options]
由于最大線寬的限制,給電源地IO布線不能布的太寬,這時候可以通過多次連接配接來實作非常好的電源地IO布線方案。如下圖所示,分别在lowend、high end以及中心向兩邊偏移一定的距離來布四條線。
如果說電源地環有多條,那麼在不指定extend_for_multiple_connections的時候軟體隻會連接配接最外邊的電源地環,要想實作與每圈環都接觸,那麼需要設定在後邊的-options中添加extend_for_multiple_connections,并指定一個-extension_gap距離,在該距離内同一個net上的power mesh都會連接配接到一起。
4 建立PG Strap
由于建立PG Strap除了手工建立外還可以采用另一種更簡單的方式來産生,即Synthesize Power Network,是以這裡用這種方式進行講解。
首先移除之前定義的一些層次限制,由于之前已經手動産生了Core PG Rings是以需要跳過Ring的限制。
set_fp_rail_constraints -remove_all_layers
set_fp_rail_constraints -skip_ring -nets "VDD VSS"
之後需要為Power Network進行一些相應的設定,依次選擇
“Preroute”⟶“Power Network Constraints”⟶“Strap Layers Constraints”
,如圖3所示,可以設定相應的層次、最大最小Strap的數目、寬度,設定完畢一層之後點選Set,然後設定另一層。設定完畢後點選Close。
設定完限制之後便可以進行電源地網絡的綜合了。在菜單欄中依次選擇
“Preroute”⟶“Synthesize Power Network”
。如圖10所示。
選擇“By Power network by nets”,在“Nets”中填寫PG Nets名稱,之後填寫供電電源值、預計的功耗,在“Synthesizeoptions”一欄中選中“Synthesizepower plan”,勾選“Specifiedpad masters”以指定IO Pad的方式來設定從什麼地方進行供電,并在後邊的框中選擇相應的供電IO。
上述選項設定完畢之後,點選“Apply”,便可以觀看設計中的IRdrop,如圖11所示,如果不滿足則需要修改限制并重新生成。
如果IR drop已經滿足了自己的要求,可以點選“Commit”,軟體便會盡量産生出滿足自己定義的規則的PG Strap。注意該操作一旦執行,不可撤銷。是以最好在執行該操作前對設計進行儲存。或者如果執行了該操作,發現有問題,想要撤銷,可以用remove_route_by_type -pg_strap來删除PG Strap。
set_fp_rail_constraints-remove_all_layers
set_fp_rail_constraints -skip_ring \
-nets "$MW_GROUND_NET$MW_POWER_NET"
set_fp_rail_constraints-add_layer -layer TM1 \
-direction vertical \
-max_strap -min_strap \
-max_width -min_width \
-spacing minimum
set_fp_rail_constraints-add_layer -layer TM2 \
-direction horizontal \
-max_strap -min_strap \
-max_width -min_width \
-spacing minimum
synthesize_fp_rail-nets "$MW_POWER_NET $MW_GROUND_NET" \
-voltage_supply . \
-synthesize_power_plan \
-power_budget \
-pad_masters {VDD:PVDD1RN_X.FRAM VDD:PVDD1RN_Y.FRAM VSS:PVSS1RN_X.FRAM }
5 電源地Rail布線(給标準單元供電的電源和地線)
該步的GUI操作為:“Preroute”→“Preroute Standard Cells”。相應的指令為preroute_standard_cells[-options],此處需要注意選擇fill_empty_rows,因為某些Row上面可能沒有放置标準單元,是以需要填充這些空的Row。
使用的指令:
preroute_standard_cells-nets {VDD VSS} \
-connect horizontal \
-fill_empty_rows \
-port_filter_mode off \
-cell_master_filter_mode off \
-cell_instance_filter_mode off \
-voltage_area_filter_mode off \
-route_type {P/G Std. Cell Pin Conn}
6 檢查IR-drop
做電源網絡分析(Power Network Analysis, PNA),檢視電源規劃的IR Drop。這裡隻介紹該操作的指令:
analyze_fp_rail-nets "VDD VSS" \
-power_budget 10 \
-voltage_supply 1.1 \
-pad_masters { VDD:PVDD1RN.FRAMVSS:PVSS1RN.FRAM }
自動做floorplan的placement,作為floorplan的參考
自動做floorplan的placement,作為floorplan的參考。這一步是對前面做的Floorplan做以評判,看其品質如何,如果Floorplan做的不好,那麼後邊也許就沒有繼續做下去的必要了,因為後邊的流程可能根本就走不通,是以這一步至關重要,它是對Floorplan的品質做以簡單的評估,如果品質很差,那麼需要參考之前的Floorplan方案,并做以調整,直到結果在可以接受的範圍内,然後才能繼續往下做。
為了對手工Floorplan的結果做以評判,需要在擁塞和時序上對它進行檢查,是以可以在布局之前,首先讓軟體快速的做一個粗略的布局,可以輸入以下指令來在Floorplan階段做快速布局:
create_fp_placement -congestion_driven-timing_driven
之後需要報告設計中的擁塞情況,輸入指令:
report_congestion
這裡提到了擁塞(Congestion),它對于後端設計至關重要,我們針對該指令産生的報告做以介紹。
擁塞代表一個GRC(GlobalRouting Cell)邊界上需要的布線資源與可用布線資源的比值,當所需布線資源大于可用布線資源時,就會存在擁塞。ICC在報告擁塞時,預設首先進行全局布線,使用全局布線的結果來報告擁塞。可以在ICC的GUI界面中上方工具欄中依次選擇“View” →“Map Mode”→“Global RouteCongestion”來顯示擁塞圖(CongestionMap)。如圖12所示。
GRC為正方形,每個邊的尺寸通常為标準單元高度的兩倍。它會計算出GRC每條邊可用于布線的布線通道(track)的數目(Capacity),以及布線需要的布線通道的數目(Demand)。圖13中畫出了一個GRC,邊上的數值即為Demand/Capacity。Demand – Capacity即為溢出(Overflow)的數目,如果存在Overflow,則Congestion Map中就會将GRC的那條邊進行高亮,Overflow越大,則顔色越偏向于暖色調(即紅色)。
下面給出了report_congestion的報告:
上圖中,“Max” overflow是13,意味着至少有一個GRC的邊界overflow是13。也就是說這條邊要額外走13條線,可是卻沒有額外的布線資源來供它進行布線。總共的GRC overflow是2.73%,意味着設計中所有GRC的邊界大約有2.73%存在着overflow。
  根據經驗,一般最大的Overflow如果超過10基本上這個設計就無法布通了,最好不要超過3~5。另外如果總共的overflow超過2%,也可以認為設計在後邊很難繞通。這些說明Floorplan不是很好,需要修改Floorplan或者重新進行Floorplan,需要看擁塞出現在什麼地方,根據不同情況不同對待。
如果出現很大/很多擁塞,該如何處理?
1. memory 間的channel congestion
  當相鄰的兩個memory距離很近時,導緻memory的資料線和位址線在狹窄的空間内無法找到足夠的布線通道,通常會發生congestion。
  解決方法一般為調整memory的位置,為出pin的區域留出足夠的空間,避免産生狹窄的通道。
2. 局部高密度标準單元引起的congestion
  大量的繞線通過高密度标準單元區域時,有時候會發生局部的較為嚴重的congestion。
  為了解決局部congestion,我們通常會借助partial blockage降低局部區域的标準單元密度。
- Partial blockage是placement blockage的一種,是某一區域設定标準單元的使用率。有時候用partial blockage,并不能有效的解決congestion,這時候可以用blockage array來解決此類congestion。
- Blockage array是用“blockage陣列”的方式,控制congestion區域的标準單元的在區域内成條狀分布:一方面降低了密度,另一方面預留出了布線通道。
-
局部高密度Pin cell導緻的congestion
  在數字邏輯設計中,如果某些子產品用了大量的高密度pin标準單元(如AOI, OAI等),這些标準單元會有很多的互聯關系,這樣就會導緻在有限的空間内,存在大量的繞線,進而發生congestion。
  常用的解決方法是有針對性的降低此種标準單元的密度,如在ICC裡,可以對這些标準單元設定keep_out_margin。通過此種方法,可以有效的削弱congestion。
-
PowerMesh太多引起的Congestion
  數字IC版圖設計中如果PowerMesh打的太多,由于下面要放置标準單元,是以在出Pin的地方可能會存在Congestion。
  常用解決辦法是,減少power,不要打太多,根據以往經驗和IR-drop分析的結果減少一些。另外可以在布局之前設定讓軟體在Power下面不要放太多單元,設定partial blockage,partial density control。
  如果設計中有很大的擁塞,需要趕快解決。在Floorplan階段也沒有必要把設計中的擁塞全部降到0,因為此時軟體隻是快速做了一個參考布局方案而已,并非實際的布局,是以某些擁塞并沒有完全解決,它們可以在後續的布局階段解決。由于ICC允許可以不沿着格點布線,是以在布線階段也會解決一部分擁塞。
  除了前面的擁塞,ICC也可以在Floorplan之後對時序做以簡要的報告,看是否存在Setup的違反,如果違反很大的話可能Floorplan也存在一些問題,例如一些需要高速通訊的Macro相隔距離太遠。