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)을 통해 차이(지연특성)를 비교해 보기로 한다.


댓글 없음:

댓글 쓰기