prog_linenum

2021年6月22日 星期二

LVL Shell Script 分享

寫shell script必須要先了解LVL的語法內容才有辦法,知道應該要如何來達到我們要的效果,所以必須先看上一篇LVL command file 範例。

廢話不多說,以下先分享shell script範例,再做解說。

LVL Shell Script Example.

#! /bin/bash
##script name: genLVL.sh
##description:
##    This script is used to make LVL rule file.
##Author: ron.huang
##History:
##    2021/06/22 ron.huang release

##usage:
##    1.Please modify the layer map to the following format first.
##    2.Modify customized region
##    3.Run script ex.    ./genLVL.sh

##customized region
LAYERMAP=layermap
LVLFILE=lvl.cal

## Do not modify below
getLayerNames=$(cat $LAYERMAP | awk '{print $1}');
getPurpuseNames=$(cat $LAYERMAP | awk '{print $2}');
getLayerNumbers=$(cat $LAYERMAP | awk '{print $3}');
getDatatypeNumbers=$(cat $LAYERMAP | awk '{print $4}');

seq=1
for layerName in $getLayerNames;
do
    layerNames[$seq]=$layerName
    ((seq++))
done

seq=1
for purpuseName in $getPurpuseNames;
do
    purpuseNames[$seq]=$purpuseName
    ((seq++))
done

seq=1
for layerNumber in $getLayerNumbers;
do
    layerNumbers[$seq]=$layerNumber
    ((seq++))
done

seq=1
for datatypeNumber in $getDatatypeNumbers;
do
    datatypeNumbers[$seq]=$datatypeNumber
    ((seq++))
done

echo "//$LVLFILE" > $LVLFILE
echo '//description: Compare the differences between the two gds.' >> $LVLFILE
echo "//use genLVL.sh to generate at $(date '+%Y/%m/%d %H:%M')" >> $LVLFILE
echo "//History:" >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//SPECIFY FIRST DATABASE' >> $LVLFILE
echo 'LAYOUT PRIMARY "TOP_CELL_NAME"' >> $LVLFILE
echo 'LAYOUT PATH "top.gds"' >> $LVLFILE
echo 'LAYOUT SYSTEM GDSII' >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//SPECIFY SECOND DATABASE' >> $LVLFILE
echo 'LAYOUT PRIMARY2 "TOP_CELL_NAME2"' >> $LVLFILE
echo 'LAYOUT PATH2 "top2.gds"' >> $LVLFILE
echo 'LAYOUT SYSTEM2 GDSII' >> $LVLFILE
echo 'LAYOUT BUMP2 1000    // add 1000 to layer number for the second database' >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//OUTPUT REPORT' >> $LVLFILE
echo 'DRC RESULTS DATABASE "top.lvl.db" ASCII' >> $LVLFILE
echo 'DRC SUMMARY REPORT "top.lvl.rep"' >> $LVLFILE
echo ' ' >> $LVLFILE
echo 'DRC MAXIMUM RESULTS ALL' >> $LVLFILE
echo 'PRECISION        1000' >> $LVLFILE
echo 'RESOLUTION    1' >> $LVLFILE
echo ' ' >> $LVLFILE
echo '//LAYER COMPARE' >> $LVLFILE

for ((i=1;i<=${#layerNames[@]};i++));
do
    LD=$((i+2000))
    echo "LAYER ${layerNames[$i]}_${purpuseNames[$i]}     $LD LAYER MAP ${layerNumbers[$i]} DATATYPE ${datatypeNumbers[$i]} $LD" >> $LVLFILE
    LD2=$((LD+1000))
    LN2=$((${layerNumbers[$i]}+1000))
    echo "LAYER ${layerNames[$i]}_${purpuseNames[$i]}_Sec $LD2 LAYER MAP $LN2 DATATYPE ${datatypeNumbers[$i]} $LD2" >> $LVLFILE
    echo "DIFF.${layerNames[$i]}.${purpuseNames[$i]} {@ ${layerNames[$i]}:${purpuseNames[$i]}[${layerNumbers[$i]}:${datatypeNumbers[$i]}] is different from the ${layerNames[$i]}:${purpuseNames[$i]}[${layerNumbers[$i]}:${datatypeNumbers[$i]}] of another GDS" >> $LVLFILE
    echo "${layerNames[$i]}_${purpuseNames[$i]} XOR ${layerNames[$i]}_${purpuseNames[$i]}_Sec" >> $LVLFILE
    echo "}" >> $LVLFILE
done

以下為範例詳解













LVL command file 範例

LVL(layout versus layout)
顧名思義就是在做兩個layout之間的比對,為什麼會需要做這個比對的原因,舉個例來說,如果今天光罩已經好一版,但這後續為了解決某些問題,而導致需要修改光罩,那就會需要來做LVL,為了確保我們沒有修改的部分都與原本的layout一致。

LVL Example.

<code>
//lvl.cal

//SPECIFY FIRST DATABASE
LAYOUT PRIMARY "TOP_CELL_NAME"
LAYOUT PATH "top.gds"
LAYOUT SYSTEM GDSII

//SPECIFY SECOND DATABASE
LAYOUT PRIMARY2 "TOP_CELL_NAME2"
LAYOUT PATH2 "top2.gds"
LAYOUT SYSTEM2 GDSII
LAYOUT BUMP2 1000    // add 1000 to layer number for the second database

//OUTPUT REPORT
DRC RESULTS DATABASE "top.lvl.db" ASCII
DRC SUMMARY REPORT "top.lvl.rep"

DRC MAXIMUM RESULTS ALL
PRECISION        1000
RESOLUTION    1

//LAYER COMPARE
LAYER OD                1001    LAYER MAP           2    DATATYPE    0    1001
LAYER OD_Sec        2001    LAYER MAP    1002    DATATYPE    0    2001
DIFF.OD {@ OD is different from the OD of another GDS
OD XOR OD_Sec
}
</code>

以下為範例詳解


//lvl.cal
//部分為註解,開頭先打上rule file名稱,取.cal為副檔名是因為使用的EDA tool 為Calibre

//SPECIFY FIRST DATABASE
LAYOUT PRIMARY "TOP_CELL_NAME"
LAYOUT PATH "top.gds"
LAYOUT SYSTEM GDSII
指定第一個layout要驗證的
Top Cell Name
GDS的位置
設定讀取檔案格式為GDSII

//SPECIFY FIRST DATABASE
LAYOUT PRIMARY2 "TOP_CELL_NAME2"
LAYOUT PATH2 "top2.gds"
LAYOUT SYSTEM2 GDSII
LAYOUT BUMP2 1000    // add 1000 to layer number for the second database
指定第二個layout要驗證的
Top Cell Name
GDS的位置
設定讀取檔案格式為GDSII
並且將第二個gds的layer number數值都加上1000
也就是說假設本來OD 這層layer對應到的layer number為2,那這邊就會變成1002

//OUTPUT REPORT
DRC RESULTS DATABASE "top.lvl.db" ASCII
DRC SUMMARY REPORT "top.lvl.rep"
這段就是設定我們report輸出的檔名及位置
database 是可以用RVE 開啟的檔案
summary 是文字內容的報告

DRC MAXIMUM RESULTS ALL
PRECISION        1000
RESOLUTION    1
設定DRC能回報出的結果為最大值
精準度為1000
Defines the layout grid step-size

//LAYER COMPARE
LAYER OD                1001    LAYER MAP           2    DATATYPE    0    1001
LAYER OD_Sec        2001    LAYER MAP    1002    DATATYPE    0    2001
DIFF.OD {@ OD is different from the OD of another GDS
OD XOR OD_Sec
}
rule file內需要定義每層layer對應的layer number及datatype
OD_Sec這行定義的是第二個gds的layer,這邊要注意layer定義的數值不能重複,否則會出錯
DIFF.OD這邊就是我們的rule 名字,下面做OD 與OD_Sec的XOR運算, 如果有不同就會抓錯


按照上面內容做更改就可以寫出LVL的command file了,但如果一行一行慢慢改,可能會改到天荒地老,而且還可能改錯,這時候就需要有寫Shell Script的能力,讓電腦自己完成這些事,下一篇會分享我自己寫的shell script,以及介紹內容。





2021年6月17日 星期四

DRC(Design Rule Check)

 在我們的layout(佈局圖)驗證環節中,通常我們Floorplan完(也就是Device擺放完)第一步就會先驗證DRC,先了解Layout(佈局圖)是否有違反製程規則,違反的部分會先看看能不能清除,直到剩下無法解乾淨的Rule才會進行Route(拉線),最後走完線,再進行DRC驗證,確定走線部分的Rule也沒有問題,才會進行LVS驗證。

那我們首先來看DRC的驗證流程,以下介紹為使用Calibre nmDRC

Calibre nmDRC Data Flow(擷取自Calibre® Verification User’s Manual)
首先我們會需要rule file(command file),這個文件通常會由Foundry(製程廠)提供的PDK(Process Design Kit)裡取得,依照各家Design House內部長久累積的製程經驗,可能會修改或添加rule進去,所以rule file的內容主要就是利用SVRF(Standard Verification Rule Format)去對DRC作一個描述運算,來讓Calibre nmDRC讀的懂規則,接下來就是給它layout database,也就是我們佈局圖透過Stream Out轉出的檔案,格式為GDSII or OASIS,那我們就可以來進行驗證,驗證結束後會轉出所謂的results database跟summary report等驗證報告。

那驗證方式大致上可以分為兩種型式,一種為Command Line,就是在Terminal上打上指令進行驗證,另一種為GUI(Graphical User Interface),比較人性化的介面驗證。

一.Command Line 

    1.使用vim or gvim(文字編輯器)去修改我們的rule file,找到以下4行

        LAYOUT PATH "/tapeout/gds/test.gds"(存放GDS檔案的路徑)

        LAYOUT PRIMARY "test"(待驗證的cell name)

        DRC RESULTS DATABASE "./test.db" ASCII (需使用Calibre RVE開啟的檔案)

        DRC SUMMARY REPORT "./test.sum" (文字檔報告)

輸入
        
輸出

    2.下指令執行Calibre nmDRC
        $ calibre -drc rule.file

二.GUI介面操作
    1.在Termial打開Calibre Interactive
        $ calibre -gui &





    2.點擊nmDRC
        


    3.如果有儲存runset就可以load 之前的設定,第一次操作就先關掉

    4.填入DRC Rules File,並點擊一下Load

    5.Inputs填入gds位置與Top Cell Name
    6.Outputs調整Database輸出跟Summary輸出
   
    7.點擊Run DRC,就會開始跑了

個人比較喜歡使用command line的方式去做驗證,因為可以寫一些Shell script讓資料比較好整理,VIM用習慣,感覺上操作效率會比GUI快很多,不過還是推薦兩種都要會,把核心觀念了解,其實非常簡單,新手常常會覺得gui操作比較容易,但其實command line 用熟,比較好理解
DRC整個流程的觀念。