ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502 [8]
VI. 레이아웃 검증
-------------------------------------------------
VI. 레이아웃 검증
자동 배선까지 마치면 마스크를 제작할 수 있는 레이아웃이 준비된 것과 같다. 자동배선을 수행하기까지 자동화 도구들을 동원하여 추상화 수준을 낮춰 왔다. 이 과정에서 자동화 도구의 오류가 끼어들 여지가 많다. 이를 확인하는 과정이 레이아웃 검증이다. LVS (Layout vs. Schematic)은 합성으로 생산된 표준 셀의 네트리스트와 자동 배선으로 얻은 레이아웃 도면이 트랜지스터 회로 수준에서 일치하는지 비교한다. 합성으로 얻은 표준 셀 네트리스트는 베릴로그 언어로 기술된 회로도다. 배선후 얻은 레이아웃은 반도체 물질과 메탈의 적층 도면이다. 기하학적인 적층 도면에서 트랜지스터 회로를 추출하여 표준 셀의 네트리스트와 비교하여 서로 다른 추상화 수준의 설계물이 일치하는지 확인한다.
VI-1. 배선 후 얻은 DEF
자동배치와 배선을 수행한 DEF에 표준 셀 부품(COMPONENTS)과 배선한 메탈 선(NETS)의 좌표가 기록된다.
- FILL_0__1694_ FILL + PLACED ( 150 150 ) S ;
- FILL_1__1694_ FILL + PLACED ( 450 150 ) S ;
......
- FILL_11__1694_ FILL + PLACED ( 3450 150 ) S ;
- _1694_ INVX1 + PLACED ( 3750 150 ) S ;
- FILL_0__1833_ FILL + PLACED ( 4350 150 ) S ;
......
- FILL_10__1815_ FILL + PLACED ( 183750 183450 ) FN ;
- _1815_ NAND2X1 + PLACED ( 184050 183450 ) FN ;
- FILL_0__3484_ FILL + PLACED ( 184950 183450 ) N ;
.....
- FILL_10__3484_ FILL + PLACED ( 187950 183450 ) N ;
- _3484_ INVX1 + PLACED ( 188250 183450 ) N ;
- FILL189450x150 FILL + PLACED ( 189450 150 ) S ;
......
- FILL190950x183450 FILL + PLACED ( 190950 183450 ) N ;
- FILL191250x183450 FILL + PLACED ( 191250 183450 ) N ;
END COMPONENTS
PINS 40 ;
- gnd + NET gnd
+ LAYER metal1 ( -450 0 ) ( 450 0 )
+ PLACED ( 192195 30 ) N ;
- vdd + NET vdd
+ LAYER metal1 ( -450 0 ) ( 450 0 )
+ PLACED ( -495 30 ) N ;
- AB[15] + NET AB[15]
+ LAYER metal3 ( -60 -60 ) ( 60 60 )
+ PLACED ( -300 123000 ) N ;
......
- clk + NET clk
+ LAYER metal2 ( -52 -52 ) ( 52 52 )
+ PLACED ( 180300 188100 ) N ;
- reset + NET reset
+ LAYER metal2 ( -52 -52 ) ( 52 52 )
+ PLACED ( 179700 188100 ) N ;
END PINS
NETS 1997 ;
- _815_
( _3160_ Y )
( BUFX2_insert82 A )
( BUFX2_insert83 A )
......
+ ROUTED metal2 ( 16500 174300 ) ( * 177000 )
NEW metal2 ( 40800 174300 ) ( * 176400 ) M3_M2
NEW metal3 ( 40800 176400 ) ( 16500 * ) M3_M2
......
- WE
( PIN WE )
( _3563_ Y )
+ ROUTED metal2 ( 96300 188100 ) ( 96000 * ) ( * 187200 ) M3_M2
......
END NETS
6502 CPU의 베릴로그 RTL을 합성한 로그를 보면 1896개의 표준 셀이 사용 되었다. 배치와 배선의 결과 DEF에 부품의 수는 무려 22922개다. DEF의 부품 중 FILL 이름을 가진 셀이 가장 많이 보인다. 표준 셀을 배치할 때 밀집도가 0.32 였다. 표준 셀 기반 설계에서 자동화 배선을 위해 남겨둔 자리에 전원(Vdd)과 접지(GND) 만을 가진 셀(FILL)을 채워 넣었기 때문이다. 채우기 셀(filler cell)은 수평으로 배치된 표준 셀 사이에 전원과 접지선을 연결해 준다. 3중 메탈 공정에서 최하위 메탈 층은 표준-셀의 기초 배선에 쓰이며 셀 사이의 배선은 메탈 2 와 3을 이용한다.
VI-2. LVS 레이아웃 검증
DEF 에서 Magic 레이아웃 변환
DEF는 표준 셀의 위치와 배선용 메탈 그리고 접점의 위치를 표시했을 뿐이다. 적층 도면에서 트랜지스터 회로를 추출 하려면 표준 셀을 병합해야 한다. 디퓨전 반도체 층(diffusion layer)의 활성 영역과 폴리 실리콘 층(poly-silicon layer)의 선이 중첩된 영역에서 트랜지스터를 추출하고 메탈 층과 접점을 엮어 트랜지스터 네트리스트를 만들어 낼 수 있다. 오픈 소스 도구 Magic은 레이아웃 도면 편집기이자 회로 추출기다. 배선된 DEF로부터 Magic 레이아웃 파일의 생성은 단순한 전환(migration)으로 QFlow 명령은 다음과 같다.
$ qflow migrate cpu
자동 배선된 layout/cpu.def를 읽어 레이아웃 layout/cpu.mag를 생성하고 그로부터 SPICE 형식의 네트리스트 layout/cpu.spice 를 추출한다. 이 SPICE 네트리스트는 목적은 시뮬레이션이 아닌 LVS용이다.
LVS: 배선 후 레이아웃 네트리스트 vs 합성 후 네트리스트 비교
합성으로 얻은 베릴로그 네트리스트에서 추출한 트랜지스터 수준 네트리스 synthesis/cpu.spc와 자동 배선 후 레이아웃에서 추출한 네트리스트를 비교한다. QFlow의 LVS 실시 명령은 아래와 같다.
$ qflow lvs cpu
이 명령으로 수행되는 SPICE 네트리스트 비교 도구는 오픈 소스 netgen 이다. LVS의 로그 파일을 보면 netgen 이 어떻게 작동 하는지 알 수 있다. 레이아웃을 수정할 때마다 이 도구를 이용하게 될 것이므로 어떻게 작동 되는지 알아두도록 한다.
"../synthesis/cpu.spc cpu" \
etri050_setup.tcl comp.out -json -blackbox
두 네트리스트를 비교하여 배치 모드(대화창을 띄우지 않음)로 LVS 를 수행 한다. 각 네트리스트는 계층적 구성을 하고 있고 최상위 회로의 이름이 cpu 다. 배선만을 검증하기 위한 목적이므로 표준 셀 내부는 블랙박스(blackbox)로 처리하고 있다. 실제로 layout/cpu.spice 에서 SPICE 하위회로(.subckt)로 기술된 내부 트랜지스터 회로는 노출되지 않는다.
* Black-box entry subcircuit for FILL abstract view
.subckt FILL vdd gnd
.ends
* Black-box entry subcircuit for INVX1 abstract view
.subckt INVX1 A Y vdd gnd
.ends
.....
* Black-box entry subcircuit for NOR3X1 abstract view
.subckt NOR3X1 A B C Y vdd gnd
.ends
.subckt cpu gnd vdd AB[15] AB[14] AB[13] AB[12] ......
+ DI[7] DI[6] DI[5] DI[4] DI[3] DI[2] DI[1] DI[0]
+ DO[7] DO[6] DO[5] DO[4] DO[3] DO[2] DO[1] DO[0]
XFILL_3__2586_ vdd gnd FILL
XFILL_1__1670_ vdd gnd FILL
......
XFILL_6__2364_ vdd gnd FILL
XFILL_3__2655_ vdd gnd FILL
X_3224_ _3224_/D vdd _3246_/R _3273_/CLK _3224_/Q vdd gnd DFFSR
.ends
LVS는 부품 회로도 수준의 네트리스트 비교임을 알 수 있다. LVS 결과 두 회로의 네트리스트가 일치하는 결과를 얻음으로써 자동 배치와 배선이 정확이 이뤄졌음을 확인 할 수 있다.
Circuit 1 contains 1998 nets, Circuit 2 contains 1998 nets.
Final result:
Circuits match uniquely.
LVS의 대상인 첫번째 회로에서 표준 셀 내부를 노출 시키지 않았지만 참고 회로의 내부는 트랜지스터 수준의 회로가 기술술되어 있다.
VI-3. 겹친 접점(Stacked VIA) 검사
자동 배선 도구는 인접한 금속층 사이에 접점(via) 뚫어 배선을 완성한다. 다중 메탈 공정의 경우 배선의 효율을 높이기 위해 두개 이상의 인접 금속층을 연결하는 겹친 접점(stacked via)를 허용한다. 정교하지 않은 공정은 겹친 접점을 확신하지 못하는 경우도 있어서 디자인 룰에서 이를 금지한다. ETRI 0.5um 공정은 겹친 접점을 허용하지 않고 있다. 자동 배치 도구를 실행 할 때 미리 이를 금지 시켰으나 이를 확실하게 처리 했다고 확신 할 수 없다. 2천여개의 네트에 불과하지만 배선 로그에 따르면 실제 배선할 지점이 2만여를 넘었던 것으로 보고되었다. 단 2개의 금속층으로 배선을 하려면 건너뛰어야 하는 배선이 엄청나게 늘었다는 의미이기도 하다. 그 과정에서 수많은 접점이 생겨나는데 겹친접점까지 금지하기에 배선이 쉽지 않다. 자동 배선 도구는 배선 오류를 최대한 줄일 뿐이지 모두 처리하지 못할 뿐만 아니라 이에대한 보고조차 불분명한 경우가 허다하다. 설계 자동화 도구중 가장 긴 작업시간을 소요하는 과정이 바로 배선이다. 따라서 자동 배선 후 LVS는 필수다. 비록 LVS 가 성공적이더라도 공정에서 요구하는 특별한 조건에 대하여 추가 검사를 해주어야 한다. ETRI 0.5um 공정의 겹침접점 금지 조건을 검사하는 스크립트를 제공한다. 디자인 킷의 scripts/check_via_stack.py 다. LVS 까지 완료된 레이아웃 layout/cpu.mag 에 대하여 겹침접점을 검사한다.
$ ../../../scripts/check_via_stack.py cpu m2contact m3contact 6
위의 명령은 금속 1과 2사이의 접점 m2contact 과 금속 2와 금속 3 사이의 접점 m2contact 이 서로 중심에서 6um 이내에 놓이면 겹친 것으로 본다. 검사결과 총 20개의 겹친 접점이 발견 되었다.
Stacked #1<< m2contact >> rect 5413 11533 5427 11547
<< m3contact >> rect 5413 11533 5427 11547
Box(Scaled): 2706 5766 2713 5773
Stacked #2
<< m2contact >> rect 4433 11433 4447 11447
<< m3contact >> rect 4433 11433 4447 11447
Box(Scaled): 2216 5716 2223 5723
......
Stacked #19
<< m2contact >> rect 2553 2193 2567 2207
<< m3contact >> rect 2553 2193 2567 2207
Box(Scaled): 1276 1096 1283 1103
Stacked #20
<< m2contact >> rect 1093 113 1107 127
<< m3contact >> rect 1093 113 1107 127
Box(Scaled): 546 56 553 63
***************************************
20 Stacked Contact and/or Via found!
Magic layout "cpu_Stacked.mag" created with DRC error layer
접점이 겹친 위치에 오류표시를 하고 레이아웃 파일명 cpu_Stacked.mag으로 저장된다. 레이아웃 도구 Magic으로 겹친 레이아웃을 수동으로 고쳐 준다. 레이아웃의 수동 편집은 전편의 예제 "ALU8"의 "레이아웃 검증[바로가기]"을 참조한다. 설계 자동화에 인간의 개입은 매우 위험하다. 반드시 검증의 절차를 수행 해야 한다. LVS를 위해 겹침접점을 수정한 레이아웃에서 SPICE 네트리스트를 추출 한다. 수정한 레이아웃 파일명이 cpu_fixed.mag 라면,
$ ../../../scripts/extract_spice.sh cpu_fixed
추출된 네트리스트는 cpu_fixed.spice 다. 합성후 얻은 네트리스트와 LVS를 실시한다.
레이아웃에서 추출한 SPICE 네트리스트는 표준 셀의 내부 트랜지스터 회로까지 포함되었으므로 블랙박스 옵션은 사용하지 않았다. 수동 편집된 레이아웃임을 감안해 상세하게 트랜지스터 회로 수준의 LVS를 실시했다.
Circuit DFFPOSX1 contains 22 device instances.
Class: pfet instances: 11
Class: nfet instances: 11
Circuit contains 17 nets.
Contents of circuit 2: Circuit: 'DFFPOSX1'
Circuit DFFPOSX1 contains 22 device instances.
Class: pfet instances: 11
Class: nfet instances: 11
Circuit contains 17 nets.
......
Circuit 1 contains 1983 devices, Circuit 2 contains 1983 devices.
Circuit 1 contains 1998 nets, Circuit 2 contains 1998 nets.
Final result:
Circuits match uniquely.
비교의 대상이된 두 회로 모두 표준 셀 내부의 트랜지스터까지 검사되었음을 보여준다.
VI-4. 디자인 룰 검사(DRC)
6502 CPU의 베릴로그 RTL을 합성한 네트리스를 가지고 레이아웃(반도제 공정용 적층 도면)을 만들어 냈다. 자동화 도구가 행한 2만여개에 이르는 배선이 공정의 도면 작성 규칙(Design Rule)에 부합하는지 검사한다. 배선 자동화 도구는 표준 셀의 LEF에 규정된 도면 규칙(디자인 룰, Design Rule)을 참조 하지만 이를 완벽히 지켜 내지 못한다. LEF의 도면 규칙은 배선을 담당할 금속선의 두께와 인접 선 사이 간격 그리고 접점의 크기를 규정한다. 레이아웃 도구 Magic 을 써서 설계 규칙을 검사(DRC, Design Rule Check)하고 규정에 위배된 부분을 찾아 수정한다.
$ magic -d XR cpu_fixed.mag
Magic의 명령 줄에서 설계규정 위반을 검사한다.
20개의 위반이 있다고 나온다. DRC 관리자 창을 열어 규정 위반 개소를 찾아 수정해 준다. 대부분 금속 배선 사이의 간격 위반 사항이다. 동일한 네트의 경우 비아 간격이 전기적으로 문제가 되지 않으나 오류로 판정한다. Magic의 디자인 룰 검사는 그렇게 지능적이지 못하다. 보고된 모든 DRC 오류난 개소를 찾아 수정해 준후 다시 검사하면 여전히 상당수의 위배사항이 있다고 보고된다.
오류 메시지를 보면,
This layer can't abut or partially overlap between subcells
인접 셀 사이에 겹치는 부분이 있다는 보고다. 공정 설계룰의 해당 사항이 아닌 Magic 의 내부 규정이다. 표준 셀을 수평으로 이어 붙이는 방식으로 배열 되는 점을 감안해 전원과 접지선을 유효 영역보다 넓게 그렸기 때문이다. 레이아웃을 검사하고 수정하다 보면 오픈 소스 자동화 도구들의 비 지능적인 모습을 종종 보게될 것이다. 상용 설계 자동화 도구들이 내세우는 '지능적' 이라는 표현이 동원되는 이유를 이해할 수 있다.
비록 오픈 소스 '자동화' 도구들이 지능이 지능적이지 않더라도 검사 수단을 제공 하고 있는 점은 다행이다. 그때마다 설계자의 판단이 필요하고 수정이 가해진 후 검증은 필수다. 수정한 레이아웃에서 SPICE 네트리스트를 추출하고,
$ ../../../scripts/extract_spice.sh cpu_core
LVS 를 실시한다.
LVS의 결과는 LVS_cpu_Core.txt 에 저장토록 했다. 잘못된 사항이 있는 면밀히 검토하여 최종 레이아웃 결과물을 확보한다. LVS 검사시 오류가 났을 경우 해당 네트를 찾아 수정하는 과정은 이전 예제 'ALU8' 편에서 설명 하였다[바로가기].
--------------------------------------
댓글 없음:
댓글 쓰기