레이블이 XSchem-Magic-Netgen: VLSI 레이아웃 설계 기초인 게시물을 표시합니다. 모든 게시물 표시
레이블이 XSchem-Magic-Netgen: VLSI 레이아웃 설계 기초인 게시물을 표시합니다. 모든 게시물 표시

2024년 7월 23일 화요일

"VLSI 레이아웃 설계 기초" [8] Std-Cell 제작 실습: DFF-SR

"VLSI 레이아웃 설계 기초"
[8] Std-Cell 제작 실습: DFF-SR

"VLSI 레이아웃 설계 기초"는 "내 칩(My Chip) MPW 서비스": 오픈-소스 도구 활용 반도체 설계 특별과정 중 첫번째 강좌다. 오픈 소스 도구의 기초적인 사용법과 레이아웃 설계와 검증을 정성적으로 다룬다(Quantative approach to VLSI layout design using Open-Source EDA tools).

강의 내용은 아래와 같다.

[1] 리눅스 및 VLSI 레이아웃 도구 설치 [링크]
[2] XSchem, CMOS 인버터 회로도 작성과 시뮬레이션 [링크]
[3] Magic, CMOS 인버터 레이아웃 작성과 회로추출 [링크]
[4] Netgen, 추출한 회로 비교(LVS) [링크]
[5] XSchem 실습: 인버터 회로도 (Schematic Design) [링크]
[6] Magic 실습: 인버터 레이아웃 (Layout Design) [링크]
[7] Netgen 실습: 네트리스트 비교 및 회로 시뮬레이션 [링크]
[8] Std-Cell 제작 실습: DFF-SR [링크]

-----------------------------------------------------------

목차

I. 표준 셀(Standard Cell) 개요

II. 표준 셀(Standard Cell) 그리기 규칙

III. 표준 셀 D-플립 플롭 기능

    III-1. D 플립 플롭의 기능 사양

    III-2. 회로도 작성

    III-3. 시뮬레이션

IV. 표준 셀 D-플립 플롭의 레이아웃

    IV-1. 표준 셀 INVX1

    IV-2. 표준 셀 NAND2X1

    IV-3. 계층적 D 플립-플롭 레이아웃

    IV-4. LVS

V. 표준 셀 D-플립 플롭 레이아웃 평가

-----------------------------------------------------------


I. 표준 셀(Standard Cell) 개요

표준 셀은 IC 설계에서 사용되는 반도체 설계 방법론(특히 디지털)의 일환이다. 모든 설계를 트랜지스터 수준에서 설계 하기에는 너무나 많은 수고가 든다. 이보다 한단계 높은 논리회로 수준에서 설계하는 경우 자동화 도구의 조력을 받을 수 있다. 기본적으로 논리회로는 식(logic expression)으로 표현할 수 있고 수학적으로 알고리즘을 동원하여 최적화 할 수 있다. 뿐만 아니라 배치와 배선의 자동화(Place & Route Automation)를 꾀할 수 있다.

배선(routing)은 부품의 내부 설계에는 간여하지 않고 오직 금속 층을 사용하여 부품사이의 기하학적 연결을 수행한다. 이때 사용될 부품은 자동 배선을 감안하여 크기와 핀의 간격과 같은 기준이 필요하다. 자동 배선 도구는 금속층을 활용하게 되는데 금속층의 두께(width)와 이격거리(separation) 그리고 비아(via)의 그리기 규칙(layout desifn rule)을 따른다.

II. 표준 셀(Standard Cell) 그리기 규칙

"내 칩(My Chip) MPW" 서비스[1]를 통해 제공하는 공정의 사용 가능한 금속층은 3개에 불과하며 금속의 두께와 비아의 크기 그리고 겹친 비아(stacked via) 금지등 제한 규정이 있다. 자동 배선 도구가 이 규정을 따라야 함은 물론이다. 자동화 배선 도구에서 사용 가능하도록 아래와 같이 셀 그리기 규칙을 수립하였다. 표준 셀 사이의 배선 자동화 규칙은 LEF(Library Exchange Format)[10]에 규정되어있다. 경희대학교 디자인 킷은 표준 셀과 자동 배치배선용 LEF를 제공한다[2].

[주] 표준 셀은 RTL 합성과 자동 배치 배선을 위한 것이다. 추상화 수준을 높일 목적이 아니라면 단지 레이아웃 만으로는 아무런 실용적 의미를 갖지 못한다. 경희대학교 디자인 킷[2]은 합성용 리버티(Liberty)와 합성후 네트 시뮬레이션용 베릴로그 모델 그리고 자동배선용 LEF 를 표준 셀과 함께 제공한다.

    Liberty*: https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK/blob/main/digital_ETRI050_m2d/khu_etri05_stdcells.lib
    Std-Cell Verilog Model: https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK/blob/main/digital_ETRI050_m2d/khu_etri05_stdcells.v
    LEF: https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK/blob/main/digital_ETRI050_m2d/etri050_stdcells.lef

[*] 표준셀의 타이밍 자료는 무효다.


1. 금속 층의 활용

금속1 층(metal 1 layer)은 단위 셀 내의 지역 배선(cell internal route)에 사용한다. 자동 배선에서 금속1 층의 사용은 수평 배선에 사용할 수 있으나 극히 제한적이다. 안테나 룰에 민감하다. 금속 2와 3층(metal 1 and metal 3 layer)은 셀 사이의 전역 배선(inter-cell global route)에 활용한다. 금속 2층은 수직(horizontal route), 금속 3층은 수평 배선(vertical route)에 사용한다.

2. 금속 배선의 간격(Pitch or Tracks)

레이아웃 그리기 규칙의 배선용 금속 2와 3층의 두께, 비아의 크기를 감안하여 배선이 지날 경로(track)의 간격은 수평과 수직 공히 3um 로 한다.


3. 표준 셀의 높이

셀의 높이는 자동 배선 도구의 성능에 영향을 받지만 이를 일률적으로 장담하기는 어렵다. 셀을 조밀하게 그릴 경우 배선에 실패할 수 있고 넓게 그릴 경우 유휴공간이 늘어난다. 일반적으로 표준셀은 9 또는 12 트랙(Track)이지만 경희대학교 디자인 킷[2]의 표준 셀은 몇가지 베릴로그 설계를 활용하여 자동 배치와 배선을 시도한 끝에 셀의 높이는 13개 트랙이 지나는 것으로 확정했다.

4. 트랜지스터의 채널 크기

트랜지스터의 채널 크기는 최소 권장 보다 큰 폭 3um, 길이 0.6um 로 하였다. 

아래 그림은 실제 배선이 이뤄진 레이아웃의 일부 모습이다. 굵은 사각형은 표준 셀 중 복잡도가 높은 D 플립-플롭 이다. 셀 내부의 지역 배선에서 금속 1층(파란색)이 사용 되었고 그 위로 금속 2(보라색)의 수직 배선, 최상층 금속3(분홍색) 배선이 트랙을 따라 지나고 있다. 큰 정사각형 분홍색은 수직과 수평 배선 사이의 비아2(via2), 보라색 정사각형은 금속1과 2 사이의 비아1(via1)이다.

비아1은 셀의 포트를 전역 배선으로 연결한다. 셀 내부의 배선은 가급적 금속1 만을 사용하지만 피치못할 경우 금속 2를 최소한으로 사용한다. 이때 셀의 포트가 자동 배선에 막히지 않도록 수직 배선으로 만 사용하는 것을 원칙으로 한다.

표준 셀 그리기 규칙을 적용한 D 플립-플롭 표준 셀의 모습은 아래와 같다. 폴리 실리콘 컨택과 디퓨젼 컨택은 비교적 자유롭지만 비아1(via1)은 자동 배선 도구와 보조를 맞춰야 하므로 반드시 트랙 선상에 놓도록 한다.

많은 금속층을 가진 공정의 경우 전역 배선을 할 수 있는 여유가 많고 대부분 겹친 비아를 허용하므로 표준 셀을 조밀하게 그릴 수 있다. 5개 금속층을 가진 SkyWater130[3]의 D-FF(dffbbn1)의 내부 모습은 아래와 같다. 셀 내부가 매우 조밀하게 구성된 것을 알 수 있다.

경희대학교 디자인 킷[2]의 LEF에 규정된 배선 규칙은 다음과 같다. 금속 층의 배선 방법과 비아 뚫기 규칙을 정의한다.

    UNITS
      DATABASE MICRONS    1000 ;
    END UNITS

    USEMINSPACING    OBS ON ;
    USEMINSPACING    PIN OFF ;
    CLEARANCEMEASURE EUCLIDEAN ;

    MANUFACTURINGGRID    0.15 ;

    LAYER nwell
      TYPE    MASTERSLICE ;
    END nwell

    LAYER nactive
      TYPE    MASTERSLICE ;
    END nactive

    LAYER pactive
      TYPE    MASTERSLICE ;
    END pactive

    LAYER poly
      TYPE    MASTERSLICE ;
    END poly

    LAYER cc
      TYPE    CUT ;
      SPACING 0.9 ;
    END cc

    LAYER metal1
      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 via1
      TYPE       CUT ;
      SPACING    0.9 ;
    END via1

    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

    LAYER via2
      TYPE        CUT ;
      SPACING     0.9 ;
    END via2

    LAYER metal3
      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

    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 ;
        RECT -0.450 -0.450 0.450 0.450 ;
      LAYER metal3 ;
        RECT -1.050 -1.050 1.050 1.050 ;
    END M3_M2

III. 표준 셀 D-플립 플롭 기능

플립 플롭은 디지털 정보의 저장소로서 순차회로의 핵심이다[4]. 표준 논리회로를 활용하여 D 플립플롭을 설계한다.

III-1. D 플립 플롭의 기능 사양

비동기 셋(async. set)과 리셋(async. re-set)을 가진 상승 엣지 트리거(positive-edge trigger) D-형 플립-플롭을 표준 셀로 작성 한다. 잘알려진 TTL 7474의 CMOS 버젼 74HCT74의 내부 회로구성을 차용하여 기능 사양(functional specification)으로 삼았다. 기능도는 아래와 같다.


[그림출처] D-Type Positive-Edge-Triggered Flip-Flops With Clear and Preset[5]

III-2. 회로도 작성(D-FF Schematic)

XSchem으로 기능 사양서에 따라 회로도를 아래와 같이 작성한다. 이번 실습은 회로도와 레이아웃 폴더를 분리하였다. 실습 디렉토리 구조는 아래와 같다.

회로도 작업 폴더로 이동한 후 XSchem 실행.

    $ cd ~
    $ cd ~/Tutorials/1-4_StdCell_DFFSR/Sch
    $ xschem

하위 회로로 NAND2X1과 INVX1를 별도로 작성하여 계층적 회로로 작성 하였다. 트랜지스터의 폭과 길이는 미리 만들어 둔 표준 셀과 동일하게 주었다.

플립-플롭에서 전자정보는 NAND 게이트의 궤환(feed-back)에 의해 유보된다. 이 궤환의 경로에 외부 영향을 배제 하기 위해 D 입력에 반전 버퍼(inverter)를 달았다. 아울러 출력의 궤환작용이 외부에 영향을 주지 않도록 역시 반전 버퍼가 있다. 입력과 출력에 모두 반전 버퍼를 달고 있지만 전역 신호 리셋 R (/CLEAR)과 셋 S (/PRE)은 반전을 상쇄하기 위해 맞바꿨다.

III-3. 시뮬레이션

트랜시언트 시뮬레이션(transient simulation) 결과는 아래와 같다. 비동기 R(/CLR)과 S(/PRE)의 동작과 클럭의 상승 엣지에 동기된 정보보유(latch)의 동작을 확인 하였다.


IV. 표준 셀 D-플립 플롭의 레이아웃

기능이 검증된 D 플립-플롭의 회로도를 사양으로 레이아웃을 그려보자. 회로도에 NAND 와 INV 게이트 그리고 스위치용 p/n-mos 쌍이 사용되었다. 레이아웃 에서도 이에 대응하는 표준 셀을 준비한다.

IV-1. 표준 셀 INVX1

INVX1는 구동력(driving power)이 1인 인버터(inverter)다. n-mos의 채널(전자 이동한다)과 p-mos의 채널(홀이 이동한다)은 전하 이동도(mobility)가 2배 차이가 나는 것이 실험적으로 알려져 있다[6]. 이동도가 서로다른 채널을 상보적(complementary)으로 사용하는 CMOS 에서 이를 해결하는 방법으로 p-mos 트랜지스터의 채널 폭을 두배로 늘린다. 집적도에서 손해보는 방법이지만 가장 수월하다.

 

트랜시언트 시뮬레이션(Transient Simulation)은 수평축이 시간이다. 입력에 대하여 DUT가 반응하는 시간을 평가한다.

전압 증가 시뮬레이션(V-Sweep Simulation)은 수평축이 전압이다. 입력 전압에 대하여 DUT의 최종 출력 전압을 평가한다.

앞의 실습에서 p와 n-mos의 채널 폭이 동일한 인버터의 입력 전압에 대한 출력의 반응(voltage sweep)과 비교해 보자. 반전 하강하는 출력 곡선이 매우 가파르다. n-mos가 빠르게 반응하기 때문이다.

트랜시언트 시뮬레이션으로 비교해 보면 두 인버터 출력의 상승 반전과 하강 반전되는 시간의 차이가 드러난다. 좌측 그래프는 p-mos와 n-mos의 채널 폭이 동일한 경우다. 우측 그래프는 p-mos 채널 폭이 n-mos 채널 폭의 2배인 경우다.

IV-2. 표준 셀 NAND2X1

표준 셀 NAND 게이트의 회로도와 레이아웃은 아래 그림과 같다.

 

NAND2X1의 트랜시언트 시뮬레이션 결과는 아래와 같다. 두 입력이 모두 p-mos를 켜는 경우 vdd와 출력의 작아져서 반응 시간이 빠르다.

 

직렬 연결된 두 n-mos가 켜지는 경우 채널 길이(저항)가 두배가 된다. 이를 보상하기 위해 채널 폭을 늘렸다. 두 p-mos는 병렬 연결이다. 둘 중 하나만 켜지는 경우는 직렬연결된 두 n-mos와 균형을 이루지만 모두 켜지는 경우 빠르게 동작한다. 이를 보상하기 위해 n-mos의 채널 폭을 두배로 늘였다. 표준 셀 INVX1, NAND2X1, NOR2X1, SWITCH2X1의 레이아웃을 비교해 보면 트랜지스터의 채널 폭을 달리하는 이유를 같은 논리로 설명할 수 있다.

   

IV-3. 계층적 D 플립-플롭 레이아웃

미리 구축해 놓은 논리 게이트들의 표준 셀 레이아웃을 활용하여 회로도와 동일한 D-플립 플롭을 그린다.

    cd ~
    $ cd ~/Tutorials/1-4_StdCell_DFFSR/Layout
    $ magic -d XR DFFSR74

표준 게이트를 하위회로로 두고 있는 계층적 레이아웃이다. 레이아웃의 이름은 DFFSR74.mag 다.

회로도의 p와 n-mos 쌍의 스위치를 표준 셀로 만들어 하위회로로 활용 하였다.

IV-4. LVS

회로도와 레이아웃의 동일성 검증을 위해 LVS를 실시한다. Magic 레이아웃의 이름은 DFFSR74 이며 회로도의 D 플립-플롭의 이름은 DFFSR 이다. 회로도의 네트리스트는 시뮬레이션을 위해 미리 생성해둔 DFFSR_TB.spice 다. 이 네트리스트 내에 하위회로로 존재하는 DFFSR와 레이아웃에서 추출한 네트리스트의 하위회로 DFFSR74를 비교한다. LVS의 결과 보고서는 LVS_DFFSR74_DFFSR.txt 로 하였다.

    $ netgen -noc -batch lvs \

        "./DFFSR74.spice DFFSR74" \
        "../Sch/simulation/DFFSR_TB.spice DFFSR" \
        ./netgen_setup.tcl LVS_DFFSR74_DFFSR.txt

주] 설계는 도구의 반복 실행이다. 매번 명령줄에서 긴 명령을 입력하려면 피곤하다. 스크립트를 작성해 두도록 한다. 위의 LVS 실행 스크립트는 run_lvs.sh 다.

    $ ./run_lvs.sh DFFSR74 DFFSR

LVS 수행 후 결과는 두 회로의 네트리스트 불일치(mismatch)로 판명 되었다. 보고서를 열어 원인을 살펴보자. 처음 발견된 불일치는 NAND2X1의 핀 목록(pin list)에 불일치가 있다고 한다.

Netgen은 NAND2X1의 레이아웃과 회로도의 두 입력 순서가 바뀐 것을 찾아내 이를 불일치 판정했다. NAND 게이트의 논리를 따져보면 두 입력의 순서가 바뀌어도 동작과 무관 하다. 하지만 LVS는 매우 민감하다. 회로 전체를 살펴보고 '오류(error)', '경고(warning)', '통보(notice)' 등을 알려 줄 수 있으면 좋겠지만 Netgen은 그정도 지능(intelligence)은 가지고 있지 않다. 최근 상용 반도체 설계 도구에 인공지능(AI) 넣기가 한창이다. 오픈-소스 도구에도 이의 적용이 멀지 않았다.

이어서 두 네트리스트 사이에 하위회로 구성이 다르다는 점을 지적하고 있다. 회로도에 없는 SWITCH2X1이 레이아웃에 존재한다. Netgen은 하위회로 레이아웃을 상위회로로 평활화(flatten) 하여 등가성을 확인해 준다. 두 회로의 전체 구성(사용된 트랜지스터의 수, 네트의 수)은 일치하지만 네트이 연결에 불일치가 발견 되었다는 보고다.

레이아웃 DFFSR74 회로에서 네트 R이 두개의 NAND게이트 모두 B 포트에 연결되었으나 DFFSR의 회로도에서는 각각 B와 A 포트에 연결되어 있다. 네트 S의 경우 DFFSR74에서는 각각 A와 B에 연결되었지만 DFFSR 회로도는 모두 B 포트에 연결 되었다.

NAND 게이트는 A와 B 포트가 바뀌어도 기능상 등가이지만 LVS의 불일치를 바로 잡도록 하자. 레이아웃을 수정하기 보다 회로도를 수정하는 편이 수월하다. 회로도의 수정은 다음과 같다.

- 하위회로 NAND2X1의 A 와 B를 맞바꾼다.
- 네트 R이 X7의 B에, 네트 S는 X8의 A 에 연결 한다.

회로도 수정 후 LVS를 실시하여 두 네트리스트가 일치하는 결과를 얻었다.

회로도를 수정하였으므로 시뮬레이션을 다시 실시하여 반드시 검증해야함은 물론이다.

V. 표준 셀 D-플립 플롭 레이아웃 평가

설계에 사용될 부품을 규격화 해 놓음으로써 얻는 장점이 있다. 배치와 배선을 수행하는 자동화 도구에 의해 활용되려면 부품의 외형 규격화(standarized footprint)는 필수다. 배선 자동화 도구가 사용할 금속층의 규칙으로 금속2층은 수직배선, 금속 3층은 수평배선으로 규정했다고 하자. 전역 배선 규정은 LEF(Library Exchange Format)에 명시된다. 이 규정으로는 위에서 작성한 DFFSR74는 매우 부적절하다. 셀 내부에 유휴공간이 많고 수평배선으로 금속2가 다수 사용되었기 때문에 전역배선의 공간이 없다.

제대로 그린 표준 셀 DFFSR의 레이아웃은 아래와 같다. 약 32개 가량의 트랜지스터를 포함하는 레이아웃은 하위 셀을 불러오지 않고도 충분히 최적화된 셀을 그릴 수 있다.

표준 셀은 레이아웃 뿐만 아니라 자동 배치와 배선 도구를 위한 정보를 제공해햐 한다. 표준 셀의 크기와 배치시 상하 좌우 뒤집힘(flip)의 가능 여부, 핀(포트)의 금속층 좌표와 입출력 방향 그리고 금속 층별 배선을 금지하는 영역(obstruction)을 정의해 주어야 한다. 자동 배선도구는 셀 내부를 들여다 보지 않는다. 따라서 OBS 영역은 셀 내부에서 사용된 금속층의 영역을 표시하여 배선에 사용하지 못하도록 한다. 표준 셀 DFFSR의 LEF 매크로 정의는 아래와 같다.

    MACRO DFFSR
      CLASS CORE ;
      FOREIGN DFFSR ;
      ORIGIN 0.000 0.000 ;
      SIZE 69.000 BY 39.000 ;
      SYMMETRY X Y ;
      SITE core ;

      PIN D
        DIRECTION INPUT ;
        USE SIGNAL ;
        PORT
          LAYER metal2 ;
            RECT 27.900 14.850 29.100 17.100 ;
        END
      END D

      PIN S
        DIRECTION INPUT ;
        USE SIGNAL ;
        .......
      END S

      ......

      PIN Q
        DIRECTION OUTPUT ;
        USE SIGNAL ;
        PORT
          LAYER metal2 ;
            RECT 63.900 15.900 65.100 18.150 ;
        END
      END Q

      PIN vdd
        DIRECTION INOUT ;
        USE POWER ;
        SHAPE ABUTMENT ;
        PORT
          LAYER metal1 ;
            RECT -0.900 37.800 69.900 40.200 ;
        END
      END vdd

      PIN gnd
        DIRECTION INOUT ;
        USE GROUND ;
        SHAPE ABUTMENT ;
        PORT
          LAYER metal1 ;
            RECT -0.900 -1.200 69.900 1.200 ;
        END
      END gnd

      OBS
          LAYER metal1 ;
            RECT 1.200 30.900 3.000 37.500 ;
            RECT 4.200 31.800 6.000 36.900 ;
            ..........
            RECT 66.000 1.500 67.800 5.100 ;

          LAYER via1 ;
            RECT 30.900 27.300 33.000 29.400 ;
            RECT 36.300 28.800 38.400 30.900 ;
            .........

          LAYER metal2 ;
            RECT 15.900 31.800 18.900 33.900 ;
            RECT 19.800 31.800 21.900 33.900 ;
            .........
      END

    END DFFSR

오픈-소스 Magic 도구는 레이아웃으로부터 표준 셀의 라이브러리 정보를 추출해준다. 경희대학교 디자인 킷[2]은 레이아웃에서 LEF 정보의 추출과 통합 수정될 경우 두 레이아웃 사이의 네트리스트 비교(LVL, Layout-vs-Layout)등 일련의 표준 셀 구축용 스크립트를 제공한다. 자신만의 최적화된 표준 셀 라이브러리를 구축해 보자.


-------------------------------------------------------------------------------

[1] KION My Chip MPW, http://mpw.kion.or.kr/
[2] 경희대학교 디자인 킷, https://github.com/GoodKook/ETRI-0.5um-CMOS-MPW-Std-Cell-DK
[3] SkyWater130 Process, https://skywater-pdk.readthedocs.io/en/main/rules/assumptions.html
[4] 플립-플롭, https://ko.wikipedia.org/wiki/%ED%94%8C%EB%A6%BD%ED%94%8C%EB%A1%AD
[5] Flip-Flop, https://en.wikipedia.org/wiki/Flip-flop_(electronics)
[6] CDx4HCT74 Dual D-Type Positive-Edge-Triggered Flip-Flops With Clear and Preset, https://www.ti.com/lit/gpn/CD74HCT74
[7] 장효과 트랜지스터, https://ko.wikipedia.org/wiki/%EC%9E%A5%ED%9A%A8%EA%B3%BC_%ED%8A%B8%EB%9E%9C%EC%A7%80%EC%8A%A4%ED%84%B0
[8] Field Effetc Transistor, https://en.wikipedia.org/wiki/Field-effect_transistor
[9] Predicting CMOS Speed with Gate Oxide and Voltage Scaling and Interconnect Loading Effects, https://www.researchgate.net/publication/3063052_Predicting_CMOS_speed_with_gate_oxide_and_voltage_scaling_and_interconnect_loading_effects
[10] LEF/DEF Reference Manual, https://www.ispd.cc/contests/18/lefdefref.pdf



2024년 7월 21일 일요일

"VLSI 레이아웃 설계 기초" [7] Netgen 실습: 네트리스트 비교(LVS) 및 시뮬레이션

"VLSI 레이아웃 설계 기초"
[7] Netgen 실습: 네트리스트 비교(LVS) 및 시뮬레이션

"VLSI 레이아웃 설계 기초"는 "내 칩(My Chip) MPW 서비스": 오픈-소스 도구 활용 반도체 설계 특별과정 중 첫번째 강좌다. 오픈 소스 도구의 기초적인 사용법과 레이아웃 설계와 검증을 정성적으로 다룬다(Quantative approach to VLSI layout design using Open-Source EDA tools).

강의 내용은 아래와 같다.

[1] 리눅스 및 VLSI 레이아웃 도구 설치 [링크]
[2] XSchem, CMOS 인버터 회로도 작성과 시뮬레이션 [링크]
[3] Magic, CMOS 인버터 레이아웃 작성과 회로추출 [링크]
[4] Netgen, 추출한 회로 비교(LVS) [링크]
[5] XSchem 실습: 인버터 회로도 (Schematic Design) [링크]
[6] Magic 실습: 인버터 레이아웃 (Layout Design) [링크]
[7] Netgen 실습: 네트리스트 비교 및 회로 시뮬레이션 [링크]
[8] 표준 셀 제작 실습: D-Flip Flop [링크]

-----------------------------------------------------------

목차

I. 개요

II. LVS, 네트리스트 비교

    II-1. 작업 폴더

    II-2. 계층적 회로도

    II-3. 계층적 레이아웃

    II-4. 스크립트 사용

    II-5. LVS 실행


III. 시뮬레이션

    III-1. 시뮬레이션용 네트리스트

    III-2. 테스트 벤치

    III-3. 시뮬레이션 결과

-------------------------------------------------------------------


I. 개요

이번 실습편은 상이한 추상화 수준 또는 방법론이 다른 두 설계물을 등가성을 검증한다. 동일한 기능을 상이한 방법으로 설계하는 가장 큰 이유는 생산성 때문이다. 설계는 목표한 사양에 이르기까지 입력과 검증 그리고 수정의 반복이다. 검증을 위한 시뮬레이션은 자동화 되어 있지만 입력과 수정은 인간의 지적 능력에 달렸다. 인간이 다루기 수월한 형식을 취하기 위해 상위 추상화 수준에서 설계하고 검증을 마친 후 하위 수준으로 이전하므로서 생산성을 높인다.

Y 차트는 설계 방법론과 추상화 수준을 잘 설명하고 있다. 그림에서 설계방법을 3가지 영역(domain)으로 나누고 있으며 추상화 수준을 낮춰(refinement) 최종 목표인 설계 도면을 얻는과정을 표현한다.

Y 차트의 중심으로 향하는 과정에서 자동화 도구(EDA Tools)의 조력을 받는다. 영역 사이를 오가면서 사용하는 자동화 도구는 설계 생산성 향상에 큰 기여를 한다.

"VLSI 레이아웃 설계 기초" 과정은 낮은 추상화 수준(회로 수준)에서 두영역을 오가며 최종 레이아웃 얻는 반도체 설계 방법을 다루고 있다.

트랜지스터 회로도(schematic)와 레이아웃(layout) 설계를 Y-차트의 추상화 수준에서 보면 비슷한 수준 "Circuit Level" 이나 방법론은 매우 다르다.

비슷한 추상화 수준이라도 방법론을 달리하는 이유는 역시 생산성 향상을 얻기 위함이다. 추상화 수준은 물론 설계 방법의 전환이 있게 되면 반드시 검증의 절차를 따라야 한다. 회로를 표현하는 방법이 달라도 기능적으로 동일성이 확인 되어야 한다.

LVS(Layout versus Schematic)은 트랜지스터 수준에서 두 회로의 등가성을 확인한다. 다른 방식으로 표현된 회로를 각각 공통의 SPICE 네트리스트로 추출 하여 비교한다. 비교될 항목은 보다 높은 추상화 수준의 회로를 따른다. 회로도 보다 실제 가까운 레이아웃에서 추출된 기생 C 값은 비교 항목에서 제외 된다. 기능적으로 동일한 두 회로의 물리적(시간적) 차이와 특성 파악은 시뮬레이션을 통해 이뤄진다.

II. LVS, 네트리스트 비교

오픈-소스 도구 Netgen 은 SPICE 네트리스트 비교한다. 회로의 연결관계 뿐만 아니라 회로요소의 세부 파라메터 까지 비교해준다. 트랜지스터의 경우 기하학적 모습(채널의 폭과 길이)를 포함한다.

II-1. 작업 폴더

작업 디렉토리로 이동,

    $ cd
    $ mkdir Tutorials/1-3_Inverter_Netgen
    $ cd Tutorials/1-3_Inverter_Netgen

Magic 의 환경 설정 파일 복사,

    $ cp ~/ETRI050_DesignKit/tech/etri050.magicrc .magicrc

Netgen의 환경설정 파일 복사,

    $ cp ~/ETRI050_DesignKit/tech/etri050_setup.tcl netgen_setup.tcl

실습 디렉토리 구조:

II-2. 계층적 회로도

XSchem은 계층적 회로도를 작성할 수 있다. 앞선 실습에서 만들어둔 인버터를 하위회로로 4개를 잇달아 연결한 버퍼 회로를 작성한다.

생성된 네트리스트를 보면 하위회로 inverter 4개가 연속으로 이어진 회로로 기술되었다. SPICE 의 .subckt 는 하위회로를 정의하는 명령이다.

    ** sch_path: /home/goodkook/ETRI050_DesignKit/Tutorials/1-3_Inverter_Netgen/buffer.sch
    **.subckt buffer A Y VDD GND
    *.ipin A
    *.opin Y
    *.iopin VDD
    *.iopin GND
    X6 A net1 VDD GND inverter
    X1 net1 net2 VDD GND inverter
    X5 net2 net3 VDD GND inverter
    X2 net3 Y VDD GND inverter
    **.ends

    * expanding   symbol:  ~/Tutorials/1-1_Inverter_XSchem/inverter.sym # of pins=4
    ** sym_path: ~/Tutorials/1-1_Inverter_XSchem/inverter.sym
    ** sch_path: ~/Tutorials/1-1_Inverter_XSchem/inverter.sch
    .subckt inverter A Y VDD GND
    *.ipin A
    *.opin Y
    *.iopin VDD
    *.iopin GND
    M2 Y A VDD VDD pfet w=2.0u l=0.6u m=1
    M1 Y A GND GND nfet w=2.0u l=0.6u m=1
    .ends

    .end

상위 회로에 .subckt 를 붙이지 않고 있는 점에 유의하자. 정의한 하위회로를 실제로 존재하게 해야(사례화, instantiate) 비로서 회로가 꾸며진다.

II-3. 계층적 레이아웃

Magic은 계층적 레이아웃 설계를 지원한다. 앞서 제작해둔 인버터 레이아웃을 하위 셀(sub-cell)로 불러올 수 있다. 현재 위치의 환경 파일 .magicrc에 하위 셀이 저장된 경로를 추가해 준다. 상대 경로도 가능하다.

    addpath ../1-2_Inverter_Magic

Magic의 명령창에서 앞서 제작해둔 인버터 inverter_x1 을 불러온 후 이를 복사하여 버퍼를 만들고 buffer_x1으로 저장한다.

하위 셀들을 불러오는 명령은 getcell 이다.

    getcell inverter_x1

불러온 하위 셀을 복사하여 배치한 후 metal1 레이어를 이용하여 배선한다. 배선이 완료되면 상위 셀에서 입출력 포트를 붙여 주도록 한다. 상위 설계에서 하위 셀의 내부를 보여주는 명령은 expand (단축키 x) 다. 반대는 unexpand (단축키 'X')다.

II-4. 스크립트 사용

레이아웃에서 네트리스트의 생성은 용도에 따라 차이가 있다. 앞의 실습에서는 회로 시뮬레이션을 위한 용도로 배선으로 인한 기생 커페시턴스까지 추출 하였다. 이를 기생 커페시턴스는 없는 상위 수준의 회로도에서 추출한 네트리스트와 비교할 경우 회로 불일치 오류를 발생한다.

한 레이아웃에서 용도에 따라 다른 네트리스트를 생성하기 위해 편집(수정과 삭제)기능이 있는 도구를 매번 실행 시키면 자칫 실수가 끼어들 수 있다. 특히 단축키들의 사용이 광범위한 그래픽 기반의 편집 도구들은 실수로 인한 설계물의 변경 위험이 너무크다. 이런 위험을 배제하기 위해 스크립트들이 적극 활용되고 있다.

Magic 역시 그래픽 도구를 띄우지 않고 명령줄 실행이 가능하다. Tcl 명령 프롬프트 % 에 레이아웃 파일을 불러들여 네트리스트로 추출하는 명령을 줄 수 있다.

    $ magic -dnull -noconsole

    %

리눅스의 쉘 스크립트는 간이형 프로그래밍 언어로서 손색이 없다. 파일의 형식변환, 네트리스트 생성과 같은 일련의 작업이 필요한 경우 쉘 스크립트로 작성해 두면 매우 유용하다. Magic 레이아웃에서 시뮬레이션용 네트리스트를 생성하는 배쉬-쉘 스크립트를 아래와 같이 작성해 놓으면 매우 유용하게 쓸 수 있다.

    #!/usr/bin/bash
    ### filename: extract_spice_sim.sh

    if [ -f ".magicrc" ] ; then
        echo "Magic rc found"
    else
        echo "Magic rc NOT found"
        exit 2
    fi

    if [[ $# -ne 1 ]]; then
        echo "usage: extract <Magic Layout>"
        echo "      Extract spice netlist for simulation"
        exit 2
    fi

    magic -dnull -noconsole << EOF
    drc off
    box 0 0 0 0
    load $1 -force
    drc off
    extract all
    ext2spice default
    ext2spice format ngspice
    ext2spice scale off
    ext2spice subcircuit on
    ext2spice hierarchy on
    ext2spice
    quit -force
    EOF

파이썬(Python) 스크립트는 완전한 프로그래밍 언어로서 설계 자동화 도구에 널리 사용된다.

II-5. LVS 실행

Netgen으로 XSchem 회로도에서 생성한 네트리스트와 Magic 레이아웃에서 생성한 네트리스트를 비교하는 명령은 다음과 같다.

    % netgen -batch lvs \
            "./simulation/buffer_top.spice buffer" \
            "buffer_x1.spice buffer_x1"\
            ./netgen_setup.tcl comp.out


두 SPICE 네트리스트 내에 비교할 하위 회로를 지정하고 있다. 실행은 매우 단순하지만 입력해야 할 명령줄이 너무 길다. LVS 를 수행하는 스크립트를 파이썬으로 작성하면 아래와 같다.

    #!/usr/bin/env python3
    ### filename: run_lvs.py

    import os, sys

    if len(sys.argv) != 3:
        print('lvs: Specify two netlist folder and '
                 'filename to compare.')
        sys.exit(1);

        os.system('netgen -batch lvs \
                        "{}.spice {}"  \
                        "./simulation/{}_top.spice {}" \
                         ./netgen_setup.tcl comp.out' \
                         .format( sys.argv[1], sys.argv[1],  \
                         sys.argv[2], sys.argv[2]))

    sys.exit(0)

명령줄의 첫번째 인수로 Magic에서 생성한 네트리스트, 두번째 인수는 XSchem에서 생성한 네트리스트다. 각 네트리스트가 생성된 경로에 유의한다. 위의 파이썬 스크립트를 실행하여 LVS를 실시한다.

    $ ./run_lvs.py buffer_x1 buffer

두 네트리스트의 비교 결과 불일치의 보고를 받을 경우 결과 보고 파일 comp.out 을 살펴보자.

Flattening unmatched subcell inverter in circuit
    ./simulation/buffer.spice (0)(4 instances)

Subcircuit summary:

Circuit 1: ./simulation/buffer.spice |Circuit 2: buffer_x1.spice
-------------------------------------|-----------------------------
pfet (4)                             |pfet (4)
nfet (4)                             |nfet (4)
(no matching element)                |c (5)
Number of devices: 8 **Mismatch**    |Number of devices: 13
Number of nets: 7                    |Number of nets: 7
-------------------------------------------------------------------

NET mismatches: Class fragments follow (with fanout counts):

불일치의 원인은 XSchem 회로도에서 추출한 네트리스트에 없던 커페시터(c) 5개가 Magic 레이아웃 네트리스트에 포함되었기 때문이다.

레이아웃 네트리스트를 추출할 때 기생 C 가 없는 LVS 용으로 추출하는 스크립트는 아래와 같이 작성한다.

    #!/usr/bin/bash
    ### filename: extract_spice_lvs.sh

    if [ -f ".magicrc" ] ; then
        echo "Magic rc found"
    else
        echo "Magic rc NOT found"
        exit 2
    fi

    if [[ $# -ne 1 ]]; then
        echo "usage: extract <Magic Layout>"
        echo "      Extract spice netlist for simulation"
        exit 2
    fi

    magic -dnull -noconsole << EOF
    drc off
    box 0 0 0 0
    load $1 -force
    drc off
    extract all
    ext2spice default
    ext2spice format ngspice
    ext2spice cthresh infinite
    ext2spice rthresh infinite
    ext2spice scale off
    ext2spice subcircuit on
    ext2spice hierarchy on
    ext2spice
    quit -force
    EOF

시뮬레이션용 네트리스트 추출 스크립트와 다른 점은 기생 C 와 R 의 추출 한계치 cthresh와 rthresh 를 무한대 infinite 로 놓고 있다. LVS용 스크립트를 이용하여 생성한 네트리스트를 가지고 비교를 수행한다.

    $ ./extract_spice_lvs.sh buffer_x1

    $ ./run_lvs.py buffer_x1 buffer

    Contents of circuit 1:  Circuit: './simulation/buffer.spice'
    Circuit ./simulation/buffer.spice contains 8 device instances.
      Class: pfet                  instances:   4
      Class: nfet                  instances:   4
    Circuit contains 7 nets.
    Contents of circuit 2:  Circuit: 'buffer_x1.spice'
    Circuit buffer_x1.spice contains 8 device instances.
      Class: pfet                  instances:   4
      Class: nfet                  instances:   4
    Circuit contains 7 nets.
    Circuit 1 contains 8 devices, Circuit 2 contains 8 devices.
    Circuit 1 contains 7 nets,    Circuit 2 contains 7 nets.
    Final result:
    Circuits match uniquely.
    Logging to file "comp.out" disabled
    LVS Done.

두 회로가 일치한다는 보고를 얻는다.

III. 시뮬레이션

방법론은 물론 추상화 수준이 전환되면 두 설계물의 등가성 확인은 필수 사항이다. 이와 더블어 전환 전후의 회로의 물리적인 변화는 시뮬레이션을 통해 확인 되어야 한다. 전환 전의 시뮬레이션을 Pre-Simulation, 전환된 후의 시뮬레이션을 Post-Simulation 이라 한다. 실물에 가까울 수록 시간 지연을 예상 할 수 있다.

III-1. 시뮬레이션용 네트리스트

레이아웃은 실물에 가깝다. 트랜지스터의 채널은 물론 드레인과 소스 기하학적 모양과 배선으로 인한 기생 성분이 추가된다. 미리 작성해둔 스크립트를 이용하여 레이아웃으로부터 시뮬레이션용 네트리스트를 추출한다.

    $ ./extract_spice_sim.sh buffer_x1

III-2. 테스트 벤치

XSchem을 활용하여 SPICE 시뮬레이션용 테스트 벤치를 작성한다. 회로도와 레이아웃의 심볼을 만든 후 테스트벤치에 사례화 하였다. 두 회로는 기능적으로 동일 하므로 입력에 대한 전압 변화의 관찰(voltage sweep)은 의미없다. 트랜지스터의 기하학적 모양과 배선으로 인한 기생 성분을 반영한 경우 지연을 예상 할 수 있다. 시간축상의 출력 변화를 살펴보기로 한다. 이를 통과시간(transient) 시뮬레이션이라고 한다. 테스트벤치는 아래와 같다.

입력으로 시간상 변화하는 전압을 pulse()로 표현하였다. SPICE는 pulse외에 수학 함수를 포함하여 다양한 방식으로 전압원을 생성할 수 있다[1].

시뮬레이션 명령은 .tran 이다.

    .tran 0.01n 50n

50 나노초까지 시뮬레이션을 진행하며 관찰 간격은 0.01나노초다.

III-3. 시뮬레이션 결과

테스트벤치에 두 설계물을 각각 사례화 한 후 시뮬레이션을 수행하였다. 전류 소모의 비교를 위해 전원 공급원을 따로 두었다. 시뮬레이션 결과는 아래와 같다.

간단한 인버터 회로를 대상으로 대하여 오픈-소스 설계 자동화 도구의 사용법을 살펴봤다. 오픈-소스 반도체 설계 자동화 도구와 상용 도구를 굳이 비교할 필요는 없다. 도구 사용법은 사용자 편의성을 고려했다 뿐이지 다 거기서 거기다. 어떤 도구를 가졌는가 보다 어떤 내용을 담을지 생각하자.

다음 편에서는 좀더 복잡한 회로를 다뤄보기로 한다.

---------------------------------------------------------------------

[1] SPICE 'Quick' Reference Sheet, https://kolegite.com/EE_library/books_and_lectures/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BD%D0%B0%20%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%B0%D0%BD%D0%B5%D1%82%D0%BE%20%D0%B2%20%D0%95%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%B0%D1%82%D0%B0/spice_ref.pdf

[2] An introduction to the MAGIC VLSI design Layout System, https://terpconnect.umd.edu/~newcomb/vlsi/magic_tut/Magic_x3.pdf








2024년 7월 19일 금요일

"VLSI 레이아웃 설계 기초" [6] Magic 실습: 인버터 레이아웃 (Layout Design)

"VLSI 레이아웃 설계 기초"
[6] Magic 실습: 인버터 레이아웃(Layout Design)

"VLSI 레이아웃 설계 기초"는 "내 칩(My Chip) MPW 서비스": 오픈-소스 도구 활용 반도체 설계 특별과정 중 첫번째 강좌다. 오픈 소스 도구의 기초적인 사용법과 레이아웃 설계와 검증을 정성적으로 다룬다(Quantative approach to VLSI layout design using Open-Source EDA tools).

강의 내용은 아래와 같다.

[1] 리눅스 및 VLSI 레이아웃 도구 설치 [링크]
[2] XSchem, CMOS 인버터 회로도 작성과 시뮬레이션 [링크]
[3] Magic, CMOS 인버터 레이아웃 작성과 회로추출 [링크]
[4] Netgen, 추출한 회로 비교(LVS) [링크]
[5] XSchem 실습: 인버터 회로도 (Schematic Design) [링크]
[6] Magic 실습: 인버터 레이아웃 (Layout Design) [링크]
[7] Netgen 실습: 네트리스트 비교 및 회로 시뮬레이션 [링크]
[8] Std-Cell 제작 실습: DFF-SR [링크]

--------------------------------------------------------

목차

I. 인버터 레이아웃 그리기
    I-1. 작업 폴더
    I-2. 레이아웃 그리기
        (1) Magic 실행
        (2) 상자 도구(BOX Tool)
        (3) 상자 칠하기
        (4) 인버터 그리기
    I-3. 명령 창 프롬프트
    I-4. 자주쓰는 명령들
    I-5. DRC, 그리기 규칙 검사

II. 네트리스트 추출
    (1) 명령 도움말 보기
    (2) 용도별 네트리스트 추출 옵션
    (3) 스케일 옵션
    (4) 스크립트 불러오기
    (5) 트랜지스터 모델

III. 테스트 벤치 작성
    (1) XSchem: 네트리스트 심볼
    (2) 테스트 벤치 회로도

IV. 시뮬레이션
    (1) 테스트벤치의 네트리스트
    (2) 회로 시뮬레이션과 결과보기

--------------------------------------------------------

I. 인버터 레이아웃

Magic 으로 인버터의 레이아웃을 그린다. 재사용을 위해 하위회로(sub-circuit) 형식으로 작성한다. 오픈-소스 레이아웃 도구 Magic은 계층화된 레이아웃 그리기를 할 수 있다.

I-1. 작업 폴더

작업 폴더로 이동,

    $ cd
    $ mkdir Tutorials/1-2_Inverter_Magic
    $ cd Tutorials/1-2_Inverter_Magic

Magic 의 환경 설정 파일 복사,

    $ cp ~/ETRI050_DesignKit/tech/etri050.magicrc .magicrc

실습 디렉토리 구조:

실습에 사용된 도구:

- XSchem
- Magic
- Netgen


I-2. 레이아웃 그리기

인버터 회로의 레이아웃을 그린다.

(1) Magic 실행

인버터 레이아웃의 이름을 inverter_x1으로 주고 Magic 실행,

    $ magic -d XR inverter_x1

대화형 DRC 켜기(drc on), 눈금 표시(grid on) 명령을 주어 그리기 창을 준비한다. 상자의 크기를 알려주는 명령은 box 다. 명령 box는 옵션에 따라 다양한 용도를 가진다.

도움말 명령 help 로 box의 옵션들을 볼 수 있다. 레이아웃 그리기에서 사용할 수 있는 다양한 명령들도 함께 보여준다. 당장 모두 사용하지는 않겠지만 이런 명령들이 있다는 것을 알아두자.

Magic의 눈금은 람다 규칙(Lambda Rule)을 따른다. 테크 파일에 1 람다를 0.3um로 정의 하였다. 환경 설정에 1 람다를 3등분 한 눈금을 적용하였다.

    scalegrid 1 3

따라서 최소 상자의 크기는 0.1x0.1um 다.

(2) 상자 도구(BOX Tool)

- 마우스 왼쪽 버튼은 상자의 하단-왼쪽 구석 지정
- 마우스 오르쪽 버튼은 상자의 상단-오른쪽 구석 지정

(3) 상자 칠하기

상자 안을 레이어로 칠하는 명령은 paint 다. 마우스를 이용하여 상자를 놓은 후 pdiff 와 poly 레이어를 칠한다.

디퓨젼 레이어 pdiff 와 폴리 실리콘 레이어 poly 가 겹친 부분이 자동으로 트랜지스터 채널로 변했다. 단축 키 'a'는 커서 아래의 레이어를 선택한다. 긴 명령은 select area다. 선택된 상자의 레이어를 알려면 what 명령을 사용한다. 단축 키 'b'는 상자의 크기가 폭 0.6um 높이 2.0um라고 알려준다.

(4) 인버터 그리기

DRC 오류가 나지 않도록 유의하면서 아래와 같은 인버터를 그린다. 회로를 구성하는 각 레이어의 접점(노드)에 레이블을 붙인다. 외부도구로 노출되는 레이블은 포트로 지정한다. 포트는 외부의 도구들에 의해 참조 되므로 다수의 포트를 가지는 경우 그 순서에 매우 주의해야 한다. SPICE 네트리스트를 포함하여 많은 자동화 도구들이 위치 매핑(positional port mapping) 방식을 쓰고 있다.



I-3. 명령창 프롬프트

Magic의 마우스 사용법이 다소 생소하지만 상자를 이해하면서 익숙해 지도록 한다. 옵션을 주어야 하거나 긴 명령은 명령창의 프롬프트에 입력해준다. 편집 창에서 ':'을 누르면 명령창에 긴명령을 입력할 수 있는 프롬프트가 나타난다.

레이아웃을 그리면서 근 명령(또는 옵션이 있는 명령)을 사용할 경우 프롬프트를 부른다. 긴 명령이 아닌경우 매번 명령창을 띄우려면 번거롭다. 그리기 창에서 사용하는 단축 키 명령들도 함게 익혀두면 생산성이 매우 높아질 것이다.

I-4. 자주쓰는 명령들

 레이아웃을 그리면서 자주 쓰는 레이어 편집 명령들은 아래와 같다. 명령과 함께 사용되는 옵션의 의미를 이해하자.

    box [Left Bottom Right Top] - 옵션 없이 사용될 경우 현재 상자의 좌표를 알려준다. 단축키는 'b'다.

    paint [layer] - 상자 내를 layer 로 칠한다. 단축키 'p' 를 누르면 명령창에 칠할 레이어 입력을 기다린다.

    erase <layer> - 상자로 선택한 내용물들을 지운다. 여러 레이어가 선택된 경우 지울 레이어를 지정할 수 있다.

    delete - 선택된 개체(레이어 또는 하위 셀 등)를 지운다. 단축키는 'd' 다.

    select <area> - 커서 아래의 레이어를 선택한다. 단축키는 's'. 동일 위치에서 단축키를 반복해서 누르면 연결된 레이어가 모두 선택된다. area 옵션은 상자 내의 모든 레이어 선택 한다. 단축키는 'a' 다.

    copy <to x y> - 선택한 개체를 마우스 커서로 복사한다. 기준 좌표는 상자의 좌측-하단 점이다. 단축키는 'c' 다. copy to 는 선택된 개체를 현재 위치에서 xy 의 거리로 복사한다. 거리는 람다 혹은 단위를 지정할 수 있다. 마이크로 미터의 단위는 u 다.

    move <to x y> - 선택한 개체를 마우스 커서로 이동한다. 단축 키는 'm' 이다. 자판의 숫자 키패드 화살표 키를 사용하면 선택한 개체를 1 그리드 씩 이동 시킨다.

보기와 화면 이동에 관련된 명령 들은 아래와 같다.

    pan - 자판의 화살표 키를 사용하여 현재 화면을 상하좌우로 이동

    view - 현재 그려놓은 전체 모습을 보여준다. 단축키는 'v' 다.

    zoom <value> - 옵션으로 주는 value 만큼 화면을 확대축소 한다. 단축키 'z' 는 확대, 'Z '(shift+z)는 축소. 자판의 숫자 키패드 '5'는 상자 내를 확대한다.

연결 지점에 저마다 고유의 라벨(label)을 붙여준다. 특히 계층적인 회로 그리기와 다른 자동화 도구(시뮬레이터, LVS, P&R 등)으로 내보내려면 포트(port) 명을 지정해 놓아야 한다. 선택한 레이어에 라벨을 붙이는 명령은 아래와 같다.

    label [name] [l|r|t|b|c] <layer> - 상자의 좌,우,위,아래,중앙에 라벨 name 을 붙인다. 라벨이 붙일 레이어를 지정한다.

    port make - 라벨 포트로 지정하여 외부 도구들에 노출 시킨다.

    port index <number> - 포트의 순서를 지정한다. 낮은 추상화 수준의 설계도구들(SPICE 시뮬레이터, XSchem 회로도, LVS 등)은 하위 모듈을 배선할 때 이름 매핑(named port mapping)을 지원하지 않으므로 포트의 순서에 일관성을 유지하도록 한다. 다수의 입출력을 가진 하위 모듈의 포트의 순서 매핑(positional mapping) 혼란은 계층적 회로설계에서 큰 낭패를 볼 수 있다.

I-5. DRC, 그리기 규칙 검사

그리기 규칙 검사 DRC (Design-Rule Check) 명령은 drc 다. 여러 옵션을 가지고 있다. 중요 옵션 사용법은 아래와 같다.

    drc [on|off- 대화형 DRC 기능을 켜거나 끈다.

    drc catchup - 전 영역에 대하여 DRC 수행한다. 검사가 끝날때 까지 대기.

    drc check - 상자 영역 내에서 DRC 수행

    drc count [total] - DRC 오류가 난 갯수

    drc find [n-th|next] - n-번째 오류난 위치로 상자 이동. 또는 다음 DRC 오류 위치 찾기

    drc why - DRC  오류의 원인을 알려준다.

- DRC 관리창: 메뉴 Options > DRC Manager

DRC를 검사하여 오류가 난 지점의 좌표를 표시한다. 오류 지점을 선택하여 'Zoom' 버튼을 누르면 해당위치로 상자를 이동시켜 확대해준다.


II. 네트리스트 추출

(1) 명령 도움말 보기

레이아웃으로부터 회로의 네트리스트를 추출하는 명령은 extract 다. 최상위 셀에서 하위 셀까지 포함하는 네트리스트를 추출하는 옵션은 all 이다. 명령에 help를 주면 사용할 수 있는 옵션의 도움말을 볼 수있다.

(2) 용도별 네트리스트 추출 옵션

추출된 네트리스트 화일의 확장자는 .ext 다. 명령 ext2spice 로 SPICE 네트리스트를 얻을 수 있다. 추출한 네트리스트의 용도(시뮬레이션 또는 LVS)에 따라 다양한 옵션을 사용할 수 있다.

ngSpice로 회로 시뮬레이션을 위한 네트리스트를 뽑기 위해 옵션을 준다. 네트리스트의 재사용을 위해 계층적 네트리스트 옵션을 켰다.

    ext2spice default
    ext2spice format ngspice
    ext2spice hierarchy on
    ext2spice subcircuit on

기생 C 와 저항 성분을 네트리스트에 반영하기 위해 제한 옵션(cthresh 와 rthresh)은 주지 않았다. 옵션을 마치고 네트리스트를 생성한다.

    ext2spice

생성된 SPICE 네트리스트는 다음과 같다.

    * NGSPICE file created from inverter_x1.ext - technology: scmos

    .option scale=100n

    .subckt inverter A Y vdd gnd
    M1000 Y A gnd gnd nfet w=20 l=6
    +  ad=0.42n pd=82u as=0.42n ps=82u
    M1001 Y A vdd vdd pfet w=20 l=6
    +  ad=0.42n pd=82u as=0.42n ps=82u

    C0 Y gnd 2.00114f
    C1 vdd gnd 4.13658f

    .ends

작지만 기생 커페시턴스가 추출된 것을 볼 수 있다.

(3) 스케일 옵션

레이아웃에 그려진 두 트랜지스터의 모델 명은 nfet와 pfet 며 게이트 채널의 폭과 길이가 명시되었다. 이 값은 .option 의 크기 배율 scale 의 배수를 의미한다. 배수 옵션 없이 절대값으로 표현되려면 아래 명령을 주고 네트리스트를 추출한다.

    ext2spice scale off

단위 배수 없이 추출된 네트리스트는 다음과 같다.

    * NGSPICE file created from inverter.ext - technology: scmos

    .subckt inverter A Y vdd gnd
    M1000 Y A gnd gnd nfet w=2u l=0.6u
    +  ad=4.2p pd=8.2u as=4.2p ps=8.2u
    M1001 Y A vdd vdd pfet w=2u l=0.6u
    +  ad=4.2p pd=8.2u as=4.2p ps=8.2u

    C0 Y gnd 2.00114f
    C1 vdd gnd 4.13658f

    .ends

(4) 스크립트 불러오기

베릴로그 처럼 인간언어에 가까운 높은 추상화 수준의 설계도구들은 사용할 수 있는 옵션을 줄이고 설계 규모의 확대가 목적이다. 이에 비해 낮은 추상화 수준의 전자회로 설계 도구는 수많은 옵션을 사용한다. 실세계(real-world)에서 벌어지는 경우의 수를 최대한 감안하려면 엄청난 분석과 인수화 기법이 동원되기 때문이다.

반복적으로 사용되는 수많은 옵션들을 설계할 때마다 매번 명령줄에 입력하기는 어렵다. 인간의 지루함으로 인한 실수를 예방하기 위해서라도 명령의 직접 입력은 가급적 배제해야 한다. 반복적인 명령 주기 절차를 표준화 시켜 스크립트로 작성해 놓고 불러오도록 한다. 반도체 설계 방법론을 '스크립팅 플로우'라고 부른다. 상용 도구도 예외는 아니어서 스크립트 작성에 능한 사람을 고급 엔지니어라고 칭하기도 하지만 예우일 뿐이다.

[] OpenROAD-flow-scripts (ORFS), https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts

Magic을 포함하여 대부분 EDA 도구들은 Tcl 스크립트를 처리할 수 있다. 회로 시뮬레이션용 네트리스트를 생성하기 위한 명령 절차를 스크립트로 작성하자. 파일명은 gen_spice_netlist.tcl 이다.

    extract all

    ext2spice default
    ext2spice format ngspice
    ext2spice hierarchy on
    ext2spice subcircuit on
    ext2spice scale off

    ext2spice

Magic의 명령창에서 스크립트를 불러오는 명령은 source 다.

    % source gen_spice_netlist.tcl


(5) 트랜지스터 모델

네트리스트에 표현된 트랜지스터의 길이와 폭 외에 영향을 미치는 인자로 ad, pd, as, ps 가 보인다. 트랜지스터의 게이트의 양측에 위치한 두 디퓨전(드레인 과 소스)이 갖는 저항을 계산하기 위한 인자들이다. 각각 드레인 측 디퓨전의 면적(ad)과 둘레(pd), 소스 측 디퓨젼의 면적(as)과 둘레(pd)를 나타낸다. 회로도에서는 반영되지 않는 설계요소들이다. 반도체 물질의 특성과 동작을 모델링 하기 위해 매우 정교하고 복잡한 이론이 동원되고 있다는 것을 알 수 있다[1].

[출처] https://aicdesign.org/wp-content/uploads/2018/08/lecture07-140310.pdf

트랜지스터의 단순한 심볼 이면에 엄청난 이론이 담겨 있다는 점을 기억해 두자. 그런 만큼 회로 시뮬레이션은 엄청난 계산량을 요구한다.

[출처] https://aicdesign.org/wp-content/uploads/2018/08/lecture06-140818.pdf


III. 테스트 벤치 작성

SPICE 문법체계로 기술된 회로를 시험하기 위한 환경(테스트 벤치)을 구성한다. 동일한 언어 를 사용해야 하지만 SPICE 언어 체계가 인간이 보기에 매우 불편하다. 위치 매핑만 봐도 그 불편함이 드러난다.

레이아웃에서 추출한 네트리스트 DUT의 테스트 벤치 작성을 추상화 수준이 높은 그림 형식의 작성도구를 활용 하기로 한다. 이미 회로도 설계에 사용했던 XSchem 이다.

(1) XSchem: 네트리스트 심볼

레이아웃에서 추출한 네트리스트는 inverter_x1.spice 다. 이를 상위 회로도에서 참조할 심볼을 만든다. 앞서 회로도의 심볼을 만드는 과정과 동일하다. 다만 심볼의 속성에 네트리스트를 대표 한다고 지정한다.

    type=subcircuit
    format="@name @pinlist @symname"
    spice_sym_def=".include ../inverter_x1.spice"
    template="name=x1"


(2) 테스트 벤치 회로도

XSchem으로 작성하는 테스트 벤치는 앞선 회로도 인버터의 것과 동일하다. 다만 DUT가 네트리스트의 심볼로 대체되었을 뿐이다.


IV. 시뮬레이션

네트리스트 생성에 이어 회로 시뮬레이션 수행 그리고 결과 관찰의 과정은 회로도의 경우와 동일하다.

(1) 테스트벤치의 네트리스트

테스트벤치의 네트리스트를 보면 레이아웃에서 추출한 회로를 들여오고 있다. DUT 인 inverter_x1의 위치 포트 매핑에 유의하자.

    ** sch_path: /home/goodkook/ETRI050_DesignKit/Tutorials/1-2_Inverter_Magic/inverter_x1_TB.sch
    **.subckt inverter_x1_TB

    Vdd VDD GND 5
    R1 VDD Vout 1mega m=1
    Vin Vin GND 0
    x1 Vin Vout VDD GND inverter_x1

    **** begin user architecture code
    * ngspice commands
    .include ~/ETRI050_DesignKit/devel/tech/05cmos_model_240201.lib

    .dc vin 0 5 0.01
    .save all

    **** end user architecture code

    * expanding   symbol:  ~/Tutorials/1-2_Inverter_Magic/inverter_x1.sym # of pins=4

    ** sym_path: ~/Tutorials/1-2_Inverter_Magic/inverter_x1.sym
    .include ../inverter_x1.spice

    .GLOBAL VDD
    .GLOBAL GND

    .end

(2) 회로 시뮬레이션과 결과보기

- ngSpice 로 시뮬레이션 수행

- 결과 파형 관찰

회로도로 설계한 인버터의 결과와 차이를 알아볼수 없을 정도로 미미하다. 이번 테스트 벤치는 시뮬레이션 방법을 입력 전압증가에 따른 출력변화(voltage-sweep)를 관찰하였다. 파형의 가로와 세로축 모두 전압치다. 시뮬레이션 방법을 시간축으로 살펴보도록 시뮬레이션 방법을 바꿔서 관찰하면 레이아웃 설계가 미치는 영향을 살펴 볼 수 있다.

다음 실습은 서로다른 추상화 수준에서 설계한 두 설계물의 LVS 등가성을 확인하고 시간축 상의 시뮬레이션(SPICE transient simulation)을 통해 차이(지연특성)를 비교해 보기로 한다.