EDA - APR === 在這個篇章會介紹innovus的使用方式,以及有無I/O pad的APR資料準備與流程。 innovus初步使用說明 --- 1. 在Terminal執行`Rinnovus`開啟innovus 2. 開CPU使用上限,設為8,記得每次重開innovus都要設定 ![image](https://hackmd.io/_uploads/Sk7I9MOTC.png =25%x) ![image](https://hackmd.io/_uploads/r1dD5zd60.png =50%x) innovus讀寫方式 --- ### 讀檔 ![image](https://hackmd.io/_uploads/HJ9RtfO6R.png =25%x) ![image](https://hackmd.io/_uploads/Hywx5fdTR.png =50%x) ### 存檔 第一次存檔前需在apr的根目錄下新增DBS(Design Block System)資料夾,再在這資料夾下存檔,檔名建議命為"目前做到的步驟.enc",例如做完了floor plan可將檔名命為 "floor_plan.enc",若下一步的power plan有問題就能將這個檔案讀回來重做。 ![image](https://hackmd.io/_uploads/SkHGpfO6R.png =25%x) ![image](https://hackmd.io/_uploads/BkKEe7upC.png =50%x) APR流程說明 --- 由於不是每次APR完都要直接將晶片下線,因此分為兩種匯入io file的方式,如以下兩張圖,差別在於晶片有無power pin,流程上的差異為io file的匯入時機。 * with I/O Pad ![image](https://hackmd.io/_uploads/Hy-eERR20.png) * without I/O Pad ![image](https://hackmd.io/_uploads/BkClBR0nC.png) APR的目的是將合成完或是DFT後的電路實體佈局與繞線,首先需要先規劃好IO Pad的擺放方式,接下來會分為8個步驟做講解。 Input File === 這步驟是在準備APR所需資料分為四種 * Gate Level Netlist : 合成後 or DFT後 的.v檔 * Timing Costraint : 合成產的sdc檔 * I/O Pad : 晶片腳位的擺放順序與使用的pad款式,副檔名為 .io * Technology File : .global檔 io file --- 依照電路的後續使用,這個檔案分成兩種產生方式: * [直接下線](https://hackmd.io/@linda8832825/rJwsP8O3A) * [與其他電路做串接前後級後再下線](https://hackmd.io/@linda8832825/SysQO8u30) global file --- global file儲存著步驟一Input File的所有檔案,若下一步的Floorplan有問題則可以直接重新Import這個檔案再繼續做Floorplan,建檔詳細流程可以看[這篇](https://hackmd.io/@linda8832825/SJaTR0ChA)。 Before Floorplan === 1. Import global file 2. 開高CPU數 3. 命名VDD、VSS,建立一個檔案命名為"Global_Net.tcl",這檔案包含了SRAM的power,檔案內容如下 ```=tcl=1 clearGlobalNets globalNetConnect VDD -type pgpin -pin VDD -instanceBasename * globalNetConnect VDD -type pgpin -pin VDDCE -instanceBasename * globalNetConnect VDD -type pgpin -pin VDDPE -instanceBasename * globalNetConnect VSS -type pgpin -pin VSS -instanceBasename * globalNetConnect VSS -type pgpin -pin VSSE -instanceBasename * ``` 4. 執行`source Global_Net.tcl` 5. 將module解開 ![image](https://hackmd.io/_uploads/SyoYGfO0R.png =100%x) Floorplan + Powerplan === 這個步驟會將擺放元件跟拉power的順序交錯執行,故步驟很多整理在[這篇](https://hackmd.io/@linda8832825/HJHw64_60)。 Clock Tree Synthesis === 這步驟是做為了確保所有元件能同步工作,平衡的clock tree可以減少偏移與延遲,詳細的步驟在[這篇](https://hackmd.io/@linda8832825/BJgVL6NK6A)。 Routing === Before Routing --- 在routing前要加 Tie Hi/Lo Cell,流程如下 1. Place->Tie Hi/Lo Cell->Add.. ![image](https://hackmd.io/_uploads/ByGPLwtTR.png =25%x) 2. 選這兩個 ![image](https://hackmd.io/_uploads/SkVt8PFp0.png =30%x) 3. 由於我的設計中不需要Tie Cells,所以加不上去 ![image](https://hackmd.io/_uploads/SyV4dDt60.png =70%x) Routing --- 1. Route->NanoRoute->Route.. ![image](https://hackmd.io/_uploads/ryoddPY6A.png =40%x) 2. 依照下圖的設定後Apply ![image](https://hackmd.io/_uploads/ryc9_PtT0.png =75%x) 3. 上圖中的Diode Cell Name可以使用以下指令找其他可用的cell name ![image](https://hackmd.io/_uploads/B1OA_PtT0.png) After Routing --- 在繞線完後要檢查Timing,而沒過的話一樣可以ECO。 1. Timing->Report Timing ![image](https://hackmd.io/_uploads/HkpftLtpR.png =20%x) 2. Setup和Hold time都需要測 ![image](https://hackmd.io/_uploads/HkXIYwYa0.png) 3. 如果沒過的話可以Optimize 4. ECO->Optimize Design ![image](https://hackmd.io/_uploads/SkDKtLYT0.png =20%x) 5. Apply ![image](https://hackmd.io/_uploads/H10uKPt60.png) Add Core Filler --- 在繞線完後就完成了晶片設計,而cells中間會有空隙,因此要加入core filler來填補,提供物理結構的完整性,步驟如下。 1. Place->Physical Cell->Add Filler.. ![image](https://hackmd.io/_uploads/HyfFjPt60.png) 2. 第一排的Select請照第三步的做,如果加完core filler後出現DRC錯誤請往前讀檔後勾選"Do DRC",第一次做不用勾"Do DRC"。 ![image](https://hackmd.io/_uploads/Hk0lnDFpA.png =40%x) 3. 將右邊lists中沒有重複的項目都加入到左邊 ![image](https://hackmd.io/_uploads/S1YCsPtpR.png =80%x) 4. 放很大可以看到core filler ![image](https://hackmd.io/_uploads/SJ0F3vFTA.png) Design for Manufacturing === 在輸出檔案之前要Verify,這部分是為了檢查有無DRC等等的錯誤,流程可以看[這篇](https://hackmd.io/@linda8832825/HJHw64_60#Verify)的Verify段落。 Output File === 再來是要輸出檔案做後續的DRC、LVS、Post-Layout Simulation和Custom Simulation了,而輸出檔案的方法寫在[這篇](https://hackmd.io/@linda8832825/HJFMfi96R)。 :::danger 如果我有哪裡寫錯或是做不好的請告訴我 :woman-bowing: 完成之後小休一下回到前面進行[下一步](https://hackmd.io/dzfWsm7iQ6aeVqjeko-Hlg?both#DRC),你超棒的:facepunch: :::