---
# System prepended metadata

title: EDA - Logic Synthesis
tags: ['#IC_Design']

---

Logic Synthisis on EDA cloud
===

這篇將說明在EDA cloud上是如何執行合成，會將所有commend集合在tcl檔一次執行，若要看Design Compiler的GUI介面如何使用的話可看[這篇](https://hackmd.io/@linda8832825/SkrgdRId2)。

在合成階段需要考慮multi-Vt的使用與否，我在合成階段做了兩個版本，分別是lvt+hvt與單獨lvt，若單使用lvt可以有更高的工作頻率但也有更高的功耗，而只使用hvt則相反，工作頻率與功耗皆較低，multi-Vt可以有最好的表現。

以下會介紹需要準備的檔案與執行方式以及結果的除錯，並且會將準備的檔案分成"multi-Vt"與"lvt"做介紹。

db file
---
在下一步要將使用到的db檔加入setup檔，若有使用到SRAM需先產db檔，方法可參照[這篇](https://hackmd.io/@linda8832825/H1l8PHS1C#SYN-Level)。


.synopsys_dc.setup file
---

這個檔案稱之為setup檔，用來設置環境變數、定義資料庫路徑和設計工具參數等等，之後的階段也都會使用到這個檔案。

* multi-Vt
```=setup=
set company "CIC"
set designer "Student"
set search_path "/cad/CBDK/CBDK_TN40G_Arm/CBDK_TSMC40_core_Arm_v2.0/CIC/SynopsysDC/db/sc9_base_hvt/ \
                 /cad/CBDK/CBDK_TN40G_Arm/CBDK_TSMC40_core_Arm_v2.0/CIC/SynopsysDC/db/sc9_base_lvt/ \
                 /project/dr390/pc19/UuT/MEM/112 \
                 /project/dr390/pc19/UuT/MEM/128 $search_path "

set target_library "sc9_cln40g_base_hvt_ffg_typical_min_0p99v_125c.db \
                    sc9_cln40g_base_hvt_ff_typical_min_0p99v_125c.db  \
                    sc9_cln40g_base_hvt_ff_typical_min_0p99v_m40c.db  \
                    sc9_cln40g_base_hvt_ss_typical_max_0p81v_125c.db  \
                    sc9_cln40g_base_hvt_ss_typical_max_0p81v_m40c.db  \
                    sc9_cln40g_base_hvt_tt_typical_max_0p90v_25c.db   \
                    sc9_cln40g_base_lvt_ffg_typical_min_0p99v_125c.db \
                    sc9_cln40g_base_lvt_ff_typical_min_0p99v_125c.db  \
                    sc9_cln40g_base_lvt_ff_typical_min_0p99v_m40c.db  \
                    sc9_cln40g_base_lvt_ss_typical_max_0p81v_125c.db  \
                    sc9_cln40g_base_lvt_ss_typical_max_0p81v_m40c.db  \
                    sc9_cln40g_base_lvt_tt_typical_max_0p90v_25c.db   \
                    sram_112_ffg.db \
                    sram_112_ss.db  \
                    sram_128_ffg.db \
                    sram_128_ss.db"

set link_library "* $target_library dw_foundation.sldb"

set synthetic_library "dw_foundation.sldb"

set verilogout_no_tri true
set hdlin_translate_off_skip_text "TRUE"
set sh_enable_line_editing turn
history keep 100
alias h history
```

* lvt
```=setup=
set company "CIC"
set designer "Student"
set search_path "/cad/CBDK/CBDK_TN40G_Arm/CBDK_TSMC40_core_Arm_v2.0/CIC/SynopsysDC/db/sc9_base_lvt/ \
                 /project/dr390/pc19/UuT/MEM/112 \
                 /project/dr390/pc19/UuT/MEM/128 $search_path "

set target_library "sc9_cln40g_base_lvt_ffg_typical_min_0p99v_125c.db \
                    sc9_cln40g_base_lvt_ff_typical_min_0p99v_125c.db  \
                    sc9_cln40g_base_lvt_ff_typical_min_0p99v_m40c.db  \
                    sc9_cln40g_base_lvt_ss_typical_max_0p81v_125c.db  \
                    sc9_cln40g_base_lvt_ss_typical_max_0p81v_m40c.db  \
                    sc9_cln40g_base_lvt_tt_typical_max_0p90v_25c.db   \
                    sram_112_ffg.db \
                    sram_112_ss.db  \
                    sram_128_ffg.db \
                    sram_128_ss.db"

set link_library "* $target_library dw_foundation.sldb"

set synthetic_library "dw_foundation.sldb"


set verilogout_no_tri true
set hdlin_translate_off_skip_text "TRUE"
set sh_enable_line_editing turn
history keep 100
alias h history
```

DC_script.tcl file
---

* multi-Vt
下圖17行為fanout的邏輯閘數超過20個就拆開做訊號加強。
下圖的23、24行為input delay與output delay，保留的時間很短不太好，若晶片要實際下線需要再多保留多一點。
![image](https://hackmd.io/_uploads/HyzYrTWsA.png)


* lvt
lvt這版因為後續沒有使用他做apr，所以不會遇到timing問題，因此input delay與output delay給很緊。
![image](https://hackmd.io/_uploads/BkHdr6ZjR.png)


run.tcl file
---

兩種vt設計都是使用相同的執行指令
`Rdc_shell -f DC_script.tcl | tee syn.log`



syn.log file
---

在這個檔案裡包含所有DC_script.tcl從第一行執行到最後一行的經過，需要檢查library有無正確抓到、有無latch、有無Constraints下完後沒有回覆"1"的情況發生，若有則須修改完畢，然後主要會產生四個檔案。

* .ddc file : 後續須對合成後檔案做處理可以使用這個檔案開啟，就不用重新合成，像是後續繪製area breakdown就可以直接用dc開這個檔案
* .sdc file : 合成中所有下的Constraints會存在這裡
* .v file : 合成後的.v檔，用來做下一步的DFT或是APR
* .sdf file : DC產生的各個gate的delay time，而net的delay是在apr才會產生，為下一步驟Gate-level Simulation所需使用的檔案
* area.log : 主要用來看total cell area
* timing.log : 若最後的slack為負則須放寬clock period或是修改RTL

timing.log file
---

如下圖path共分為四種:
* in2reg  (Path1) : input to register
* reg2reg (Path2) : register to register
* reg2out (Path3) : register to output
* in2out  (Path4) : input to output (不可以有這條，會在APR有很大的timing violation)
![](https://i.imgur.com/z0dItdu.png)

path1、path3大部分都是合成下的constraints，而path4是不能有的狀況，代表這個訊號穿越晶片卻沒做任何處理，會嚴重拖慢晶片的運作速度，所以剩下path2是可做修改的。

Path 1、2、3都能在後續的APR ECO掉但若能在這階段多修一點就修掉，你的晶片就能跑得更快。

timing.log是在合成完後第一個要檢查的檔案，slack必須為正值，可以看下圖這個範例，第一條黃線以上是critical path，可以針對這條路徑中的path2做改善，例如拆成兩個clk做之類的。

![](https://hackmd.io/_uploads/H16kRxvd2.png)
    
area.log file
---

這個檔案只需要看其中的Total cell area

* Total cell area = Combination(組合) area + Noncombinational(循序) area + Macro area
* Macro/Black Box area : SRAM的面積
* net interconnect area : 線的面積不要相信
![image](https://hackmd.io/_uploads/BySGWkfjC.png)


area breakdown
---

這步驟是為了畫各個子電路或是SRAM在整體電路中的比例，如果前面步驟的dv已經關掉的話可以再重開DC後匯入ddc檔，輸入以下指令:
`
report_area -hierarchy > area_sub.log
`

這行指令是為了看到更底層的子電路的面積，如下圖可以看到三個黃線的子電路的面積，將所有子電路以及SRAM的面積找出後可以畫圓餅圖。
![image](https://hackmd.io/_uploads/BJR-tgXiR.png)

畫出來的圓餅圖
![image](https://hackmd.io/_uploads/r1jw8-lA0.png)

---

:::danger
如果我有哪裡寫錯或是做不好的請告訴我 :woman-bowing: 

完成之後小休一下回到前面進行[下一步](https://hackmd.io/dzfWsm7iQ6aeVqjeko-Hlg?both#Gate-Level-Simulation)，你超棒的:facepunch:
:::
