PPA最佳原則: 全稱是Performance,Power,Area熄捍,即性能凸舵,功耗崎逃,面積。這個(gè)PPA貫穿整個(gè)IC設(shè)計(jì)實(shí)現(xiàn)的全過(guò)程较剃。
一, import design
1, 檢查時(shí)鐘周期是否符合SPEC
# 如果前端修改了時(shí)鐘周期咕别,而后端不知道的情況下繼續(xù)跑優(yōu)化,出現(xiàn)這種情況那就很浪費(fèi)時(shí)間了写穴,所以最好在完成設(shè)計(jì)導(dǎo)入之后及時(shí)與前端人員確認(rèn)時(shí)鐘約束是否正常惰拱。
# 頻率 = 1 / 周期(period)
命令: report_clocks
2, 檢查log中是否有ERROR
3, checkDesign -netlist 會(huì)報(bào)出哪些信息
1) std cell / macro / io pad / nets 的數(shù)量
2) std cell / macro / io pad 的面積
3) instance = std cell + macro
...
# 經(jīng)驗(yàn)估算core的面積 = std_area / 0.65 + macro_area / 0.82
二, floorplan
floorplan :
innovus -files../scripts/02_create_floorplan.tcl | tee 02_create_floorplan.log
1)指定芯片/模塊的尺寸(大小)
2)檢查memory擺放的方向是否正確(poly方向需要和標(biāo)準(zhǔn)單元啊送,memory的poly方向一致)
3)把設(shè)計(jì)中的io port擺放到頂層要求的位置(edit => Pin edit)
4)添加endcap(邊界)和tapcell(閂鎖效應(yīng))
5)添加power switch cell (可選)
驗(yàn)證tapcell vios
verifyWellTap \
-cell TAPCELLBWP40P140 \
-rule 30 \
-wellCutCell {BOUNDARY_LEFTBWP40P140 BOUNDARY_RIGHTBWP40P140} \
-report WellTapCheck.rpt
如何評(píng)價(jià)數(shù)字后端設(shè)計(jì)中floorplan的好壞偿短?
從此沒(méi)有難做的floorplan(數(shù)字后端設(shè)計(jì)實(shí)現(xiàn)floorplan篇)
三, powerplan
1)打上高層的M8和M9 Power Stripe
2)sroute鋪power rail
3)設(shè)置via rule進(jìn)行power stripe和power rail的打孔,形成power mesh
4)檢查powerplan是否存在pg floating
verifyConnectivity -noAntenna -noSoftPGConnect -noUnroutedNet -error 1000000 -net VDD
verifyConnectivity -noAntenna -noSoftPGConnect -noUnroutedNet -error 1000000 -net VSS
5)檢查powerplan是否存在short和open
verify_PG_short -no_routing_blkg
6)檢查floorplan&powerplan是否有drc violation
verify_drc -limit 10000
- 一個(gè)強(qiáng)制供電網(wǎng)絡(luò)的標(biāo)準(zhǔn):
IR Drop符合設(shè)計(jì)spec(靜態(tài)3-5%馋没,動(dòng)態(tài)14%)
EM滿足foundary的signoff要求
供電電阻足夠小
Calibre
# 生成.gds2文件
setStreamOutMode -version 688
setStreamOutMode -textSIze 0.1
setStreamOutMode -virtualConnection true
setStreamOutMode -uniquifyCellNamesPrefix true
setStreamOutMode -SEvianames true
streamOut ../data/cortexa7Core.gds2 source-mapFile /data/tech/gdsout_5X2Y2Z_innovus.map -libName DesignLib -units 1000 -mode ALL
在innovus中使用
# innovus中執(zhí)行
source [file join $::env(CALIBRE_HOME) lib cal_enc.tcl]
# 打開calibre
calibredrv xxx.gds -l /data/tech/drc/forDRV.layerprops
使用add_via_definition定義通孔之后 執(zhí)行add power stripe系統(tǒng)不再默認(rèn)向上或者向下打via了
這是因?yàn)槿绻覀冇昧薬dd_via_definition這個(gè)命令之后翔冀,在打power stripe的時(shí)候需要指定power stripe去打via的金屬層。如果沒(méi)有定義add_via_definition這個(gè)命令披泪,innovus默認(rèn)情況下是會(huì)用設(shè)計(jì)里面所有的金屬層去打via的纤子,即你用了M8打垂直方向的power stripe,而那么在打sroute的時(shí)候款票,工具是會(huì)識(shí)別到power stripe的via約束控硼,他可以向下一直打via連接到M1,也可以向上一直打via連接到最頂層的M10艾少。所以沒(méi)有定義add_via_definition約束的時(shí)候卡乾,我們打完power stripe之后,再打power rail缚够,他們之間是會(huì)自動(dòng)連接在一起的幔妨。
但是如果我們用了add_via_definition這個(gè)命令去定義via的約束之后,power stripe的via通孔默認(rèn)約束就失效了谍椅,他不會(huì)自動(dòng)向上或者向下打via了误堡,所以我們會(huì)發(fā)現(xiàn),打了M8之后雏吭,他不會(huì)自動(dòng)跟M9連接在一起锁施,打power rail的時(shí)候也不會(huì)跟M8連接在一起。
這個(gè)時(shí)候我們需要手動(dòng)給M9和M8這兩個(gè)power stripe再添加一個(gè)via的約束,告訴他們需要往哪一層去打via悉抵。命令如下:
setViaGenMode -optimize_cross_via true
add_via_definition -name via12_usrdefine -via_rule VIAGEN12 -row_col {1 10} -cut_size {0.13 0.05} -bottom_enclosure {0.02 0.02} -top_enclosure {0.02 0.02} -cut_spacing {0.1 0.1}
add_via_definition -name via23_usrdefine -via_rule VIAGEN23 -row_col {1 10} -cut_size {0.13 0.05} -bottom_enclosure {0.02 0.02} -top_enclosure {0.02 0.02} -cut_spacing {0.1 0.1}
add_via_definition -name via34_usrdefine -via_rule VIAGEN34 -row_col {1 10} -cut_size {0.13 0.05} -bottom_enclosure {0.02 0.02} -top_enclosure {0.02 0.02} -cut_spacing {0.1 0.1}
add_via_definition -name via45_usrdefine -via_rule VIAGEN45 -row_col {1 10} -cut_size {0.13 0.05} -bottom_enclosure {0.02 0.02} -top_enclosure {0.02 0.02} -cut_spacing {0.1 0.1}
add_via_definition -name via56_usrdefine -via_rule VIAGEN56 -row_col {1 10} -cut_size {0.13 0.05} -bottom_enclosure {0.02 0.02} -top_enclosure {0.02 0.02} -cut_spacing {0.1 0.1}
add_via_definition -name via67_usrdefine -via_rule VIAGEN67 -row_col {1 10}
add_via_definition -name via78_usrdefine -via_rule VIAGEN78 -row_col {1 10}
add_via_definition -name via89_usrdefine -via_rule VIAGEN89 -row_col {2 5}
setViaGenMode -viarule_preference {via12_usrdefine via23_usrdefine via34_usrdefine via45_usrdefine via56_usrdefine via67_usrdefine via78_usrdefine via89_usrdefine}
setAddStripeMode -stacked_via_top_layer M8 -stacked_via_bottom_layer M1
addStripe -nets {VSS VDD} \
-layer M8 \
-direction vertical \
-width 6 \
-spacing 2 \
-set_to_set_distance 30 \
-start_from left \
-start_offset 1 \
-uda power_stripe_M8
setAddStripeMode -stacked_via_top_layer M9 -stacked_via_bottom_layer M8
addStripe -nets {VSS VDD} \
-layer M9 \
-direction horizontal \
-width 6 \
-spacing 2 \
-set_to_set_distance 30 \
-start_from bottom \
-start_offset 1 \
-uda power_stripe_M9
sroute -connect { corePin } \
-layerChangeRange { M1(1) M8(8) } \
-corePinTarget { none } \
-allowJogging 1 \
-crossoverViaLayerRange { M1(1) M8(8) } \
-nets { VDD VSS } \
-allowLayerChange 1 \
-targetViaLayerRange { M1(1) M8(8) } \
-uda power_rail_M1
在打M8的時(shí)候肩狂,我們需要先加入setAddStripeMode -stacked_via_top_layer M8 -stacked_via_bottom_layer M1這個(gè)命令,告訴工具M(jìn)8這根power stripe可以向下打via一直連接到M1姥饰,也就是后面用sroute打的power rail傻谁,在打power rail的時(shí)候,就會(huì)自動(dòng)把M8到M1之間的通孔給補(bǔ)齊列粪,并且按照我們上面約束的通孔規(guī)則來(lái)打审磁,即一行十列的via矩陣。而打M9的時(shí)候篱竭,需要先加入setAddStripeMode -stacked_via_top_layer M9 -stacked_via_bottom_layer M8這個(gè)命令力图,告訴工具M(jìn)9這根power stripe需要跟M8 power stripe連接在一起步绸,這樣在打M9的時(shí)候掺逼,工具也會(huì)一起添加VIA8這個(gè)通孔,把兩層金屬連接起來(lái)瓤介。
top級(jí)別才需要打power ring, block級(jí)別不需要這一步.
四, placement
Placement前
1)檢查placement blockage是否正確添加吕喘,以及確認(rèn)blockage的類型
2)整理dont use list
3)設(shè)置好dont_touch的cell
4)確保時(shí)鐘clock已經(jīng)被設(shè)置為 ideal network
5)FIX住所有的Macro和預(yù)先想place好的cell
6)檢查 pin access。
Placement 基本上的順序是:
1)首先是做coarse place刑桑,所有的std cell都有一個(gè)大致的位置氯质,這個(gè)時(shí)候std cell可能是會(huì)有overlap的情況或者或者不在row上面
2)接著做coarse place的setup timing優(yōu)化,DRV優(yōu)化等
3)之后做place的合法化放置祠斧,也是可以理解為detail place闻察。在此之前std cell都是coarse place,std cell的位置比較隨意琢锋,彼此之間可能會(huì)重合辕漂,或者不在row上面,這一步就是將他們擺到row上面去吴超,同時(shí)std cell之間不能有重合或者1倍filler cell的間距
4)最后再進(jìn)行timing的優(yōu)化
Placement --
1, 環(huán)境mode設(shè)置
2, 執(zhí)行place_opt_design
3, 檢查setup timing钉嘹,DRVs是否符合預(yù)期,一般reg2reg(這里的reg2reg泛指除了io相關(guān)的path鲸阻,包括reg2reg跋涣、reg2cgate、reg2mem等等鸟悴,因?yàn)閕o相關(guān)的path是我們?nèi)藶樵O(shè)置的input delay和output delay陈辱,這些一般我們都是設(shè)置60%的時(shí)鐘周期,屬于過(guò)約束细诸,在時(shí)序上是不準(zhǔn)確的性置,在block階段是不用關(guān)注的)的wns小于100ps,drv基本clean即可繼續(xù)往下走
4, 檢查routing congestion是否滿足要求揍堰,一般總的overflow需要小于1.5% (overflow)
5, 檢查cell的desity是否滿足要求鹏浅,一般要求不要大面積出現(xiàn)超過(guò)80%的情況即可
6, 檢查max displacememt時(shí)候滿足要求嗅义,一般要求優(yōu)化過(guò)程中該數(shù)值小于100um
7, 查看設(shè)計(jì)的利用率
8, 設(shè)計(jì)的時(shí)鐘頻率
setup: 每個(gè)階段setup的WNS 控制在100ps左右即可以接著往下跑下面的流程,并非每個(gè)階段的timing都要沒(méi)有violation隐砸。
DRV: 只要不是floorplan的問(wèn)題或者不是特別大的都可以在pt timing signoff階段做fixing
整體density盡量不要超過(guò)80%之碗,而且局部density不要高于85%。主要是防止繞線detour和hold buffer沒(méi)地方插
- local congestion 解決方法
#第一種是檢查place優(yōu)化的mode
setPlaceMode -congEffort high
# 設(shè)置完后重新跑opt即可
place_opt_design
#第二種是局部區(qū)域congestion優(yōu)化
congRepair -area
#注意: 這個(gè)命令可以在做完place_opt_design的基礎(chǔ)上做congestion優(yōu)化季希。
#由于這個(gè)命令會(huì)根據(jù)congestion結(jié)果將它周圍的cell均攤開褪那,因此可能會(huì)搬動(dòng)較多的cell。
#所以這個(gè)命令不適用于post-cts timing 優(yōu)化后來(lái)使用式塌。
#第三種 Module Padding
setPlaceMode -modulePadding module factor
#這里的factor值需要根據(jù)自己的設(shè)計(jì)和經(jīng)驗(yàn)來(lái)設(shè)定博敬,通常取值范圍為1.2-2.0。
#舉個(gè)例子峰尝,比如這個(gè)值為2偏窝,表示工具在做global placement的時(shí)候會(huì)將這個(gè)module里面的每顆cell看做成2顆這樣的cell ,
#所以做出來(lái)的效果是這個(gè)module占用的面積更大武学,約為原來(lái)的兩倍祭往,cell之間的space就更大了。
#但需要注意的是火窒,這個(gè)命令只在global placement階段起作用硼补,在后續(xù)的refinePlace工具是不follow的。
#第四種 Instance Padding
在數(shù)字IC后端實(shí)現(xiàn)中經(jīng)常會(huì)把innovus中的幾種padding結(jié)合起來(lái)使用來(lái)達(dá)到一個(gè)最佳的congestion優(yōu)化效果熏矿。
foreach i [dbGet [dbGet -p2 top.insts.cell.name AOI*].name DTMF_INST/RESULTS_CONV_INST/*] {
specifyInstPad $i 2
}
#第五種 Cell Padding
實(shí)際項(xiàng)目中經(jīng)常會(huì)碰到某個(gè)module中包含大量的AOI,OAI,NAD這種高pin density的cell已骇。
往往這種地方容易有l(wèi)ocal congestion問(wèn)題。那解決的方法就是將這類cell設(shè)置padding票编。
這個(gè)與ICC/ICC2中的keepout是一樣的效果褪储。
只不過(guò)S家的單位是具體距離,而C家的單位是多少site栏妖。
specifyCellPad cellName 6 (這里的6并非是6um)
#第六種 Density Placement Blockage
對(duì)于局部區(qū)域的congestion問(wèn)題乱豆,
特別是各種窄channel的地方或拐角的地方,經(jīng)常需要添加density placement blockage吊趾。
這種blockage其實(shí)就是傳統(tǒng)所說(shuō)的partial placement blockage
宛裕。主要的原理是通過(guò)控制該區(qū)域的density來(lái)解決congestion的問(wèn)題。
數(shù)字后端實(shí)現(xiàn)時(shí)congestion比較嚴(yán)重论泛,你hold得住嗎揩尸?
數(shù)字后端實(shí)現(xiàn)place過(guò)程進(jìn)階
五, CTS 時(shí)鐘樹綜合 & CTS_opt
CTS前
● 此時(shí)應(yīng)該做完標(biāo)準(zhǔn)單元的擺放,而且確保標(biāo)準(zhǔn)單元是legal的屁奏。
● placement的congestion map和cell density map比較合理
● Timing可以接受
1, 05_cts做完之后不用檢查時(shí)序岩榆,只需要檢查clock skew和clock latency是否合理,clock path是否存在兜圈的情況
- 到了06_ctsopt之后,我們才需要檢查時(shí)序是否滿足要求勇边,這個(gè)時(shí)候有了真實(shí)的clock skew犹撒,我們就需要開始優(yōu)化hold時(shí)序,跟place階段的timing評(píng)估標(biāo)準(zhǔn)一樣粒褒,只要reg2reg的setup和hold wns小于100ps识颊,drv基本修復(fù),就可以繼續(xù)往下走
3, 做完ctsopt之后奕坟,大家需要對(duì)timing進(jìn)行檢查祥款,需要明白common path和crpr對(duì)于timing的影響
單獨(dú)指定某個(gè)clk端latency(tree的做長(zhǎng)做短)
set_colock_latency -0.1 FF1/clk
告訴工具這個(gè)寄存器的clk端的信號(hào)到達(dá)時(shí)間是-0.1ns.
這里意味著這個(gè)寄存器的時(shí)鐘到達(dá)時(shí)間比其他寄存器快0.1ns(100ps), 負(fù)號(hào)表示相對(duì)關(guān)系!
所以FF1的setup更容易滿足了
七, route
三個(gè)階段,分別是global route 月杉、Track Assignment 刃跛、Detail route。
Global route:可以預(yù)估design的congestion情況苛萎,這步會(huì)引用Gcell的概念分析track能通過(guò)gcell的數(shù)量桨昙,如果任何一個(gè)gcell存在congestion,工具在做global route時(shí)就會(huì)避開congestion區(qū)域來(lái)做global route首懈。
Track Assignment:就是將每一個(gè)net分配到特定的track上并鋪設(shè)實(shí)際的金屬軌跡绊率,軌道盡量長(zhǎng)谨敛、盡量直且有較少的打孔via究履。
Detail route:是按照上述的分配進(jìn)行實(shí)際的繞線同時(shí)會(huì)檢查drc的問(wèn)題。
在Route后脸狸,我們已經(jīng)有了真實(shí)的繞線情況最仑,這個(gè)時(shí)候就不需要考慮congestion map,直接看route之后的drc情況即可炊甲。
1, 繞線結(jié)束后我們主要關(guān)心繞線的DRC即可.
2, 理解天線效應(yīng)的修復(fù)操作.
如何評(píng)判route結(jié)果的好壞泥彤?
(1) short和open的數(shù)量控制在兩位數(shù)以內(nèi)
(2) 比較少的DRC
(3) 沒(méi)有多少天線效應(yīng)
(4) 沒(méi)有因?yàn)殚L(zhǎng)繞線而引起的DRV問(wèn)題
(5) 沒(méi)有比較大的timing violation,opt之后能夠控制在50ps以內(nèi)即可