APR - Floor Plan + Power Plan === 這個階段有很多截圖,步驟很多記得多多儲存,避免重做。 Verify === 共有三個Verify的項目,前兩個需要在每一動後做檢查,若檢查即時的話有時可以回復上一動後再修改避免重做。 Verify DRC --- 這是用來檢查有無DRC error。 1. Verify->Verify DRC ![image](https://hackmd.io/_uploads/r1Ed9rtTC.png) 2. Apply ![image](https://hackmd.io/_uploads/HJC5CSuaC.png =50%x) 3. 像是拉follow pin會遇到via打在邊邊上的問題,可以用![image](https://hackmd.io/_uploads/Hk6Wx8daA.png =7%x)將問題排除 ![image](https://hackmd.io/_uploads/BJpHg8uTR.png) Verify Connectivity --- 這步是檢查線有無斷掉之類的問題。 1. Verify->Verify Connectivity ![image](https://hackmd.io/_uploads/rkwR9rtT0.png) 2. 在前期拉power時可設定Special Only,Nets named為VDD與VSS,如下圖 ![image](https://hackmd.io/_uploads/BktTz8dp0.png =50%x) 3. 但在後期routing完後需與下圖一樣都設為All做檢查,這部分我遇到的錯都是多到無法手動修改,只能重來 ![image](https://hackmd.io/_uploads/SJEulIu60.png =50%x) Verify Process Antenna --- 1. Verify->Verify Process Antenna.. ![image](https://hackmd.io/_uploads/HyAXjrtaR.png) 2. Apply ![image](https://hackmd.io/_uploads/B16vZ8O60.png =50%x) 3. 如果沒過的話在NenoRoute裡做ECO Route ![image](https://hackmd.io/_uploads/SJ2_sBYpR.png) ![image](https://hackmd.io/_uploads/SJCYWIdTA.png =50%x) 步驟 === 設定core的尺寸 --- 1. Floorplan->Specify Floorplan.. ![image](https://hackmd.io/_uploads/rkmffVua0.png) 2. Ratio為1 : 晶片會是正方形 Core Utilzation為0.7 : core佔chip的70%面積,數字越小晶片越大,數字越大繞線越困難,若後續繞線timing為負,可調整這個數值。 Core to Left、Top、Right、Bottom為240 : core 距離上下左右io的距離,在這段距離中會填core ring。 ![image](https://hackmd.io/_uploads/HycMfVu6C.png) 3. 結果 ![image](https://hackmd.io/_uploads/rJdoV4OTC.png =65%x) 初步擺放SRAM(可略過) --- 1. Floorplan->Automatic Floorplan->Plan Design ![image](https://hackmd.io/_uploads/rykyS4_pC.png) 2. OK ![image](https://hackmd.io/_uploads/ry-eB4O60.png) 3. SRAM會被整齊放進core中,因為後續還是會手動擺SRAM,所以也可以不用auto擺。 ![image](https://hackmd.io/_uploads/SkvVBV_pA.png =65%x) Create Power Ring --- 1. Power->Power Planning->Add Ring ![image](https://hackmd.io/_uploads/HJ3OPNd6R.png) 2. 我使用的是40nm製程,power ring只設了一組,可視需求增加 ![image](https://hackmd.io/_uploads/SyMcDVOaR.png) 3. 結果 ![image](https://hackmd.io/_uploads/B1hADEdpC.png =50%x) Connect Pad Pin --- 1. Route->Special Route ![image](https://hackmd.io/_uploads/SJl4uEdaR.png) 2. 這三頁都要設定 ![image](https://hackmd.io/_uploads/SkzPdVuaA.png) 3. 會用綠線(實際上是從M3到M1)將core pin與core ring連接 ![image](https://hackmd.io/_uploads/HyD3WUYpR.png =50%x) 移動SRAM位址 --- 1. 擺放工具,有水平垂直等距、靠上下左右對齊等等的方便工具可以使用 ![image](https://hackmd.io/_uploads/H1I-gItpR.png) 2. 可以放大看SRAM的腳,黃邊為訊號腳位,因為core中間是top module,我RTL的寫法是將訊號腳位面對core中心會有較短走線,而紅的長邊是power pin用來連接後續的block pin。 3. 因為SRAM四邊之後會繞block ring,所以擺放位址需避免四邊碰到pad pin,避免via打在一起,會有DRC error。 紅黃是block ring,擺放過程中要一直拉大用尺![image](https://hackmd.io/_uploads/ryncnE_p0.png =4%x)看看會不會碰到。 ![image](https://hackmd.io/_uploads/SJ0294OaA.png =50%x) 4. 上下左右也盡量對齊,以利stripe經過,打完stripe像是下圖。 ![image](https://hackmd.io/_uploads/SJ-ieHuTA.png =50%x) 5. SRAM擺放完的結果。 ![image](https://hackmd.io/_uploads/H1K03SKTA.png =50%x) 固定SRAM位址 --- 1. Floorplan->Edit Floorplan->Set Instance Placement Status ![image](https://hackmd.io/_uploads/S1GszSd60.png =50%x) 2. Fixed ![image](https://hackmd.io/_uploads/HJG3zBuTR.png =40%x) Halo --- 1. Floorplan->Edit Floorplan->Edit Halo ![image](https://hackmd.io/_uploads/ryIJ_SdpA.png =50%x) 2. placement halo ![image](https://hackmd.io/_uploads/H1gruHd60.png =50%x) 3. routing halo ![image](https://hackmd.io/_uploads/Bk-PuB_6A.png) 4. 做完後SRAM周圍會現一圈粉色的,沒出現的話切換圖層![image](https://hackmd.io/_uploads/HJv3urOTA.png =11%x)看看。 ![image](https://hackmd.io/_uploads/H1T5xmOR0.png) Blockage --- 1. Floorplan->Edit Floorplan->Create Placement Blockage ![image](https://hackmd.io/_uploads/BJyX5Sd6R.png =50%x) 2. 我使用了Soft Type,設定完後用滑鼠在core上拉線,拉完也可使用![image](https://hackmd.io/_uploads/rJTgoBdaR.png =4%x)做微調 ![image](https://hackmd.io/_uploads/HysL5BuTC.png) 四種的差別: * Hard Blockage:禁止任何元件進入 * Partial Blockage:允許一定比例的元件進入,用在降低placement密度的區域 * Soft Blockage:只限制標準元件的放置,用來保留clk或Critical Path的通道 * Macro-Only Blockage:只允許macro進入,禁止標準元件進入 3. 結果 ![image](https://hackmd.io/_uploads/B1WpcBdpC.png =50%x) Halo v.s Blockage --- Halo跟Blockage的目的都是避免小元件進入這個範圍或是繞線,以減緩setup time與hold time voilation,差別是Halo是動態的,若SRAM移動Halo會一起移動,而Blockage是絕對位置不會跟著移動,但因為SRAM位址已經固定下來了,所以這兩個的功能是如下,Blockage範圍較大,使用的是soft type,當optimize時可以將cell擺進去與繞線。 ![image](https://hackmd.io/_uploads/B1jLwSOpC.png =50%x) Create block ring --- 1. Power->Power Planning->Add Ring ![image](https://hackmd.io/_uploads/SkW7aSu6R.png) 2. 點選要包的SRAM,可以一次選多個 3. 外圈箭頭要依照SRAM在core中的位址決定長的方向 ![image](https://hackmd.io/_uploads/rkMqaBu60.png) 4. 結果 ![image](https://hackmd.io/_uploads/ByneNQ_0C.png =50%x) 5. 結果(全) ![image](https://hackmd.io/_uploads/Hklrw4mdCR.png =50%x) Connect block pin --- 1. Route->Special Route ![image](https://hackmd.io/_uploads/H10SXL_a0.png) 2. 需要看SRAM的power pin位址決定長block pin的方向,例如power pin在上面的就選Top Side,否則會SRAM上佈滿power造成後續的走follow pin被打斷,請記得每一動都需要Verify DRC和Connectivity。 ![image](https://hackmd.io/_uploads/BJEJHL_p0.png) 3. 結果會像是長了一排黃色小牙齒一樣 ![image](https://hackmd.io/_uploads/rJwBUIupC.png) Create Stripe --- 1. Power->Power Planning->Add Stripe ![image](https://hackmd.io/_uploads/r1Ds8LOaC.png) 2. 打的層數要跟power ring垂直,垂直或水平先打皆可,使用Absolute功能一段一段打 ![image](https://hackmd.io/_uploads/SyE4DUu6A.png) 3. 結果 ![image](https://hackmd.io/_uploads/ryt9vLO60.png) Connect Follow Pin --- 1. Route->Special Route ![image](https://hackmd.io/_uploads/SkkbOLuTA.png =30%x) 2. SRoute ![image](https://hackmd.io/_uploads/H1fH_UdaR.png) Add IO filler(with io pad版做的步驟) --- 1. 這步驟是在io之間填充,如果沒有空隙的話就不會填,會從最大填到最小,可source add_io_filler.tcl,內容如下 ```=tcl=1 addIoFiller -cell PFILLER20 -prefix IOFILLER addIoFiller -cell PFILLER10 -prefix IOFILLER addIoFiller -cell PFILLER5 -prefix IOFILLER addIoFiller -cell PFILLER1 -prefix IOFILLER addIoFiller -cell PFILLER05 -prefix IOFILLER addIoFiller -cell PFILLER0005 -prefix IOFILLER -fillAnyGap ``` Import IO File(without io pad版做的步驟) --- 請參照[這裡](https://hackmd.io/@linda8832825/SysQO8u30) Add Well Tap --- 1. 如果是40nm以下才要加,指令如下 ```==tcl=1 addWellTap -cell FILLTIE4_A9TH -cellInterval 120 -checkerBoard ``` 2. 效果 ![image](https://hackmd.io/_uploads/SJ2iFIO6R.png) Placement --- 這步是將cell擺上,共三個指令,第三個最久,記得做之前將CPU開到8 1. `createBasicPathGroups –expanded` ![image](https://hackmd.io/_uploads/By2Fq8ua0.png) 2. `get_path_groups` 這四個都出現才是對的 ![image](https://hackmd.io/_uploads/BkaiqLdTC.png) 3. `place_opt_design` 邊optizat邊placement --- :::danger 如果我有哪裡寫錯或是做不好的請告訴我 :woman-bowing: 這步驟超多很辛苦對吧 :persevere: 完成之後小休一下回到前面進行[下一步](https://hackmd.io/3R8wxZE4QdG0k99m57vIaA?both#Clock-Tree-Synthesis),你超棒的:facepunch: :::