ASAP7nm PDK介紹

sasasatori發表於2024-05-28

ASAP7nm PDK介紹

概述

最近在調研後面教學用的PDK,考慮到需要給學生髮的PDK儘量繞開版權問題,因此Foundry PDK是不敢用的,大概把Synopsys家的SAED28_32nm,Cadence家的GPDK45nm,以及幾個開源PDK都大概看了一下,目前傾向於用ASAP7nm這個PDK。

來說一下主要的分析和考量,首先C家和S家給的PDK的都是可以跑一個比較完整的flow,尤其是S家的SAED28_32nm,非常全,除了STD Cell,還給了Memory Compiler,IO,PLL等,可以說無限一個Foundry的商用PDK了,C家的GPDK相對東西少一些,但是IO庫也給了(但不全,沒有GDS,是虛擬IO),沒有Memory Compiler,沒有PLL。而ASAP7nm裡是沒有Memory Compiler,沒有IO,沒有PLL的,處於一個有點缺斤少兩的狀態。但前兩者都有個致命的問題,主要是廠家為了推廣自家工具而推出的教學PDK,所以都和自家的工具有著極高的繫結,例如SAED的模擬PDK只有他們自家的Custom Compiler能開,而主流在用的Virtuoso套件開不了,signoff的DRC/LVS rule也是隻支援自家的IC Validator。而GPDK的DRC/LVS rule也是隻有自家的Assura能開,並不支援主流的Signoff工具Calibre(眾所周知這兩家的工具以前是有點故事的)。而ASAP在這方面貼心的多,基本上和常見的Foundry PDK的做法一致,給Virtuoso能開的模擬PDK,以及Calibre能開的DRC/LVS rule。儘管也許能想辦法倒騰一下SAED或者GPDK解決上述的工具支援問題,但我不太想在這方面太過折騰,總之還是教學用比較貼近實際開發時Flow來做吧。整體上想教的一個flow是VCS&Verdi(front-end)-> DC(synthesis)-> Innovus(backend)-> PT(timing signoff)-> Calibre(physical signoff)這樣的一套,不過得看教學可用的軟體license情況,到時候再說吧。回到ASAP的優勢上來,除了能夠用主流的flow,不必被框在某家的工具裡之外,還有一點是這是個7nm FinFET的PDK,眾所周知目前國內在先進工藝上被卡的是比較厲害的,雖然主要被卡的是製造那塊,但設計這塊目前教學FinFET工藝的普及度也很低,讓學生儘早接觸FinFET工藝對於國內半導體產業往先進製程發展的意義顯然更大一些,綜上所述,儘管ASAP有相比成熟商用PDK缺少的東西較多的缺點,但瑕不掩瑜,如果有條件的話,後續還可以嘗試自己搓點IO,Memory Compiler,PLL這些東西加到教學flow裡,使得整體上更加完善。

ASAP7是The OpenRoad Project的一部分,主要貢獻者來自亞利桑那大學 (The University of Arizona)和ARM,作者釋出的文章見:

  • L. T. Clark, V. Vashishtha, L. Shifren, A. Gujja, S. Sinha, B. Cline, C. Ramamurthy, and G. Yeric, “ASAP: A 7-nm finFET predictive process design kit,” Microelectronics Journal, vol. 53, pp. 105-115, Jul. 2016.

這裡有篇paper做了教育PDK的細緻對比,感興趣的可以自行閱讀。https://pages.hmc.edu/harris/research/asap7.pdf

然後回到ASAP7nm的PDK的內容分析上,ASAP7nm的檔案樹如下:

./ASAP_7nm/
├── asap7_pdk_r1p7
│   ├── asap7ssc7p5t_05
│   ├── calibre
│   ├── cdslib
│   ├── docs
│   ├── drc
│   ├── lvs
│   ├── models
│   └── pex
├── asap7sc6t_26
│   ├── CDL
│   ├── Datasheet
│   ├── GDS
│   ├── LEF
│   ├── LIB
│   ├── qrc
│   ├── techlef_misc
│   └── Verilog
├── asap7sc7p5t_28
│   ├── CDL
│   ├── Datasheet
│   ├── GDS
│   ├── LEF
│   ├── LIB
│   ├── license
│   ├── qrc
│   ├── techlef_misc
│   └── Verilog
└── asap7_sram_0p0
    ├── gds
    ├── generated
    └── verilog

其中asap7sc6t_26和asap7sc7pt5_28是數字標準單元庫,分別是6-track和7.5-track,asap7_pdk_r1p7是模擬PDK,asap7_sram_0p0是SRAM庫。我們按順序一個一個來看。

模擬PDK

模擬PDK需要走一個簡單的安裝流程,具體來說是,先去cdslib/setup下,編輯set_pdk_path.csh,把其中setenv PDK_DIR PDKdirectory裡的PDKdirectory改成自己的PDK安裝路徑,比如我這裡改成了:

setenv PDK_DIR /opt/PDKs/ASAP_7nm/asap7_pdk_r1p7

image

然後在asap7_pdk_r1p7目錄下用csh分別執行set_pdk_path.csh和setup_asap7.csh兩個指令碼就行了。

./cdslib/setup/set_pdk_path.csh
./cdslib/setup/setup_asap7.csh

安裝完成後目錄下會多出一點東西:

image

開Virtuoso,cdslib裡新增DEFINE asap7_TechLib PDK_DIR/cdslib/asap7_TechLib,把工藝庫加進來就行了,還有一個sample STD Cell的lib,用DEFINE asap7ssc7p5t PDK_DIR/asap7ssc7p5t_05來新增。

image

可以看到asap7_TechLib下給的cell其實挺少的,只有lvt,rvt,slvt和sram四種的nmos和pmos,閾值電壓從低到高。沒有一般PDK會給的電阻,電容,二極體那些,並且管子沒有layout view,這個是有點坑的事情。另外模擬用的模型只有hspice view沒有spectre view,這個也有點抽象。總體來說感覺不是一個可以比較完整走模擬flow的PDK,相比C家的GPDK還是差的比較多。不過有STD Cell和SRAM的情況下,走個數字flow問題不是太大。

而asap7ssc7p5t_05下面是幾個STD Cell,並給了layout:

image

以這個D觸發器的cel為例:

image

開啟版圖時可能會報display.drf沒有merge的問題,這時開的layout全是黃框,透過CIW->Tools->Display Resource Manager...開啟Display Resources Tool box,然後點Merge...,在From File中用Browse...選到asap7_pdk_r1p7下的display.drf,然後點Add,最後Destination DRF,在工程目錄下新建一個display.drf,然後Browse上去,點ok即可。

image

可以看到這個PDK裡面一共是1P9M,算上PAD層次一共10層金屬。

image

再看看inv這個cel,只開到gate層次,可以看到和schematic是對上的,nfin=3時,柵一共是三條,和平面電晶體還是挺不一樣的。

image

總體來說,這個模擬PDK對於我們做開發意義不大,主要的問題是缺少電阻,電容,二極體等必要器件,且沒有給layout和spectre模型,github issue上23年有人提問過相同的問題,但是作者好像也沒有正面回答。

image

但用來讀取layout,進行簡單的layout編輯,應該還是可以的。Design Rule文件可以在asap7_pdk_r1p7下找到,asap7_drm.pdf。DRC,LVS和RCX rule都在calibre資料夾下,但需要注意的是其無法直接從github上獲取,需要去官網上進行獲取。

SRAM庫

asap7_pdk_r1p7能說的暫時先這麼多,然後我們看一下asap7_sram_0p0這個SRAM庫。之前提過,ASAP7並沒有給memory compiler,即直接輸入引數然後輸出對應的memory的LEF,GDS,Verilog,LIB等file,這裡的SRAM庫實際上也不支援做到tapeout的程度,gds資料夾下是三個layout的示例,分別是32b,64b和128b(port width),而verilog資料夾下是一個示例用的64寬度,1024深度的SRAM行為模型。這兩個資料夾下的內容應該都沒法用到PR流程裡,主要是generated資料夾下,有LEF,LIB和verilog三個資料夾。裡面的內容分別是不同width和depth的SRAM的LEF,LIB和verilog,這裡的命名方式可以簡單分析一下,例如srambank_128x4x16,前兩者之積應該對應了SRAM的depth,而最後一個對應了SRAM的width,比如下面的程式碼裡,SRAM寬度是16,而深度是128*4=512。整個庫一共提供了36個Size的SRAM,寬度從16到80,步進為2,深度則分別為256,512和1024,因此最大的尺寸是80*1024/8=10KB,最小是16*256/8=0.5KB。

// synchronous SRAM verilog

module srambank_128x4x16_6t122 (
			    input clk
			  , input [8:0] ADDRESS          // address
			  , input [15:0] wd                // data to write
		       	  , input banksel                    // access enable
			  , input read                       // read enable
			  , input write                      // write enable
			  , output reg [15:0] dataout      // latched data output (only updated on read)
			    );

   reg [15:0] 				      mem [511:0];

   always @ (posedge(clk))
     begin                            // should have an error assert on read & write at once...
	if (write & banksel)
	  mem[ADDRESS] <= wd;
	else if (read & banksel)
	  dataout <= mem[ADDRESS];    // output is latched until next read, independent of writes
     end
endmodule // 

從行為級模型可以看出,就是很簡單的同步單口SRAM模型,只有一套讀寫口,以及片選,讀寫使能訊號和時鐘,介面還是非常簡單的,相比Foundry SRAM來說,沒有DFT的介面。

由於有LEF,LIB和Verilog,用這個SRAM庫走設計+綜合+PR流程是沒有太大的問題的,但是由於沒有GDS和CDL網表,實際上是沒法做DRC和LVS檢查的,是一個比較遺憾的問題。

後面可以寫一個簡單的指令碼,根據使用者輸入把對應尺寸的SRAM的LEF,LIB和verilog給篩出來,當做簡單的Memory Compiler使用。不過一般Foundry的Memory Compiler還會要一個Mux的引數來控制SRAM的物理長寬,現在ASAP7這裡還沒有這個功能。

import os
import shutil

def copy_files(width, depth, source_dirs):
    # 建立目標資料夾的名字
    dest_dir = f"sram_{width}x{depth}"
    
    # 計算 depth 引數除以 4 的值
    depth_divided_by_4 = int(depth) // 4

    # 初始化一個變數來跟蹤是否找到了任何檔案
    found_files = False

    # 遍歷原始檔夾
    for dir in source_dirs:
        for file_name in os.listdir(dir):
            # 檢查檔名是否包含 width 和 depth_divided_by_4
            if str(width) in file_name and str(depth_divided_by_4) in file_name:
                # 如果找到了匹配的檔案,建立對應的目標子資料夾
                if not found_files:
                    os.makedirs(dest_dir, exist_ok=True)
                    found_files = True
                
                # 建立對應的目標子資料夾
                dest_subdir = os.path.join(dest_dir, os.path.basename(dir))
                if not os.path.exists(dest_subdir):
                    os.makedirs(dest_subdir)
                
                # 複製檔案到目標子資料夾
                shutil.copy(os.path.join(dir, file_name), dest_subdir)

    # 如果沒有找到任何檔案,列印報錯資訊
    if not found_files:
        print("錯誤:沒有找到任何匹配的檔案。")

# 使用者輸入
width = input("請輸入 width: ")
depth = input("請輸入 depth: ")

# 原始檔夾列表
source_dirs = ["../generated/LEF", "../generated/LIB", "../generated/verilog"]

# 呼叫函式
copy_files(width, depth, source_dirs)

用AI非常快速的搓了一個,這個指令碼會從 ../generated/LEF../generated/LIB../generated/verilog 這三個目錄中查詢檔名匹配使用者輸入的 widthdepth 引數的結果的檔案,然後將這些檔案複製到名為 sram_{width}x{depth} 的新資料夾中的對應子資料夾,其中 {width}{depth} 是使用者輸入的引數。如果沒有找到任何匹配的檔案,指令碼會列印報錯資訊,並且不會建立目標資料夾。

建立一個新的asap_mc資料夾在asap7_sram_0p0目錄下,把asap_mc.py這個指令碼放在asap_mc下,用python執行指令碼,對應輸入引數即可,例如:

sasasatori@sasasatori-System-Product-Name:/opt/PDKs/ASAP_7nm/asap7_sram_0p0/asap_mc$ python ./asap_mc.py 
請輸入 width: 20
請輸入 depth: 256

會產生一個sram_20x256的資料夾,下面有LEF,LIB,verilog三個子資料夾,裡面是從generated資料夾下對應查詢到的檔案。

image

如果長度和寬度輸入非法,那麼就會報找不到報錯,不會產生任何檔案。

雖然generated沒有給GDS,但是這裡我們可以讀取一個asap7_sram_0p0/gds下的srambank_32b.gds,新建一個倉庫後stream in進來,可以看到sram bank的layout,上下是SRAM陣列,中間是decode的logic。

image

單個SRAM Cell的尺寸只有0.162um*0.35um=0.057um^2,可以說很小了。

image

與之相對的,一個t28的SRAM Cell的尺寸是0.56um*0.74um=0.414um^2,是ASAP7的7.26倍。

image

標準單元庫

接下來看標準單元庫的內容,7p5t版本和6t版本區別不大,所以我這裡以7p5t為例,來對內容做一個主要的分析。從目錄來看是一個從前端到後端的比較完整的庫,並且庫大小也是比較大,將近6個G。

其中CDL是網表。Datasheet下是標準單元的資訊文件。GDS是版圖檔案。LEF是標準單元的Frame,Innovus可以直接吃,但沒有S家工具可以直接吃的Milkyway或者NDM。LIB分成CCS和NLDM兩個,CCS是相比NLDM更精確的延遲模型,詳見:https://blog.csdn.net/u011075954/article/details/121229023。

license下是庫的license宣告,qrc下是C家工具用的寄生引數檔案,QRC是C家工具,StarRC是S家工具,不過都可以抽出SPEF後給PT用。techlef_misc下是工藝lef檔案,給Innovus吃的,還放了兩個示例指令碼。Verilog下是標準單元的verilog網表。

image

image

從LIB/NLDM資料夾下可以看到分了SS,TT,FF三個Corner,這個庫做Multi-Corner是沒問題的。

然後每類標準單元給了SLVT,LVT,RVT,SRAM四種器件的型別,這個和我們之前在PDK裡面看到的也是一致的,分別是超低閾值,低閾值,正常閾值和SRAM閾值四種器件(這裡SRAM閾值器件可以當成HVT器件來看待?),看論文裡SLVT閾值電壓在0.05V左右,LVT在0.125V左右,RVT在0.2V左右,SRAM的NMOS在0.275V左右,PMOS在0.225V左右。把Corner和器件型別排列組合一下,每類器件就有3*4=12種了。

image

在此基礎上,具體提供的Cell包括了基本邏輯閘的SIMPLE Cells,時序器件DFF的SEQ Cells,反相器BUFF的INVBUF Cells以及與或門和或與門的AO Cells以及OA Cells,總共5類,算是比較齊全的標準單元庫了。

值得一提的是,7p5t下的Verilog檔案裡只有TT Corner,6t下的有SS,TT,FF三個Corner,但不同Corner的檔案內容似乎無差異。此外6t的庫裡多出了一類反相器Cell,CKINVDC Cells,推測是給時鐘用的。

結語

至此算是完成了對ASAP7這個開源PDK的一個較為全面的分析,後續會嘗試在這個PDK的基礎上去run一個設計用於教學實驗,整個ASAP7除了calibre的rule外均可以從github上獲取,考慮到國內訪問github可能存在的網路不便的問題,我在百度網盤上也對整個庫做了一下備份,有需要者可告明來意,我會share連結。

參考資料

PDK:The-OpenROAD-Project/asap7 (github.com)

asap7 reference design:Centre-for-Hardware-Security/asap7_reference_design: reference block design for the ASAP7nm library in Cadence Innovus (github.com)

介紹檔案:ASAP7: A 7-nm finFET predictive process design kit - ScienceDirect

官網:Welcome to the Predictive PDK (ASAP) (asu.edu)