一、庫文件的設置
運行DC時需要用到的庫文件有:目標庫(target library)、鏈接庫(link library)、符號庫(symbol library)、算術運算庫(synthetic library)。
1、目標庫
目標庫是綜合后電路網表最終要映射到的庫。目標庫一般由晶圓廠(Foundary)提供,常為.db的格式。
目標庫包含各個門級單元的行為、引腳、面積、時序信息、功耗方面的參數等信息。DC在綜合時就是根據目標庫給出的單元電路的時序信息來計算延遲,并根據各個單元的延時、面積和驅動能力的不同選擇合適的單元來優化電路。下圖是工藝庫中一個cell的信息
2、鏈接庫
鏈接庫設置模塊或單元電路的引用。對于所有DC用到的庫,我們需要在鏈接庫中指定,其中包括要用到的IP。
目標庫更多的指標準單元,鏈接庫更多的指IP,如RAM,IO等
在鏈接庫的設置中必須添加“ * ”,表示DC在引用實例化電路或者單元電路時首先搜索已經調進DC memory的模塊和單元電路;否則,可能會出現無法匹配的警告信息。同時,在設置鏈接庫的時候要注意設置search_path,命令為:lappend search_path {"path name"}。則整個流程為:路徑面前加*號表示開辟一塊單獨的內存空間給DC自己使用,然后先搜尋內存中已有的庫,然后再搜尋變量link_library指定的其他庫。DC搜尋的庫為search_path指定的目錄(比如說之前讀入設計時讀入了庫a,庫a存到內存里;這時DC在進行綜合的時候,發現缺少某個東西,于是就先從庫a里面找,找不到時就會從列表里面的變量路徑中找)。
如果需要將已有的設計從工藝A轉到工藝B時,可以將當前的單元綜合庫A設為link_library,而將單元綜合庫B設為target_library,重新映射一下就可以了。
3、符號庫
符號庫是定義了單元電路顯示的schematic(原理圖)的庫。使用圖形界面查看、分析電路原理圖時需要設置。假如沒有設置,DC會用默認的符號庫取代。
4、算數運算庫
這個庫一般是synopsys的庫:DesignWare library 和標準單元庫,這里指定的就是庫的名字了。
DesignWare library 這個庫是synopsys的IP庫:當使用到synopsys公司的IP核的時候比如使用了該公司的乘法器IP,那么就要定義這個綜合庫;此外,當需要用到這個庫的一些比較高端的IP核的時候,是需要相關的證書(license)的。例如當你在代碼中用來“*”或者“+”這操作,那么DC會通過這個你指定的綜合庫進行映射或者優化這些操作符。
二、工藝庫
一般來說,運行DC時需要用到的庫文件有:目標庫(target library)、鏈接庫(link library)、符號庫(symbol library)、算術運算庫(synthetic library)。目標庫和鏈接庫合稱為工藝庫。絕大多數的數字設計流程都是基于標準單元的半定制設計流程。標準單元庫包含了反相器、緩沖、與非、或非、與或非、鎖存器、觸發器等等邏輯單元綜合模型的物理信息,標準單元是完成通用功能的邏輯,具有同等的高度(寬度可以不同),這樣方便了數字后端的自動布局布線。
1、概述
一個ASIC綜合庫包括如下信息:
- 一系列單元(包括單元的引腳)。
- 每個單元的面積(在深亞微米中,一般用平方微米表示,在亞微米工藝下,一般用門來稱呼,至于具體的單位,可以咨詢半導體制造商)。
- 每個輸出引腳的邏輯功能。
- 每個輸入到輸出的傳遞延時,輸出到輸出的傳遞延時;inout到輸出的傳遞延時。
2、內容與結構
Synopsys的工藝庫是一個.lib文件,經過LC編譯后,產生.db文件。工藝庫文件主要包括如下信息:
- 單元(cell)(的信息):(主要有)功能、時間(包括時序器件的約束,如建立和保持)、面積(面積的單位不在里面定義,可按照規律理解,一般詢問半導體廠商)、功耗、測試等。
- 連線負載模型(wire load models):電阻、電容、面積。
- 工作環境/條件(Operating conditions):制程(process)(電壓和溫度的比例因數k,表示不同的環境之間,各參數縮放的比例)
- 設計規則約束(Design ):最大最小電容、最大最小轉換時間、最大最小扇出。
工藝庫的結構如下所示:
? ? ? ? ? ? ? ??
文本描述如下所示:
??
??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
??
(1)首先是庫的屬性的描述:
? ? ? 通用屬性描述(general attribute):主要是工藝類型、延遲模型、替代交換方式、庫特征、總線命名方式等信息
- 工藝類型:這個庫沒有給出,主要用來說明這個庫是CMOS工藝還是FPGA工藝。默認是CMOS工藝。
- 延遲模型:指明在計算延遲時用的那個模型,主要有generic_cmos(默認值)、table-lookup(非線性模型)、piecewise-cmos(optional)、dcm(Delay Calculation Module)、polynomial。
- 替代交換方式:這里選的是匹配封裝的方式。具體的信息可以查閱其他治療或者詢問半導體廠商。
- 庫特征:報告延遲計算,也就是這個庫具有延遲計算的特征。
- 總線命名方式:定義庫中總線命名規則。例如:bus_naming_style:"Bus%spin%d";這個庫沒有進行總線規則的命名。
? ? 庫的文檔資料屬性(document attribute):主要是庫的版本、庫的日期、還有注釋。例如:
- 用庫報告命令report_lib可顯示日期例如:Date:"Wed Jun 22 12:31:54 2005"。
- 修正版屬性定義庫的版本號碼,例如Revision:1.3;
- 注釋屬性用于報告report_lib命令所顯示的信息,如版權或其他產品信息。例如:Comment:"Copyright (c) 2005 Artisan Components, Inc. ?All Rights Reserved.”
? ??定義單位屬性(unit attribute):
? ?Design Compiler工具本身是沒有單位的。然而在建立工藝庫和產生報告時,必須要有單位。庫中有6個庫級屬性定義單位:time_ unit(時間單位)、voltage_unit(電壓單位)、current_ ?unit(電流單位)、pulling_resistance_unit(上/下拉電阻單位)、capacitive_load_unit(電容負載單位)、leakage_power_unit(漏電功耗單位)。單位屬性確定測量的單位,例如可在庫中用毫微秒(nanoseconds)或皮法拉(picofar-ads)作為時間和電容負載的單位。
(2)接下來是環境描述:
主要包括操作條件(operation conditions)、臨界條件定義(threshold definitions)、默認的一些環境屬性(default attributes)、一些(時序、功耗)模型(templates)、比例縮放因子(k-factors)、I/O pad屬性(pad attributes)、線負載模型(wire-loads)。
? ? 操作條件(operation conditions):
? ? ?在工藝庫中,用操作條件設置了制程(process)、溫度(temperature)、電壓(voltage)與RC樹模型(tree_type)。
在綜合和靜態時序分析時,DC要用到這些信息來計算電路的延遲,而庫中的這組操作條件為基礎(也就是nom_xxxx)操作條件。一個工藝庫只有這么一組基礎的操作條件,如果要使用不同的操作條件,則需要借助K參數了(見后面)。制程、溫度、電壓這些很好理解,下面主要說一下這個RC樹模型(tree_type)。
tree-type屬性定義了布局之前延時的計算方式。此外,線負載模型是根據連線的扇出來估算連線的RC寄生參數的,RC如何分配就是根據這個tree-type屬性來的。
連線延時(從驅動引腳的狀態變化到每個接受單元輸入引腳的狀態變化,線負載模型設每個分枝的延遲是一樣的。)的一個示例如下圖所示:
?
在這個簡單的電路中,BUF1的輸出驅動兩個單元:BUF2與BUF3。在物理上,這是兩根連線。而在網表中,兩根連線用一個net來表示。 ???
在布局前,假設這兩根線有相同的寄生電阻與寄生電容,即Cwire1-Cwire2=R1-R2?。
假設我們想了解從BUF1的輸出到BUF2的輸入端的延時。這個延時實際上是給連線及BUF2的輸入引腳負載進行充、放電所消耗的時間。
????如何計算這個延時呢?tree-type就是為此而定義的。Tree-type有三種取值,這個延時就有三種計算模型。
A:當它取值為worst-case-tree時,連線的寄生參數采用集總模型,即用Cwire*(Cwire 1+Cwire2)這個乘積表示連線的等效電容,Rwire(R1+R2)表示連線的等效電阻。C1表示BUF1輸入引腳的等效電容。C2表示BUF2輸入引腳的等效電容。從BUF 1到BUF2的延時計算模型下圖所示:
?
在這種模型中,net本身的延遲為Rwire*Cwire?.
B:當tree-type取值為best-case-tree時,計算延時的RC模型如下圖所示:
?
在這種模型中,Rwire為0,因此net本身的延時為0
C:當tree-type取值為balanced-tree時,計算延時的RC模型如下圖所示:
?
在這種模型中,net的延時為Rwire*Cwire/(N^2)。這里N表示負載數目,本例中取值為2.
? ? 臨界條件定義(threshold definitions):
? ? ? 主要是定義一些極限值,比如時鐘抖動的最大最小值、輸出輸出的上升下降沿的最大最小值等等信息,如下圖所示:
? ??默認的一些環境屬性(default attributes):
? ? ?主要是默認漏電流功耗密度、標準單元的漏電流功耗、扇出負載最大值、輸出引腳的電容、IO類型的端口電容、輸入引腳的電容、最大轉換時間。
? ? 一些(時序、功耗)模型(templates):
? ? ? 都是寫查找表模型,主要是功耗(比如輸入轉移時間的功耗)、時序(比如輸入線轉換的延時、建立時間和保持時間的延時)等等,根據不同的操作環境,進行查表進行選擇對應的參數。
? ??比例縮放因子(k-factors):
? ? ? ?由于一般庫中只有單元“nom_xxx”的值,為了計算不同的制程、電壓和溫度下單元的延遲(或者說是計算不同的操作條件),庫中提供了比例縮放因子
I/Opad屬性(pad attributes):
? ? ? 主要就是定義I/O引腳的電平屬性,告訴你輸入是COMS還是TTL,什么時候達到高電平、什么時候是低電平。
? ??線負載模型(wire-loads):
? 工藝庫的線負載模型如下所示:
???
? DC采用wire-load模型在布局前預估連線的延時。通常,在工藝庫中,根據不同的芯片面積給出了幾種模型(上圖所示)。這些模型定義了電容、電阻與面積因子。此外,導線負載模型還設置了slope與fanout_length,fanout-length設置了與扇出數相關的導線的長度。
有時候,除了扇出與長度,該屬性還包括其他參數的值(這個工藝庫沒有),例如average_capacitance、standard_deviation與number_of_nets,在DC產生導線負載模型時會自動寫出這些值。對于超過fanout-length屬性的節點,可將該導線分成斜率不同的幾段,以確定它的值。
(3)工藝庫剩下的全是標準單元(cell)的描述:如反相器、觸發器、與非門、或非門的描述等:
? ? 標準單元內容概述
綜合庫中的每個單元都包括一系列的屬性,以描述功能、時序與其他的信息。 在單元的引腳描述中,包含了如下內容:輸入引腳的fanout-load屬性、輸出引腳的max_fanout屬性、輸入或輸出引腳的max_transition屬性、輸出或者inout引腳的max_capacitance屬性。利用這些描述,可以對設計進行DRC(設計規則檢查)。如果某個單元的輸出最大只能接0.2pF的負載,但在實際綜合的網表中卻連接了0.3pF的負載,這時候綜合工具就會報出DRC錯誤。
通常,fanout_load與max_fanout一起使用max_transition與max_capacitance一起使用。 如果一個節點的扇出為4,它驅動3個與非門,每個與非門的fanout-load是2,則這三個與非門無法被驅動(因為3*2>4)。
max_transition通常用于單元的輸入引腳,max_capacitance一般用于單元的輸出引腳。如果任何節點的transition時間大于引腳的max_transition值,則該節點不能連接。如果發生違例,則DC用一個具有更大max_capacitance值的單元來取代驅動單元。
在對輸出引腳的描述中,給出了該引腳的功能定義,以及與輸入弓}腳相關的延時。輸入引腳定義了它的引腳電容與方向。這個電容值不能與max_capacitance值相混。DC利用輸入引腳的電容值進行延時計算,而max_capacitance僅用來進行設計規則檢查。
對于時序元件中的時鐘引腳,專門用clock類型進行說明,如下所示:
?
????注:許多設計者都會抱怨工藝庫中對單元的DRC屬性設置不當,這是由于庫的能力是有限的所致。對于一個設計,綜合庫的DRC設置可能很合適,而對于另一個設計就可能不太合適。這時候,需要設計者對綜合庫進行“剪裁”。當然,這種“剪裁”必須比庫中的定義更為嚴格。如將一個庫中buffd0的Z端的max_fanout由4.0改為2.0的命令:
? ? dc_shell> set_addribute ?find(pin, ex25/BUFFDO/Z) ?max_fanout ?2.0
上述的命令可以寫在synopsys-dc.setup文件中。
三、標準單元的內容
1、單元時序信息
在一個單元的綜合庫中,最核心的是對時序和功耗的描述。單元時序模型旨在為設計環境中的單元的各種實例提供精確的時序,模擬單元操作的實際情況。
一個單元的延時跟以下因素有關:器件內部固有的延時、輸入轉換時間(也稱為輸入上升/下降時間)、負載(驅動的負載及連線)、溫度、電壓、制程變化。前三個因素是由電路本身的特性所決定的,后三個因素是由環境決定的。在實際電路中,輸入轉換時間、負載與連接單元的電路有關,所以我們只需要列出在不同的輸入轉換時間、不同的負載下單元的延時就可以了(這個延時包括器件的內部固有延時)。在確定了之后,我們就可以根據時序模型來確定單元延時了。通常來說,標準單元的時序模型有線性模型和非線性模型兩類,Synopsys支持的延時模型包括:CMOS通用延時模型、CMOS分段線性延時模型和CMOS非線性延時查找表模型(Nonlinear Delay Model)。前兩種模型精度較差,已經被淘汰,主要用非線性延時模型。
?非線性延時模型也稱為二維非線性延時模型。在該模型中,用二維列表的形式給出單元在特定的輸入轉換時間、輸出負載下的延遲(包括單元的延時和單元的輸出轉換時間)。單元的輸出轉換時間又成為其驅動的下級單元的輸入轉換時間。庫中每個單元有兩個NLDM表。對于在范圍之內的點,可以用插值的方法得到;對于在范圍之外的點,可以用外推的方法得到。線性插值如下圖所示:
?
計算延時的公式為:
????????????????Z=A+B*L+C*S+D*L*S? ? ? ?其中,Z代表單元的延時,A, B, C, D是系數,L為輸出節點電容,S為輸入轉換時間。
2、單元功耗信息
功耗主要分為兩部分:靜態功耗和動態功耗。 其中靜態功耗是指泄漏功耗,動態功耗包括翻轉時的短路功耗及節點電容的充放電所消耗的功耗。節點電容充放電消耗的功耗僅跟VDD、節點翻轉率及節點電容有關。其中,VDD和節點電容是固定的,節點翻轉率跟輸入激勵有關,需要通過仿真激勵進行計算。因此,在綜合庫中,不列出充放電功耗。而短路功耗跟輸入轉換時間和節點電容有關,一般以查找表的形式給出(在綜合庫中,用internal_power表示)。