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








댓글 없음:

댓글 쓰기