劍哥系列--陪你精通數字IC FLOW 2-綜合I
作者:俞劍
今天我們的主題是綜合,進入主題之前先給大家鋪墊一下。
如今IC時代,集成電路設計我們分兩種:全定製電路設計和半定製電路設計。全定製電路設計我們都直接用SCHEMATIC來做線路設計,半定製電路設計我們從硬體描述語言出發。它們的差異在半定製利用了已有的標準單元庫。半定製設計我們又分非同步電路設計和同步電路設計,同步非同步的差異就在於時鐘。而同步設計又分RTL設計和LATCH-BASED設計,RTL以寄存器(Register,即各種對時鐘沿敏感的flip-flop)的方式描述,LATCH-BASED設計以鎖存器(對時鐘電平敏感)方式來描述,LATCH-BASED需要兩相時鐘,本質上就是把主從觸發器主從兩級拆開,中間插入邏輯,這樣可以使用很多設計技巧比如timing borrowing,從而優化時序。
今天的主題我們放在RTL DESIGN,其它的設計方式大家有機會再去體會,尤其是離RTL DESIGN最近的LATCH-BASED DESIGN,這種設計方式還是很有意思的,在時序性能上可以得到很大的收益。
在進入綜合的主題之前給大家再啰嗦下代碼風格。什麼是代碼風格?這個詞可能對很多剛入門的人會覺得很神秘,尤其IC的碼農還喜歡吼一聲coding style。代碼風格的存在其實就是約束設計人員能夠寫出代碼質量高的代碼,何為質量高?包括可綜合性,功能魯棒性,可驗證性,可維護性。可綜合性的意思首先是你的代碼要可以被綜合,其次是綜合出來的gate-level實現要和你預想的一致。下面是一些重要的coding style ,也是面試時候經常會問的:
- 阻塞(=)和非阻塞(<=),時序邏輯的always里我們用非阻塞,並發執行,組合邏輯的always裡面我們用阻塞,順序執行。
- 用always來寫組合邏輯時,切記把case和if-else寫完整了(寫完整是指case裡面要記得加default;if-else裡面有if就要有對應的else),否則綜合時會推導出LATCH(而不是你想要的組合邏輯),影響功能,而RTL模擬時case寫得不完整多半是不影響功能的。
- 用always來寫組合邏輯時敏感列表一定要完整,否則還是會綜合出LATCH。保險起見可以用always @(*)來寫,保證不會因為敏感列表不完整出現LATCH。
功能魯棒性也是一個重要課題,比如跨時鐘域該怎麼處理。一般來說從高頻到低頻,我們用展寬,低頻到高頻可以使用一些技巧直接采。跨時鐘域的問題往往在前模擬中看不出來,很多時候是在FPGA驗證時甚至晶元回來時才發現,有的晶元動得很好有的就有奇怪的問題,最後發現還是跨時鐘沒處理好導致魯棒(穩定)性問題。還有萬能的非同步FIFO,FIFO深度怎麼選,工作在空模式還是半滿模式,大課題有機會再展開。可驗證性包括怎麼來基於斷言寫一些design for verification。可維護性那就更大了去了,包括命名規則啊,注釋語言啊,都必須要注意。一個人寫的code如果像天書一樣,其他人都看不懂,甚至自己過一段時間也看不懂了,可維護性就很差了。
來到綜合,綜合其實本是個大概念,從抽象到形象,從高層到低層。現在我們有高級綜合或叫行為綜合(C to RTL,發展中,寫RTL的碼農需要著實關心下它的發展),RTL邏輯綜合(RTL to GATE LEVEL),版圖物理綜合(GATE LEVEL to LAYOUT)。今天我們講的是RTL綜合,綜合工具的功能即是讀入RTL代碼,第一步進行翻譯translation,即對RTL代碼進行推導至GTECH通用庫(獨立於工藝的)。推導包括寄存推導(是否帶非同步置位複位的),組合邏輯推導至not,and,nand,nor等邏輯,有時適應庫里有的資源,還可以推導RAM,乘法器,加法器(如FPGA的綜合)。第二步是工藝映射,將GTECH庫映射到相應工藝的標準單元庫上。第三步是優化,根據用戶的設定的時延,面積,線負載模型對電路網表做進一步的優化。
對於綜合流程而言我們該怎麼去理解呢。首先對綜合目標以性能、功耗、面積來排個序。性能我們用時序上能跑到多高的頻率來評判,它的瓶頸在關鍵路徑。功耗我們分靜態功耗(漏電)和動態功耗(由頻率、工作電壓、電路規模決定)。這三個目標參數我們可以採用一些技術再不影響某個參數的情況下去提高其它參數指標,某些情況下我們就得去權衡這三個參數。首先講個題外話,怎麼選工藝平台,工藝平台不是最先進的工藝平台對你來說就是最好的,而是應該從戰略、成本,需求角度去選擇最適合你的工藝平台。選中了工藝平台我們來談一下怎麼來選擇需要映射的標準單元庫,首先標準單元會以管子開啟閾值來分uLVT、LVT、SVT、HVT、uHVT,閾值越低速度越快,但靜態功耗(漏電)也越大。利用這些vt在綜合時可以使用上multi-vt的策略,比如時序上關鍵路徑才是瓶頸那麼我們關鍵路徑上可以使用低VT的,和其它路徑上可以使用高VT的,這樣在不降低性能的同時,我們降低了靜態功耗。同時,標準單元庫可以按照走線的TRACK來分7T、9T、12T。面積上7T<9T<12T,漏電功耗上7T<9T<12T,速度上7T<9T<12T。
選好了庫以後我們就要寫綜合約束了。綜合約束用來設定電路綜合的目標,它包括設計環境約束、時間約束和面積約束。設計環境約束指的是用來描述設計在工作時的溫度、電壓、驅動、負載等外部條件的一系列屬性。基本的環境設置內容包括工作條件、負載模型、系統介面驅動或扇出能力等設置。這些屬性約束在電路綜合時是必須的,如果用戶沒有進行顯示的說明,則綜合工具(例如常用的Design Compiler, 簡稱DC)在綜合的時候會採用默認值。時序約束內容包括定義時鐘、定義時鐘網路的時間約束和時序路徑時間約束設定,絕大部分的時序約束工作在介面上,以及非同步設計、多時鐘域的時間約束上。面積約束和時序約束之間是一對矛盾且需要折中的關係,DC綜合默認為時間約束比面積約束擁有更高的優先順序。DC優化時默認不進行面積優化,如果你關注於芯 片的面積,可以使用set_max_area命令設定面積的約束,使得DC完成時序約束之後繼續進行面積優化。
好了,本篇我們就寫到這裡吧,寫的時候計劃寫代碼風格、綜合、逆綜合的來寫。寫到這裡覺得這個課題還是老大的,微信文章不適合冗長敘述,我們下篇再對綜合進行下展開,再來聊下逆綜合,曾自己玩過的一個比較有意思的Project。
===
我們同時也開通了微信平台(微信號:silicon_talks),將會發布更多半導體行業深度解讀和福利,歡迎關注!
推薦閱讀:
※應用材料中國公司總裁張天豪:以材料工程創新為使命,助力半導體產業發展|摩爾領袖志
※中國必須建設自主存儲的原因|半導體行業觀察
※高端全靠進口,國產光晶元如何崛起?|半導體行業觀察
※有關雙攝像頭,2017年該關注什麼?|半導體行業觀察
※半導體20強原來是靠這些業務掙錢|半導體行業觀察