ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [8]
----------------------------------------------
VIII. 레이아웃 검증(LVS)
앞서 베릴로그 RTL을 합성하여 얻은 네트리스트와 레이아웃에서 추출한 네트리스트를 비교하여 낮은 추상화 수준으로 변환된 두 설계가 동일한지 검증한다. QFlow의 LVS 처리 명령은 다음과 같다.
% qflow lvs ALU_wrapper
레이아웃(실리콘 도면)에서 추출된 네트리스트는 트랜지스터 회로다. RTL 합성으로 얻은 네트리스트는 표준 셀의 연결도다. 두 네트리스트의 추상화 수준이 다르다. LVS 를 위해 RTL 합성으로 얻은 표준 셀 네트리스트를 트랜 지스터로 변환 해야 한다. SPICE 형식으로 변환된 표준 셀 네트리스트에 디자인 킷으로 제공된 표준 셀의 SPICE 네트리스트를 하위회로(sub-circuit)로 불러온다.
|Magic: Migration <---[Std-Cell Layout] |
VIII-1. Netgen: 트랜지스터 회로 네트리스트 비교 도구
QFlow 의 LVS 도구는 Netgen[link] 이다. SPICE의 네트리스트 형식으로 표현된 두 트랜지스터 회로를 비교한다. 추상화 수준이 낮아질수록 처리할 부품의 기능은 단순해지고 갯수는 기하급수적으로 증가하여 자동화 도구에 의존도가 매우 높아진다. 인간이 간여할 부분은 줄어들고 낮은 수준의 자동화 도구 사용법은 단순하다. 가장 낮은 수준의 도구에 해당하는 Netgen의 사용법도 간단하다. QFlow에서 LVS 를 위해 Netgen을 호출하는 명령은 아래와 같다.
Running netgen
netgen -batch lvs \
Netgen을 호출 하면서 비교할 두 SPICE 네트리스트 파일을 지시했을 뿐이다. 예제의 LVS를 수행한 결과는 아래와 같다.
Circuit ALU_wrapper contains 366 device instances.
Class: OR2X2 instances: 5
Class: MUX2X1 instances: 1
Class: AOI22X1 instances: 13
Class: NOR2X1 instances: 12
<......>
Class: INVX4 instances: 3
Class: INVX8 instances: 1
Circuit contains 381 nets.
Circuit ALU_wrapper contains 366 device instances.
Class: MUX2X1 instances: 1
Class: AOI22X1 instances: 13
Class: NOR2X1 instances: 12
<......>
Class: INVX4 instances: 3
Circuit 1 contains 381 nets, Circuit 2 contains 381 nets.
Final result:
Circuits match uniquely.
두 회로에 사용된 하위회로들의 목록과 네트의 수 등을 요약해서 보여주고 두 회로가 일치 했음을 알려준다.
VIII-2. 서로다른 추상화 수준에서 표준 셀을 기술하는 양식
디자인 킷에 포함된 표준 셀의 라이브러리는 크게 3가지 추상화 수준의 형식으로 제공된다.
- 레이아웃 형식: 표준 셀의 기하학적 도면으로 가장 낮은 추상화 단계의 양식이다. 최종적으로 GDS 를 생성 할 때 사용된다.
- SPICE 형식: 표준 셀의 레이아웃에서 추출된 트랜지스터 회로의 네트리스트다. LVS 용도로 사용된다.
- Liberty 형식: 합성에서 사용되는 양식이다. 표준 셀 단위의 물리적 특성(기능, 크기, 지연 특성)을 담고있다.
- HDL 형식: 표준 셀 묘사의 가장 높은 수준의 양식이다. HDL 시뮬레이션을 위해 사용된다. 레이아웃의 트랜지스터와 스위치 수준에서 등가로 기술되며 게이트의 지연 특성, 플립플롭의 셋업-홀드 바이얼레이션을 검사할 수 있다.
합성으로 얻은 표준 셀의 네트리스트에서 디자인 킷의 표준 셀 SPICE 하위 회로를 불러들여 트랜지스터 회로를 만들게 된다. 합성 후 SPICE 네트리스트의 일부를 보면 아래와 같다.
M1000 Y A vdd vdd pfet w=6u l=0.6u
+ ad=12.600001p pd=16.2u as=12.600001p ps=16.2u
M1001 Y A gnd gnd nfet w=3u l=0.6u
+ ad=6.300001p pd=10.200001u as=6.300001p ps=10.200001u
.ends
합성으로 얻은 최상위 모듈(ALU_wrapper)의 SPICE 네트리스트는 디자인 킷의 표준 셀 (INVX1, NAND2X1 등등)을 하위 회로(sub-sircuit)로 하는 계층구조의 모습을 하고 있다.
VIII-3. 겹친 비아(Stacked VIA) 검사
우리가 사용하려는 ETRI 0.5um CMOS 공정은 겹친 비아(Stacked VIA)를 허용하지 않는다. 겹친 비아는 접점형성이 되지 않기 때문이다.
a. 배선과 비아 생성 규칙
대상공정[링크]의 배선을 담당하는 금속층은 3개다. 금속1층(m1, metal 1 layer)은 실리콘 층의 바로위에서 깔리는 금속층으로 표준 셀 내부 배선에 주로 이용되며 금속2(m2)와 3(m3)은 표준셀 사이의 배선에 사용된다. LEF의 배선 규칙에 따르면 금속2층은 수직선, 금속3층은 수평선 배선으로 쓰인다. 디자인 룰에 따라 선폭과 간격이 규정 되어있다. 비아(VIA)는 인접한 수직과 수평 배선 사이를 연결한다. LEF의 배선 규칙은 다음과 같다.
TYPE ROUTING ;
DIRECTION HORIZONTAL ;
PITCH 3.0 ;
OFFSET 1.5 ;
WIDTH 0.9 ; # ETRI050 Rule: WIDTH=0.8
SPACING 1.05 ; # ETRI050 Rule: SPACING=1.0
RESISTANCE RPERSQ 0.09 ;
CAPACITANCE CPERSQDIST 3.2e-05 ;
END metal1
LAYER metal2
TYPE ROUTING ;
DIRECTION VERTICAL ;
PITCH 3.0 ;
OFFSET 1.5 ;
WIDTH 1.05 ; # ETRI050 Rule: WIDTH=1.0
SPACING 1.05 ; # ETRI050 Rule: SPACING=1.0
RESISTANCE RPERSQ 0.09 ;
CAPACITANCE CPERSQDIST 1.6e-05 ;
END metal2
TYPE ROUTING ;
DIRECTION HORIZONTAL ;
PITCH 3.0 ;
OFFSET 1.5 ;
WIDTH 1.2 ; # ETRI050 Rule: WIDTH=1.2
SPACING 1.05 ; # ETRI050 Rule: SPACING=1.0
RESISTANCE RPERSQ 0.05 ;
CAPACITANCE CPERSQDIST 1e-05 ;
END metal3
TYPE CUT ;
SPACING 0.9 ;
END via1
LAYER via2
TYPE CUT ;
SPACING 0.9 ;
END via2
SAMENET cc via1 0.900 ;
SAMENET via1 via2 0.900 ;
END SPACING
VIA M2_M1 DEFAULT
LAYER metal1 ;
RECT -1.050 -1.050 1.050 1.050 ;
LAYER via1 ;
RECT -0.450 -0.450 0.450 0.450 ;
LAYER metal2 ;
RECT -1.050 -1.050 1.050 1.050 ;
END M2_M1
VIA M3_M2 DEFAULT
LAYER metal2 ;
RECT -1.050 -1.050 1.050 1.050 ;
LAYER via2 ;
LAYER metal3 ;
RECT -1.050 -1.050 1.050 1.050 ;
END M3_M2
[이미지출처] https://www.vlsi-expert.com/2017/12/vias.html
b. 자동배선 도구의 겹친 비아 금지 옵션
좁은 영역에서 효과적인 배선을 위해 겹친 비아를 허용한다. 하지만 겹친 비아가 금지된 공정도 있다. 우리가 사용하려는 ETRI 0.5um CMOS 공정은 비아가 겹쳐 있을 경우 접점이 형성되지 못한다. 따라서 겹침 비아가 절대 허용될 수 없다. LEF에는 겹친 비아에 대한 규정이 없으므로 이 배선규칙을 따르는 자동 배선도구에 겹친 비아를 차단하는 옵션을 주어야 한다.
QFlow의 프로젝트 파일 prohect_vars.sh 에서 via_stacks 에 none 값을 설정 해준다. 기본값은 all 이다.
# -------------------------------------------
set initial_density = 0.66
# set graywolf_options =
set addspacers_options = "-stripe 8 225 PG"
# set addspacers_power =
# Router command options:
# -------------------------------------------
set route_show = 1
# set route_layers =
# set via_use =
set via_stacks = none
# set qrouter_options =
# set qrouter_nocleanup =
QFlow의 프로젝트 파일에는 그외 자동배치 도구의 옵션도 있으므로 눈여겨 봐두자.
c. 겹친 비아 검사
추상화 수준이 낮아 질 수록 자동화 도구가 처리해야할 요소가 급격히 증가한다. 그만큼 자동화 도구의 결과에 오류가 존재할 가능성도 높아 지므로 추상화 단계가 전이할때 마다 반드시 검사가 이뤄져야 한다. 자동 배선도구에 겹침 비아를 금지 시켰으나 수많은 비아에 겹침을 모두 피했다고 확신할 수 없다. 디자인 킷에는 자동 배선 도구가 생성한 레이아웃에서 비아 겹침을 검사하는 파이썬 스크립트를 제공한다. 사용법은 아래와 같다.
..../ALU8/layout
$ ../../../scripts/check_via_stack.py
check_via_stack.py <Magic name> <layer#1> <layer#2> <margin>
Check stacked via
Layer Names are;
ndcontact
pdcontact
psubstratepcontact
nsubstratencontact
polycontact
m2contact
m3contact
Stacked #1
<< m2contact >> rect 2353 2713 2367 2727
<< m3contact >> rect 2353 2713 2367 2727
Box(Scaled): 1176 1356 1183 1363
***************************************
1 Stacked Contact and/or Via found!
Magic layout "ALU_wrapper_Stacked.mag" created with DRC error layer
자동 배선으로 생성된 Magic의 레이아웃 파일 ALU_wrapper 에 m2contact 과 m3contact 가 중심위치에서 6 마이크론 이내에 겹쳐 있는지 검사한 결과 1개의 겹친 비아가 발견되었다. 겹친 비아의 좌표가 오류로 표시된 레이아웃 파일 ALU_wrapper_Stacked.mag 에 저장 되었다.
VIII-4. Magic: 레이아웃 편집 도구로 겹친 비아 수정
겹친 비아가 표시된 레이아웃을 편집 도구 Magic[link]을 사용하여 편집한다. 레이아웃 편집기 Magic의 사용법은 튜토리얼 문서가 잘 준비되어 있으므로 따로 익혀두자[link]. 앞서 겹친 비아를 검사하여 에러로 표시된 레이아웃 파일을 읽는다.
$ magic -d XR ALU_wrapper_Stacked
넓은 영역에서 겹친 비아를 찾아내려면 좌표를 찾아 읽거나 오류로 표시한 부분을 확대한다. Magic의 오류위치 찾기 명령은 drc find 다.
찾아낸 에러에 편집 상자가 위치하게 된다. 확대(단축키 'z'와 'Z')한 후 서브 셀들의 내부로 확장(단축키 'x')하고 동일 네트를 선택(단축키 's')하면 겹친 비아를 확인할 수 있다.
금속 m1(청색), m2(보라색), m3(자주색) 배선이 겹친 지점에 비아가 뚫려 있다. 흰색 실선으로 외곽이 둘러쳐진 배선은 모두 동일 네트임을 나타낸다. M1_M2 비아를 선택(:select via1)하여 이동 시킨 후 m1 배선을 수정 한다.
단순한 수정이지만 수작업 편집은 항상 오류를 일으킬 우려가 있으므로 LVS 를 통해 검증해주여야 한다. 수정한 레이아웃에서 네트리스트를 추출한다. 회로 시뮬레이션이 목적이 아니므로 저항과 정전용량(커페시턴스)은 배제시킨다. LVS용 네트리스트를 추출하기 위한 Magic의 일련의 명령은 다음과 같다.
extract all
LVS가 필요할 때마다 위 명령들을 반복적으로 입력하기란 여간 번거로운 일이 아니다. 스크립트로 저장해 두었다가 반복적으로 사용하기로 한다. Magic의 레이아웃에서 SPICE 네트리스트를 추출하는 쉘 스크립트는 extract_spice.sh 다. 디자인 킷의 scripts 폴더에 있다. 수정한 레이아웃을 ALU_wrapper_Fixed 로 저장한 후 SPICE 네트리스트를 추출하는 스크립트를 실행 한다.
$ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed
수정한 레이아웃의 SPICE 네트리스트를 합성으로 얻은 네트리스트와 LVS를 실시한다.
Circuit 1 contains 381 nets, Circuit 2 contains 381 nets.
Final result:
Circuits match uniquely.
LVS로 두 네트리스가 일치한 결과를 얻게 되면 겹침 비아의 수정이 완료된다.
VIII-5. Magic: 디자인 룰 검사
디자인 룰은 반도체 제조의 정밀도에 따라 기하학적인 한계를 규정한다. 유효한 트랜지스터의 제조에 요구되는 최소 길이와 폭을 정한 것이다. 이에 더블어 수많은 트랜지스터들 사이의 배선에 사용될 금속선의 폭과 간격 그리고 접점의 조건을 규정한다[Design Rule Checking].
자동 배선 도구도 소프트웨어로 오류의 가능성을 가지고 있다. 전체 레이아웃 면적에서 구역을 나눠 배선을 진행 하게 되는데 구획된 배선 영역을 합치는 과정에서 문제를 잃으키기도 한다. 자동 배선이 완료 되었다는 로그를 받게 되더라도 반드시 LVS를 실시해야 하는 이유다.
표준 셀은 이미 공정의 디자인 룰에 맞게 준비 되었으므로 LVS와 겹친 비아까지 수정된 레이아웃은 GDS 생성 단계로 넘어가도 좋다. 자동 배선기 또한 디자인 룰에 맞춰 배선 규칙이 규정 되어 있으며 표준 셀의 배선 제한영역(OBS, obstruction)을 피하도록 되어있다. 따라서 이 단계의 디자인 룰 검사는 대부분 배선용 금속층과 접점 사이의 규정위반이 나타나게된다.
겹침 비아까지 수정된 레이아웃을 읽어 디자인 룰을 검사해 보자. 먼저 Magic 으로 레이아웃을 읽는다.
$ magic -d XR ALU_wrapper_Fixed
메뉴 Options > DRC Manager 를 선택하여 DRC 관리창을 연다.
금속 1, 2, 3의 간격(spacing) 오류가 있다. DRC 관리창에서 오류 좌표를 선택 후 Zoom 버튼을 누르면 해당 위치를 보여준다.
배선의 단말 부분이 두껍게 그려져서 간격이 위배된 경우다. 편집 명령으로 일부분을 지워주면 오류가 사라진다.
아래의 오류는 자동 배선의 규칙을 과하게 적용한 경우다. 금속2를 수직 배선에 적용한 탓에 과도하게 비아를 사용하고 있다. 동일한 네트이므로 굳이 수정할 필요가 없더라도 가급적 모두 수정해 주도록 한다.
비아를 넓게 하거나 한쪽을 제거하고 직접 연결 할 수 있다.
자동배선기는 높은 지능 수준을 요구하는 매우 중요한 자동화 도구다. 하지만 실제 배선된 도면을 보면 이해 못할 면도 많다. 수직 배선과 수평 배선 규칙을 융통성 없이 적용하기 때문이다. 자동 배선 도구가 남긴 간격 오류를 모두 수정에도 남은 오류가 있는데 이는 이는 디자인 룰의 기하학적인 오류가 아니다.
표준 셀이 배치되면서 인접 셀과 겹치는 부분이 있다는 뜻이다. 전원과 접지 배선을 공통 선으로 연결 하기 위해 표준 셀에 여유를 두었기 때문이다. 최종 GDS를 생성 할 때 n 과 p의 바닥 디퓨전(substrate diffusion) 접점을 균일하게 배치하도록 규칙을 정해놨기 때문에 무시한다. Magic의 테크 파일에는 비아와 컨택을 자동생성하는 룰을 따로 가지고 있다.
수동 편집이 개입 되었으므로 반드시 LVS를 실시한다. 앞서 실시행던 방법과 같다. 먼저 수정한 레이아웃에서 SPICE 네트리스트를 추출하고,
$ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed
LVS를 실시한다.
아쉽게도 두 네트리스트가 일치하지 않는다. LVS의 로그는 따로 지정하지 않으면 comp.out 이다. 두 회로에서 일치하지 않는 네트를 확인한다.
RTL 합성 네트리스트 ALU_wrapper.spc 에서 네트명 _25_ 가 수정 네트리스트에서 두개의 네트 _306_/Y 와 _311_/A 로 분리된 것으로 보고되었다. Magic에서 네트를 찾는 명령은 goto 다[Magic-8.3 Command Reference].
끊어진 네트를 찾아 이어준다.
다시 네트리스트를 추출한 후 LVS 를 실시한다.
$ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed
LVS 결과 로그를 보면 두 네트리스트가 사용된 셀, 네트 그리고 입출력 핀까지 완전히 일치함을 확인할 수 있다.
Circuit 1: DFFSR |Circuit 2: DFFSR
-------------------------------------------|-------------------------------------------
nfet (16) |nfet (16)
pfet (16) |pfet (16)
Number of devices: 32 |Number of devices: 32
Number of nets: 20 |Number of nets: 20
---------------------------------------------------------------------------------------
Netlists match uniquely.
Subcircuit pins:
Circuit 1: DFFSR |Circuit 2: DFFSR
-------------------------------------------|-------------------------------------------
S |S
R |R
vdd |vdd
gnd |gnd
CLK |CLK
Q |Q
D |D
---------------------------------------------------------------------------------------
Cell pin lists are equivalent.
Device classes DFFSR and DFFSR are equivalent.
Circuit 1: ALU_wrapper |Circuit 2: ALU_wrapper_Fixed
-------------------------------------------|-------------------------------------------
AOI22X1 (13) |AOI22X1 (13)
DFFSR (24) |DFFSR (24)
INVX1 (41) |INVX1 (41)
NAND2X1 (67) |NAND2X1 (67)
OAI21X1 (94) |OAI21X1 (94)
INVX4 (3) |INVX4 (3)
<......>
MUX2X1 (1) |MUX2X1 (1)
BUFX2 (28) |BUFX2 (28)
DFFPOSX1 (12) |DFFPOSX1 (12)
INVX2 (4) |INVX2 (4)
XNOR2X1 (3) |XNOR2X1 (3)
INVX8 (1) |INVX8 (1)
OAI22X1 (1) |OAI22X1 (1)
CLKBUF1 (6) |CLKBUF1 (6)
Number of devices: 366 |Number of devices: 366
Number of nets: 381 |Number of nets: 381
---------------------------------------------------------------------------------------
Netlists match uniquely.
Subcircuit pins:
Circuit 1: ALU_wrapper |Circuit 2: ALU_wrapper_Fixed
-------------------------------------------|-------------------------------------------
reset |reset
oACC[6] |oACC[6]
oACC[5] |oACC[5]
oACC[4] |oACC[4]
oACC[2] |oACC[2]
oACC[3] |oACC[3]
oACC[1] |oACC[1]
oACC[0] |oACC[0]
oACC[7] |oACC[7]
iSel[0] |iSel[0]
iSel[1] |iSel[1]
iOutSel |iOutSel
clk |clk
iAB[1] |iAB[1]
iAB[0] |iAB[0]
iAB[3] |iAB[3]
iAB[2] |iAB[2]
iAB[4] |iAB[4]
iAB[5] |iAB[5]
iAB[6] |iAB[6]
iAB[7] |iAB[7]
vdd |vdd
gnd |gnd
---------------------------------------------------------------------------------------
Cell pin lists are equivalent.
Device classes ALU_wrapper and ALU_wrapper_Fixed are equivalent.
Final result: Circuits match uniquely.
댓글 없음:
댓글 쓰기