레이블이 ALU8인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ALU8인 게시물을 표시합니다. 모든 게시물 표시

2024년 1월 26일 금요일

ETRI 0.5um CMOS DK 예제: ALU8[11]/실습 요약

ETRI 0.5um CMOS DK 예제: ALU8[11]

실습 요약

* 본문을 읽기전에 따라해보기

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

+----------------+                               +------------------+
|Verilog RTL ----|----------------+           +--| Executable Spec. |
+-----+----------+                |           |  +------------------+
      |              +------------V-----------V--------------+
      |              | Functional Simulation                 |
     (?)<<<<<<<<<<<<<<   VERILATOR: Verilog to C++ Converter |
      |              |              SystemC/C++ Testbench    |
      |              +------------------------+--------------+
+-----V-------------------------+             |
|Yosys: RTL Synthesis  <---[Std-Cell Liberty] |
|    -> SPICE Netlist for LVS --|-------------|-------+
|    -> Verilog Netlist         |             |       |
|         for P&R and Post-Sim -|----+        |       |
+---------------+---------------+    |        |       |
                |                    |        |       |
      +---------+     +--------------V--------V-------:---------+
      |               |Post-Simulation <- SystemC Testbench     |
     (?)<<<<<<<<<<<<<<<  Syn. Netlist/Std-Cell's Functional Lib.|
      |               +-------------------------------:---------+
+-----V-------------------------+                     |
|GrayWolfPlacement  <------[Std-Cell LEF/Size]      |
|    -> Unrouted DEF            |                     |
+-----------------+-------------+                     |
                  |                                   |
      +-----------+                                   |
      |                                               |
+-----V-------------------------+                     |
|QRouterRoute     <-------[Std-Cell LEF/Route Rule] |
|    -> Routed DEF              |                     |
+---------------+---------------+                     |
                |                                     |
      +---------+                                     |
      |                                               |
+-----V-------------------------+                     |
|Magic: Migration  <-------[Std-Cell Layout(Mag/GDS)] |
|    -> SPICE Netlist for LVS --|------+              |
|    -> Merged Layout ----------|------|------+       |
+--------------+----------------+      |      |       |
               |      +----------------V------:-------V-------+
      +--------+      | LVS         (Layout vs. Schematic)    |
     (?)<<<<<<<<<<<<<<<     Netgen: SPICE netlist compare     |
      |               +-----------------------:---------------+
+-----V-------------------------+             |
|MagicDRC / Stacked VIA       |             |
|     -> Fixed Layout ----------|------+      |
+---------------+---------------+      |      |
                |      +---------------V------V---------------+
      +---------+      | LVL      (Layout vs. Layout)         |
     (?)<<<<<<<<<<<<<<<<    Netgen: SPICE netlist compare     |
      |                +--------------------------------------+
+-----V-------------------------+
|Magic: GDS Generation          |
|        with ETRI Tech.Rule    |
+---------------+---------------+
                |
          +-----V------+
          |   GDS-II   |
          +------------+
|<------ Design Flow ------>|<------ Verification Flow ------->|

0. 사전준비

    - ETRI 0.5um Std-Cell Design Kit 설치[바로가기]
    - 오픈 소스 툴 설치

        * QFlow / ETRI050
        * Yosys: 합성기
        * GrayWolf: 표준 셀 자동배치
        * QRouter: 자동 배선
        * NetGen: 레이아웃(네트리스트) 비교/LVS
        * Magic: 레이아웃 편집/변환/디자인 룰 검사/GDS 생성

1. 내려받은 예제 파일 압축 풀기

    - 예제 소스 내려받기 [다운로드]
    - 압축 풀기/폴더 구조에 유의할 것
    - 'source' 폴더에 베릴로그 파일 읽어볼 것: RTL 의 이해
        * ALU_wrapper.v
        * ALU.v

2. 시스템 수준 기능 검증 실시/SystemC-HDL Co-Simulation

    - SystemC: 높은 추상화 수준 테스트 벤치 작성
    - Verilog HDL 감싸개(wrapper)
    - 언어변환기(베릴레이터) 사용 테스트 벤치 빌드

    $ cd simulation

    $ verilator --sc -Wall --top-module ALU_wrapper --exe --build \
        ../source/ALU.v ../source/ALU_wrapper.v sc_main.cpp

    $ obj_dir/VALU_wrapper

3. ETRI 0.5um CMOS 공정으로 합성/네트리스트 시뮬레이션

    $ qflow synthesis -T etri050 ALU_wrapper

    - Yosys 합성기
    - synthesis 폴더에 생성된 네트리스트 파일들의 의미
        * RTL 에서 표준 셀의 네트리스트로 추상화 낮춤 변환

    - Netlist simulation (Zero-Delay Functional)

    $ verilator --sc --top-module ALU_wrapper --exe --build \
            ../../../digital_ETRI/khu_etri05_stdcells_func.v \
             ../synthesis/ALU_wrapper.v sc_main.cpp

4. 자동 배치

    $ qflow place -T etri050 ALU_wrapper

    - 표준 셀 배치
    - 자동배치 옵션
        * 배치밀도(initial_density)
        * 배치 가로세로비(aspect ratio)
        * 핀 위치(CEL2)

5. 자동 배선

    $ qflow route -T etri050 ALU_wrapper

    - 겹친 접점(Stacked Via) 금지

6. 표준 셀 병합(migration)

    $ qflow migrate ALU_wrapper

    - Magic DB 스크립트
    - 배선 후 DEF 에서 레이아웃 파일(ALU_wrapper.mag) 생성

7. 레이아웃 네트리스트와 합성 네트리스트 비교

    $ qflow lvs ALU_wrapper

    - LVS 오류 발생 시 조치
    - Magic 레이아웃 편집기로 배선되지 않은 네트를 찾아 수정

    $ magic -d XR ALU_wrapper.mag

    - 유용한 Magic 명령어:
        - select, expand
        - goto <net name>
        - findbox [zoom]
        - save ALU_wrapper_lvs

    - 수정 후 LVS 재실시: LVS 수정 레이아웃(ALU_wrapper_lvs.mag)

    $ ./run_lvs.sh ALU_wrapper_lvs

        LVS 스크립트: run_lvs.sh

    #!/usr/bin/bash
    # Extract Spice for LVS
    ../../../scripts/extract_spice.sh $1
    # LVS check with Synthesis netlist
    netgen -noc -batch lvs \
        "$1.spice $1" \
        "../synthesis/ALU_wrapper.spc ALU_wrapper" \
        setup.tcl \
        LVS_$1.txt

8. 겹친 접점(Stacked Via) 검사

    $ .../scripts/check_via_stack.py ALU_wrapper_lvs \
            m2contact m3contact 6

    - 겹친 접점 에러 표시된 레이아웃(ALU_wrapper_lvs_Stacked.mag) 편집

    $ magic -d XR ALU_wrapper_lvs_Stacked.mag

    - Magic 레이아웃 편집기로 겹친 접점 수정

    - 유용한 Magic 명령어:

        - select, expand
        - drc find next
        - findbox zoom
        - save ALU_wrapper_lvs_Stacked_Fixed
        - 숫자키 패드(방향키) 사용

    - 수정 후 LVS 재실시: 겹친 접점 수정 레이아웃

    $ ./run_lvs.sh ALU_wrapper_lvs_Stacked_Fixed

9. 디자인 룰 체크(DRC)

    $ magic -d XR cpu_lvs_Stacked_Fixed

    - 유용한 Magic 명령어:

        - select top cell
        - expand
        - drc [on/catchup/check/count]
        - snap off
        - grid on
        - erase [layer]
        - 단축키: ':', 'a', 's', 'S', 'z', 'Z', 'x', 'X', 'p', 'u'
        - 숫자키 패드(방향키) 사용
        - DRC manager 창 열기
        - save ALU_wrapper_drc_Fixed

    - 수정 후 LVS 재실시: DRC 수정 레이아웃

    $ ./run_lvs.sh ALU_wrapper_drc_Fixed

10. 입출력 정리

    - 자동화 도구 경직성
        * 지능적이지 않다.
        * 이해하기 곤란한 배선

    - 수정하려면 끝이 없다. 입출력 패드 달기전에 보이는 것 만이라도...

    - 수정 후 DRC & LVS 재실시: 수정 레이아웃(ALU_wrapper_Core.mag)

    $ ./run_lvs.sh ALU_wrapper_Core

11. 입출력 패드 달기

    - chip_top 작업 폴더

    $ pwd

    $ ls -la

    -rwxr-xr-x 1 goodkook ...... .magicrc
    -rw-r--r-- 1 goodkook ...... MY_LOGO.mag
    lrwxrwxrwx 1 goodkook ...... digital_ETRI -> .../digital_ETRI
    lrwxrwxrwx 1 goodkook ...... pads_ETRI050 -> .../pads_ETRI050

    - DRC 완료된 코어 레이아웃 네임-링크

    $ ln -s ../layout/cpu_Core.mag ALU_wrapper_Core.mag

    - 패드 프레임 복사

        * MPW는 칩의 면적과 입출력 핀 수가 고정되어 있다.

    $ cp pads_ETRI050/PAD_FRAME_1825_28pin.mag ALU_wrapper_Top.mag

    - 입출력 패드 배선

    $ magic -d XR ALU_wrapper_Top

    - 유용한 Magic 명령어:

        - box
        - getcell

    - 프레임 에서 코어를 읽어들인 후 입출력 패드 셀 편집

        * 텍스트 편집기 사용

12. GDS 생성

    - 코어와 입출력 패드 배선 ALU_wrapper_Top 에서 각기 다른 경로로 만들어진 부분 분리

    I. 입출력 패드

        - 디자인 킷 스크립트 xPad.py 사용

        $ ....../scripts/xPad.py ALU_wrapper

        - 외부 도구로 제작되어 GDS로 제공된 라이브러리(검증됨)
        - DRC 하지 말것
        - 컨택의 컷(cut)과 오버행(overhang)이 구분되어 있다.

    II. 코어

        - 합성으로 생성된 레이아웃
        - DRC 완료된 Magic 형식
        - 컨택의 컷과 오버행 분리 않됨

    III. 입출력 패드와 코어 배선

        - 디자인 킷 스크립트 xPin_Route.py 사용

        $ ....../scripts/xPin_Route.py ALU_wrapper

        - 입출력 패드와 코어사이의 수동배선
        - DRC 필요
        - 컨택의 컷과 오버행 분리 않됨

    - 코어와 입출력 패드 수동 배선

    ALU_wrapper_Top
    +--------------------------------------+
    |  ALU_wrapper_Pad (MPW Pad Frame)     |
    |    +-----------------------------+   |
    |    |   ALU_wrapper_Pin_Route     |   |
    |    |      +-------------------+  |   |
    |    |      | ALU_wrapper_Core  |  |   |
    |    |      |                   |  |   |
    |    |      |                   |  |   |
    |    |      |                   |  |   |
    |    |      |                   |  |   |
    |    |      +-------------------+  |   |
    |    +-----------------------------+   |
    +--------------------------------------+

    - 칩-탑 구성 요소 분리 후 GDS 생성 및 병합

+--------------------------------------------+      GDS Merge
|  cpu6502_Pad                               |-+   +----------------+
+--------------------------------------------+ |   |                |
                                               +-->| istyle(ETRI-G) |
+------------------------+      GDS Generate       | label off      |
| cpu6502_Pin_Route (DRC)|--+  +--------------+ +->|                |
+------------------------+  +->| flatten      | |  +----------------+
                               | ostyle(ETRI) +-+
+--------------+            +->| gds write    |
| cpu6502_Core |------------+  +--------------+
+--------------+               * Contact/Via Rule

    - 최종 GDS 생성

    $ ../../../scripts/generate_chip.sh ALU_wrapper <um><um><um><um>


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

[목차][이전]


2024년 1월 1일 월요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [목차/맺음말]

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8

목차:


I. 개요

    I-1. 설계 및 검증 흐름
    I-2. QFlow: 오픈 소스 도구의 통합관리
    I-3. 오픈 소스 도구들의 설치
    I-4. SystemC: C++ 기반의 RTL 시뮬레이션
    I-5. VERILATOR: 베릴로그에서 C++로 변환

II. 예제 ALU8의 베릴로그 RTL

    II-1. 폴더 구조
    II-2. 예제 ALU의 베릴로그 RTL 구성

III. 기능 시뮬레이션(Functional Simulation)

    III-1. SystemC 테스트 벤치
    III-2. 기능 시뮬레이션

IV. 합성(Synthesis)

    IV-1. RTL 합성기의 역활
    IV-2. Yosys 합성기로 예제의 RTL 합성
    IV-3. Yosys 합성 스크립트
    IV-4. Yosys 합성 로그
    IV-5. 합성 후 검증(Post-Simulation)
            a. 테스트벤치 재사용(Testbench Re-Use)
            b. 커버리지 및 프로파일링 (Coverage & Profiling)
            c. 타이밍 시뮬레이션 (Timing Simulation)
            d. 무 지연 시뮬레이션(Zero Delay Simulation)

V. 자동 배치(Placement)

    V-1. GrayWolf: 표준 셀 자동 배치 도구

    V-2. 자동 배치 규칙

    V-3. 자동 배치의 출력: 배선 전 DEF와 LVS를 위한 SPICE 네트리스트

VI. 자동 배선(Auto-Routing)

    VI-1. QRouter: 자동배선 도구
    VI-2. 자동배선에 영향을 주는 인자
    VI-3. 자동 배선에 실패 했을 때 조치
    VI-4. 배선이 완료된 DEF

VII. 표준셀 병합(Migration)

    VII-1. Magic: 레이아웃 변환도구
    VII-2. 레이아웃 생성 티클 스크립트

VIII. 레이아웃 검증: LVS 및 DRC

    VIII-1. Netgen: 트랜지스터 회로 네트리스트 비교
    VIII-2. 서로다른 추상화 수준에서 표준 셀을 기술하는 양식
    VIII-3. 겹친 비아(Stacked VIA) 검사
        a. 배선과 비아 생성 규칙
        b. 자동배선 도구의 겹친 비아 금지 옵션
        c. 겹친 비아 검사
    VIII-4. Magic: 레이아웃 편집도구로 겹친 비아 수정
    VIII-5. Magic: 디자인 룰 검사

IX. 입출력 패드 붙이기

    IX-1. KLayout: 레이아웃 형식 변환도구
    IX-2. oa(OpenAccess) 형식 레이아웃 .mag 로 변환
    IX-3. 코어와 입출력 패드의 배치 및 배선

X. 마스크용 GDS 생성

    X-1. GDS 생성 절차
    X-2. GDS 생성 스크립트
    X-3. 최종 GDS

XI. 요약

XII. 맺음말

40년 전에도 대규모 집적회로 시스템 설계(VLSI System Design)라는 제목을 가진 수업이 있었다. 반도체 물질과 제조공정으로 시작해서 설계의 예라며 인버터의 모습을 보여줬다. 인버터와 플립플롭으로는 시스템 이라고 하기에는 모자랐던지 계통도와 알고리즘으로 훌쩍 넘어갔다. 중간 과정이 없이 칩 평면 사진을 보여주며 끝내 버리니 궁금증을 넘어 답답함만 쌓인채 과목을 마쳤다.

[이미지 출처] Visual 6502, http://www.visual6502.org/docs/6502_in_action_14_web.pdf

그후 한세대가 지났다. 반도체 설계방법도 눈부시게 발전해서 컴퓨터를 사용한 설계 자동화 도구들과 방법론이 일반화 되었단다. 모눈 종이 위에 그리던 인버터는 이제 화려한 컴퓨터 그래픽 장치 위에서 그릴 수 있게 됐다. 중간 단계도 발전해서 컴퓨팅 언어 기반의 반도체 설계 방법론이 이제 낫설지 않게 됐다. 하지만 화려한 칩 사진 앞에서 그 답답함은 가시지 않는다. 집적회로 교육과정은 인버터 그리기를 넘어 섰을까?

1980년대 초 반도체 설계 방법론을 3가지 측면으로 나눠 봤었다[Gajski–Kuhn chart]. 베릴로그나 VHDL 이라는 반도체 설계 언어조차 표준화 되기 전으로[Hardware Description Language]컴퓨터를 활용한 반도체 설계(VLSI hardware design) 자동화 시대가 열리기 직전이다. 세 영역 사이를 넘나들며 트랜지스터 회로의 레이아웃 도면으로 세분화 해가는 방법론을 자동화의 큰 과제로 삼았다.

추상화 수준(abstraction level)의 전이에 사용될 자동화 도구들이 등장하면서 각종 용어들이의 개념이 정의 되었다.

컴퓨팅 언어(하드웨어 언어+소프트웨어 언어)기반의 반도체 설계 자동화가 확립된 지금은 위의 Y자 모양 차트가 인용되는 경우는 거의 없지만 각종 용어와 개념들은 여전히 유효하다.

컴퓨터의 가격이 낮아지고 소프트웨어 생산 기술도 발달했다. 높은 비용에 엄두도 못내던 각종 설계 자동화 도구들도 이제 접하기 수월해졌지만 여전히 만만찮은 비용을 요구한다. 다행히 이런 답답함과 고비용의 장벽을 넘어보려는 다수의 노력 덕분에 오픈-소스 반도체 설계도구들이 상당한 수준에 이르럿다. 반도체 제조 공정 또한 학습자(또는 취미가)들에게 개방되고있다[KION My Chip MPW]FPGA 를 이용해 자신들이 즐기는 장비를 만드는 취미가들의 반도체 설계 능력도 수준급이다[Hermis Lite2 SDR].

예제를 통해 RTL에서 GDS까지 이르는 반도체 설계 전반을 살펴봤다. 표준 셀 기반 주문형 반도체 설계의 전과정에 대한 이해를 높일 수 있는 계기가 되었길 바란다. 반도체 설계 과정을 이해 하는데 빈 구간이 없어졌길 바란다. 반도체 설계 영역에서 사용되는 전문 용어들에 친숙해 졌길 바란다. 두루뭉술하지 않고 구체적이고 실질적인 학습정보가 제공 되었길 바란다.

국가 나노 인프라 협의체 KION의 "내칩(My Chip)" MPW 제작사업의 ETRI 0.5um CMOS 공정용 표준셀 기반 디지털 설계 디자인 킷이 공개되었다[링크]. 예제의 수행은 물론 디자인 킷의 제작에도 오픈-소스 설계도구들을 사용했다. 오픈-소스 도구들은 대중이 함께 발전 시킨 공동의 자산이다. 적극적으로 활용되어 더욱 발전되길 바란다.

오픈 소스 반도체 설계 도구의 의의를 설명한 논문을 인용해 본다.

OpenROAD: Toward a Self-Driving, Open-Source Digital Layout Implementation Tool Chain [link]

"오픈 소스 기획이 성공적으로 이뤄진다면 반도체 설계의 민주화 실현에 일조하는 것이다"

If successful,OpenROAD will help realize the IDEA goal of "democratization of hardware design", by reducing cost, expertise, schedule and risk barriers that confront system designers today.

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



ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [10]/마스크용 GDS 생성



ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [10]

X. 마스크 GDS 생성
X-1. GDS 생성 절차
X-2. GDS 생성 스크립트
X-3. 최종 GDS

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

X. 마스크용 GDS 생성

X-1. GDS 생성 절차

코어와 입출력 패드를 모두 배선한 Magic 레이아웃은 공정에 제출할 마스크 제작용이 아니다. 레이아웃을 제작하고 편집을 위한 도구용 파일이다. Magic의 레이아웃 편집 파일로부터 마스크 제작용 GDS를 생성하는 과정은 아래와 같다.

+-------------------------+
| Ext.Tools: |
| IO Pads(GDS-II) |
+-----------+-----+-------+
|
+-----------V-------------+ +--------------------------+
| Imported IO Pad Cells | | Std-Cells: Synthesis+P&R |
| IO Pad Frames(magic) | | Core(magic) |
+-----------------+-------+ +--------+-----------------+
| |
+----V--------------------V--------+
| Magic:Core-to-IP Pad Routing |
| Chip-Top |
+----+------------+------------+---+
| | |
[xPad.py] | [xPin_Route.py]
| | |
+----------V-----+ +---V------+ +-V------------+
| IO Pad Frames | | Core | | Pad Route |
+-------+--------+ +-------+--+ +---+----------+
........... | | |
/ {flatten} {flatten}
: | {cif ostyle lambda=0.30(ETRI)}
: | | |
: +----V-------------------V----------V----+
: | GDS generation |
: | (Via & Contact Cut) |
: +----+--------------+---------------+----+
: | | |
scripts/ { cif istyle lambda=0.30(ETRI-G) }
[generate_chip.sh] | | |
: | | |

: +----V--------------V---------------V-----+
: | GDS Merge & Flatten: |
: | Chip-Top |
: +-------------------+---------------------+
: |
: { flatten }
: { gds labels no }
: |
: +-------------------V---------------------+
: | Chip-Top (GDS) |
: +-------------------+---------------------+
\......................... |
V
Chip-Top.gds

다소 복잡해 보이지만 GDS 생성 과정은 대부분 설계라기 보다 파일 형식 변환의 과정이다. 최종 GDS 를 생성 하기전에에 서로 다른 도구와 조건으로 만들어진 세부분으로 분리한 후 각각 조건에 맞게 처리한다.

입출력 패드는 공급된 레이아웃이다. 외부 도구를 써서 완성된 GDS로부터 배선 편집을 위해 Magic 으로 들여왔다. 외부에서 들여온 패드 셀의 GDS 라이브러리에는 이미 비아 구멍이 뚫려 있다. 따라서 Magic으로 DRC를 수행 할 필요도 없고 (엄청나게 많은 에러를 내다가 끝내 죽는 참사가 나기 때문에) 수행하면 않된다.

코어는 Magic 으로 제작된 표준 셀을 가지고 만들어 졌으며 자체 DRC를 수행 했다. 다시 DRC 할 필요는 없다. 하지만 ETRI 공정 규칙에 맞도록 비아와 컨택 구멍을 생성(Via & Contact cut generation)해야 한다. GDS 생성시 이 규정을 적용하기 위해 출력 스타일을 lambda=0.30(ETRI)로 지정을 지정한다.

Magic으로 코어와 입출력 사이의 패드를 수동 배선 했다. DRC를 수행해줘야 하며 코어와 마찬가지로 ETRI 공정 규칙에 맞도록 비아와 컨택 구멍을 뚫도록 GDS/CIF 생성 스타일을 적용해야 한다.

각각 생성된 GDS를 모두 합친 후 평활화(flatten) 하고 편집에 사용했던 라벨들을 제거한다. 이미 비아의 구멍(cut)이 뚫린 상태 이므로 GDS/CIF 출력 스타일은 lambda=0.30(ETRI-G)를 적용하여 평활화된 GDS를 생성한다.
X-2. GDS 생성 스크립트

위의 최종 GDS 생성 과정을 보면 코어와 패드의 배선을 위한 편집 이후 평탄화와 GDS 생성이 반복된다. 검증된 스크립트를 만들어 줌으로써 반복적인 명령의 사용으로 인한 오류가 끼어들지 않도록 한다. 디자인 킷은 이를 위해 몇가지 스크립트를 제공한다. 스크립트의 사용법은 다음과 같다.


xPad.py

입출력 패드와 코어를 배선하기 위해 합쳤던 레이아웃에서 패드만 분리한다. 사용법은 다음과 같다.

$ xPad.py ALU_wrapper

ALU_wrapper_Top.mag에서 패드와 프레임 부분만 분리한 ALU_wrapper_Pad.mag 를 생성한다.



xPin_Route.py

코어와 입출력 패드 사이를 연결 했던 배선 부분만을 분리한다. 사용법은 다음과 같다.

$ xPin_Route.py ALU_wrapper

ALU_wrapper_Top.mag에서 패드와 프레임 부분만 분리한 ALU_wrapper_Pin_Route.mag 를 생성한다.



generate_chip.sh

코어 ALU_warapper_Core.mag, 패드 프레임 ALU_wrapper_Pad.mag 그리고 배선 ALU_wrapper_Pin_Route.mag 를 합친 후 최종 GDS를 생성한다.


$ generate_chip.sh
usage: generate_chip <core name> <route_x> <route_y> <core_x> <core_y>


쉘 스크립트의 인수 중 <route_x> 와 <route_y>는 패드 배선 ALU_wrapper_Pin_Route의 좌측하단의 좌표, <core_x> 와 <core_y>는 코어 ALU_wrapper_Core의 좌측하단의 좌표로 단위는 마이크로 미터(um) 이다.

$ generate_chip.sh ALU_wrapper 398 385.5 596.55 602.4
X-3. 최종 GDS

ALU_wrapper_Top.gds:




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

[목차][이전][다음]

2023년 12월 31일 일요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [9]/입출력 패드 붙이기

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [9]

IX. 입출력 패드 붙이기
    IX-1. KLayout: 레이아웃 형식 변환도구
    IX-2. oa(OpenAccess) 형식 레이아웃 .mag 로 변환
    IX-3. 코어와 패드의 배치 및 배선

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

IX. 입출력 패드 붙이기

RTL 문서를 합성하여 폭이 0.6 마이크로 미터 밖에 않되는 트랜지스터 수천개를 엮어 가로세로 1mm의 영역에 집적해 놨다. 이제 마이크로미터의 세계에서 미리미터의 세계로 옮겨갈 단계에 왔다. 반도체 부품은 결국 인간의 인지영역에서 사용된다. 적어도 기판에 땜을 하려면 미리미터 단위로 옮겨와야 한다. 마이크로 단위의 세계는 크기 만큼이나 작동에 필요한 에너지량도 매우 적다. CMOS 트랜지스터의 작동에 필요한 에너지는 나노 와트에 불과하다. 자연계에 부유하는 에너지에 과도하게 반응하거나 견디지 못히고 파괴되기도 한다. 마이크로 세계의 트랜지스터를 보호하고 의미있는 신호만을 걸러내는 장치가 입출력 패드(IO Pad)다[link].

[이미지 출처] De-Capped 6502, http://www.visual6502.org/docs/6502_in_action_14_web.pdf

[이미지 출처] https://pages.hmc.edu/harris/cmosvlsi/4e/lect/lect23.pdf

IX-1. KLayout: 레이아웃 형식 변환도구

ETRI 0.5um CMOS 공정의 PDK는 입출력 패드를 라이브러리로 제공하는데 파일 형식이 OAsis[link] 다. 이 형식은 오픈-소스 레이아웃 도구 Magic과 호환되지 않기 때문에 GDS-II로  변환 후 들여쓰기로 한다.

레이아웃 편집기들은 공정마다 정해진 레이어 규칙(디자인 룰)을 참조하여 변환한다. 레이아웃의 표현은 레이어 번호와 좌표로써 단순하다. 이에 덧붙여 반복 사용되는 블럭은 하위 블럭으로 정의하여 계층화된 레이아웃으로 기술한다. 레이아웃 편집기 Magic이 계층적 GDS를 바르게 처리하지 못하기 때문에 또다른 오픈-소스 KLayout[link]을 활용할 것이다. 두 도구는 비아(via)와 컨택(contact)을 처리하는 방식에서 큰 차이가 있다. Magic은 컷(cut)과 오버행(overhang)을 묶어서 표현하고 GDS 생성시 자동으로 구멍을 뚫는다. 그리고 Magic은 테크 파일에 정의되지 않은 레이어는 없는 것으로 무시하기 때문에 레이어 번호가 매우 중요한 반면 KLayout은 모든 레이어와 좌표를 있는 그대로 읽는다. KLayou 형식변환과 검토에 매우 유용한 도구로 쓰인다.

 


IX-2. .oa(OpenAccess) 형식 레이아웃 .mag 로 변환

기능은 단순한 선로에 불과 하나 마이크로 세계로 통하는 매우 중요한 역활을 담당하는 입출력 패드를 표준 셀 그리듯 쉽게 취급할 수 없다. 다행히 ETRI 공정의 PDK는 입출력 패드 셀 라이브리를 제공하고 있다.

ETRI 공정에서 제공한 입출력 패드 파일은 oa 형식 이다. 유사한 이름으로 OASIS(Open Artwork System Interchange Standare[link])가 있다. 반도체 도면 뿐만 아니라 PCB 도면, 기타 평면도를 그리는 상용 도구에서 사용된다[link]. LEF/DEF 처럼 전자설계 자동화 도구들 사이에 공용으로 사용하는 형식으로 추진 되었다. 이 형식은 집적회로 레이아웃으로 널리 쓰이는 GDS-II 형식을 이어받고 있다. 케이던스사의 버츄오소등 상용 레이아웃 도구에서 사용되고 있지만 Magic은 이 형식을 지원하지 않는다.

라이브러리로 제공된 OA(OpenAccess database)를 Magic에서 사용하려면 다소 복잡한 변환을 거쳐야 한다. 이 절차는 입출력 패드 뿐만 아니라 외부에서 (상용도구로) 제작된 레이아웃을 오픈-소스 레이아웃 도구로 들여올때 응용할 수 있다.

+-----------------------+
| OpenAccess DB: .oa    |
+-----------+-----------+
            |
    [Cadence Virtuoso]
            |
+-----------V-----------+
| GDS-II: .gds          |
+-----------+-----------+
            |
        [KLayout]
            |
+-----------V------------+
| GDS-II: .gds           |
+-----------+------------+
            |
[Magic: cif istyle lambda=0.3(ETRI)]
            |
+-----------V------------+
|    .mag (Flatten)      |
+------------------------+

단계 1 상용 도구에서 oa 형식 파일을 GDS-II 로 저장한다. Magic 은 계층화된 GDS를 제대로 처리하지 못하는 경우가 있으므로 평활화(flatten) 옵션을 주고 저장한다. 

    

단계 2. 만일 계층화된 GDS를 Magic에서 읽었을 때 문제가 발생하면 번거롭지만 KLayout 도구를 써서 GDS를 읽은 후 다시 저장한다. KLayout은 좋은 도구다.

단계 3. Klayout에서 저장한 GDS를 Magic 에서 읽는다. 이때 레이어 번호를 Magic의 레이어 이름으로 변경해 주어야 한다. Magic명령창에서 읽기 스타일을 lambda=0.3(ETRI) 으로 변경해 준다.

    % cif istyle lambda=0.3(ETRI)

비록 레이아웃을 기술하는 문법은 단순하지만 외부에서 공급되는 라이브러리를 들여올때 레이어 번호와 좌표계의 단위를 주의하여 맞춰줘야한다. 디자인 킷은 ETRI 050 공정의 GDS를 읽어들이기 위한 기술 파일을 제공한다. 디자인 킷의 tech 폴더에 이 기술 파일이 있다. ETRI 공정용 레이어 번호 변환 및 디자인 룰 검사가 기술되어 있다.

    ~/ETRI050_DesignKit/v.1a/tech/SCN3ME_SUBM.30.ETRI.tech

단계 4. Magic 에서 GDS 파일을 읽으면 계층적임을 알 수 있다. 패드 셀에 수천개의 비아(via)가 뚫리는데 이들이 모두 하위 블럭으로 취급한다. Magic 에서 이들을 다룰때 부하가 많이 걸리므로 평활화 시켜 단일 셀로 저장해 두는 편이 좋다. 입력 패드 셀 PIC를 읽고 평활화 시키는 명령은 아래와 같다.

    % gds read PIC
    % select top cell; unexpand
    % flatten PIC_F; load PIC_F
    % save PIC_F

IX-3. 코어와 패드의 배치 및 배선

KION 의 'My Chip' 제작 서비스[link]의 MPW 칩 크기는 1850x1850um 이며 28핀 PLCC 패키지로 제작해준다. 이 조건에 맞춰 외곽에 입출력 패드를 붙이고 중심부에 앞서 설계한 코어를 배치한 후 패드와 배선한다.

MPW는 서로다른 다수의 칩을 한 웨이퍼에서 제작되므로 칩크기와 패드의 위치가 고정되어 있다. 패드의 배치가 고정된 칩의 외형이 제공되므로 이를 따라야 한다. 디자인 킷에는 입출력 패드를 부착한 칩 레이아웃이 제공된다.

패드는 설계한 코어에 따라 입출력을 달리 붙이게된다. 코어를 설계할 때 입출력 핀의 배치 계획을 세워 놓도록 한다. 자동 배치도구 GrayWolf의 입출력 핀 배치 파일은 ALU_wrapper.cel2 다. ALU 예제의 경우 입출력 핀을 몇개의 모둠으로 나눠 입력 핀 iAB[7:0]은 왼쪽 패드에 출력 핀 oACC[7:0]은 오른쪽 패드에 그리고 제어 핀들은 윗쪽에 배치했다.

    padgroup input_B permute
    twpin_iAB[0]  nonfixed
    twpin_iAB[1]  nonfixed
    restrict side B

    padgroup input_L permute
    twpin_iAB[2]  nonfixed
    twpin_iAB[3]  nonfixed
    twpin_iAB[4]  nonfixed
    twpin_iAB[5]  nonfixed
    twpin_iAB[6]  nonfixed
    twpin_iAB[7]  nonfixed
    restrict side L

    padgroup control permute
    twpin_iSel[0]  nonfixed
    twpin_iSel[1]  nonfixed
    twpin_iOutSel  nonfixed
    twpin_reset  nonfixed
    twpin_clk  nonfixed
    restrict side T

    padgroup output_T permute
    twpin_oACC[7]  nonfixed
    twpin_oACC[6]  nonfixed
    restrict side T

    padgroup output_R permute
    twpin_oACC[5]  nonfixed
    twpin_oACC[4]  nonfixed
    twpin_oACC[3]  nonfixed
    twpin_oACC[2]  nonfixed
    twpin_oACC[1]  nonfixed
    twpin_oACC[0]  nonfixed
    restrict side R

디자인 킷은 코어와 입출력 패드 사이의 배선은 자동화 하지 못했다. Magic 레이아웃 도구를 써서 수동으로 연결해 주도록 한다. Magic 레이아웃 도구의 사용법은 설명서가 잘 준비되어 있으니 익혀두자[link].

예제 실행을 위한 폴더 구조

+---------------------------+
| ~/ETRI050_DesignKit/v.1a/ |
+-------+-------------------+
        |
        +-- Tools : Open-source archives
        |
        +-- digital_ETRI -> digital_ETRI050_m2d (symbolic link)
        |
        +-- pads_ETRI050
        |
        +-- scripts
        |
        +-- tech
        |
        +-- Ref_Design/ALU8 Project Home
                         |
                         +-- log
                         |
                         +-- source : RTL Verilog
                         |
                         +-- layout : P&R results
                         |
                         +-- simulation : C++ Tectbench
                         |
                         +-- synthesis : Synthesized netlists
                         |
                         +-- chiptop


단계 1. ALU8 에서 패드를 붙인 최종 칩 작업 폴더는 chiptop으로 한다.

    $ mkdir chiptop
    $ cd chiptop

단계 2. 셀 라이브러리 경로 심볼링크

    $ ln -s ../../../digital_ETRI
    $ ln -s ../../../pads_ETRI050

단계 3. 코어 심볼링크

    $ ln -s ../layout/ALU_wrapper_Fixed.mag ./ALU_wrapper_Core.mag

단계 4. MPW용 28핀 패드 프레임 복사

    $ cp ./pads_ETRI050/MPW_PAD_28Pin_frame.mag ./ALU_wrapper_Top.mag

단계 5. Magic의 리소스 파일 복사

    $ cp ../layout/.magicrc .

단계 6. Magic 리소스 파일 수정.

    $ vi .magicrc

    셀 라이브러리 경로 추가

    #-----------------------------------------------------
    # .magicrc startup file for ETRI050 project under qflow
    #-----------------------------------------------------
    path sys +/usr/local/share/qflow/tech/etri050
    tech load SCN3ME_SUBM.30.ETRI -noprompt
    scalegrid 1 2
    set GND gnd
    set VDD vdd
    drc euclidean on
    drc off

    addpath digital_ETRI
    addpath pads_ETRI050

    macro Control_XK_Pointer_Button4 {zoom 0.5}
    macro Control_XK_Pointer_Button5 {zoom 2}

단계 7. MPW 패드 프레임에 코어 배치

    $ magic -d XR ALU_wrapper_Core

    Magic 명령창에서 상자 커서를 위치한 후 코어셀 불러들이기

    % box 600um 600um 600um 600um
    % getcell ALU_wrapper_Core

28개 패드 중 0번과 14번은 각각 VDD 와 VSS로 지정했고 나머지는 모두 NC(No-Connectrd)다. 코어의 핀 배치에 맞춰 입출력 패드를 배정 한다.

단계 9. 그래픽 화면을 보며 NC 패드에 PIC(입력패드)와 POB8(출력 패드)를 달 수 있지만 번거롭다. Magic 레이아웃 파일은 일반 문자 파일이므로 문자 문서 편집기로 고치는 편이 수월하다. 대부분 전자설계 자동화 파일들이 일반 문자 파일이라서 양식만 이해하고 있다면 수정이 쉽다. 자동화 도구 만들기도 수월하다.

    % vi ALU_wrapper_Top.mag

앞서 자동배치시 핀배치 방향을 지정 했었다. 이에 맞춰 패드를 배정해 보자. 예를들어 PORT_2 를 찾아서 PAD_NC_F 패드를 입력 패드 라이브러리 PIC_F 로 바꿔준다. 출력 패드의 이름은 POB8_F 다.

    use PAD_NC_F  PORT_2    ---> use PIC_F   PORT_2
    use PAD_NC_F  PORT_13   ---> use POB8_F  PORT_2

단계 10. 코어에서 포트의 라벨을 찾아 각 패드에 연결해준다. 수평 배선을 금속2, 수직 배선은 금속3의 규칙을 반드시 따를 필요는 없다. 배선길이가 길다. 가급적 두껍게 사용하자. 3~4um가 적당하다.


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

[목차][이전][다음]


2023년 12월 30일 토요일

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [8]/레이아웃 검증(LVS)

ETRI 0.5um CMOS Std-Cell DK 예제: ALU8 [8]

VIII. 레이아웃 검증: LVS 및 DRC
    VIII-1. Netgen: 트랜지스터 회로 네트리스트 비교
    VIII-2. 서로다른 추상화 수준에서 표준 셀을 기술하는 양식
    VIII-3. 겹친 비아(Stacked VIA) 검사
        a. 배선과 비아 생성 규칙
        b. 자동배선 도구의 겹친 비아 금지 옵션
        c. 겹친 비아 검사
    VIII-4. Magic: 레이아웃 편집도구로 겹친 비아 수정
    VIII-5. Magic: 디자인 룰 검사

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

VIII. 레이아웃 검증(LVS)

앞서 베릴로그 RTL을 합성하여 얻은 네트리스트와 레이아웃에서 추출한 네트리스트를 비교하여 낮은 추상화 수준으로 변환된 두 설계가 동일한지 검증한다. QFlow의 LVS 처리 명령은 다음과 같다.

    % qflow lvs ALU_wrapper

레이아웃(실리콘 도면)에서 추출된 네트리스트는 트랜지스터 회로다. RTL 합성으로 얻은 네트리스트는 표준 셀의 연결도다. 두 네트리스트의 추상화 수준이 다르다. LVS 를 위해 RTL 합성으로 얻은 표준 셀 네트리스트를 트랜 지스터로 변환 해야 한다. SPICE 형식으로 변환된 표준 셀 네트리스트에 디자인 킷으로 제공된 표준 셀의 SPICE 네트리스트를 하위회로(sub-circuit)로 불러온다.

+----------------+
|Verilog RTL     |
+-----+----------+                      
      |                                     
+-----V-------------------------+      [Design-Kit]
|Yosys: RTL Synthesis <--[Std-Cell Liberty] == [etri050_stdcells.sp]
|                               |                      |
|    -> SPICE Netlist for LVS --|-------------+   [including...]
|    -> Verilog Netlist         |             |        |
|         for P&R and Post-Sim  |             V        V
+--------------+----------------+    [Hierachical SPICE Netlist  ]
               :                     [./synthesis/ALU_wrapper.spc]
               :                                     |
+--------------V----------------+                    |
|Magic: Migration    <---[Std-Cell Layout]           |
|    -> SPICE Netlist for LVS --|----------+         |
|    -> Merged Layout           |          |         |
+--------------+----------------+          |         |
               |                           |         |
               |          +----------------V---------V------------+
      +--------+          | LVS         (Layout vs. Schematic)    |
      |                   |     Netgen: SPICE netlist compare     |
     (?)<<<<<<<<<<<<<<<<<<<          @ Transistor Circuit Level!  |
      |                   +---------------------------------------+
      V
    GDS-II Generation

VIII-1. Netgen: 트랜지스터 회로 네트리스트 비교 도구

QFlow 의 LVS 도구는 Netgen[link] 이다. SPICE의 네트리스트 형식으로 표현된 두 트랜지스터 회로를 비교한다. 추상화 수준이 낮아질수록 처리할 부품의 기능은 단순해지고 갯수는 기하급수적으로 증가하여 자동화 도구에 의존도가 매우 높아진다. 인간이 간여할 부분은 줄어들고 낮은 수준의 자동화 도구 사용법은 단순하다. 가장 낮은 수준의 도구에 해당하는 Netgen의 사용법도 간단하다. QFlow에서 LVS 를 위해 Netgen을 호출하는 명령은 아래와 같다.

    Regenerating files for existing project ALU_wrapper
    Running netgen
    netgen -batch lvs \
        "ALU_wrapper.spice ALU_wrapper" \
        "../synthesis/ALU_wrapper.spc ALU_wrapper" \
        .../etri050_setup.tcl comp.out

Netgen을 호출 하면서 비교할 두 SPICE 네트리스트 파일을 지시했을 뿐이다. 예제의 LVS를 수행한 결과는 아래와 같다.

    Contents of circuit 1:  Circuit: 'ALU_wrapper'
    Circuit ALU_wrapper contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
      Class: AOI22X1               instances:  13
      Class: NOR2X1                instances:  12
        <......>
      Class: INVX2                 instances:   4
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Contents of circuit 2:  Circuit: 'ALU_wrapper'
    Circuit ALU_wrapper contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
      Class: AOI22X1               instances:  13
      Class: NOR2X1                instances:  12
        <......>
      Class: INVX2                 instances:   4
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Circuit 1 contains 366 devices, Circuit 2 contains 366 devices.
    Circuit 1 contains 381 nets,    Circuit 2 contains 381 nets.

    Final result:
    Circuits match uniquely.

두 회로에 사용된 하위회로들의 목록과 네트의 수 등을 요약해서 보여주고 두 회로가 일치 했음을 알려준다.

VIII-2. 서로다른 추상화 수준에서 표준 셀을 기술하는 양식

디자인 킷에 포함된 표준 셀의 라이브러리는 크게 3가지 추상화 수준의 형식으로 제공된다.

  1. 레이아웃 형식: 표준 셀의 기하학적 도면으로 가장 낮은 추상화 단계의 양식이다. 최종적으로 GDS 를 생성 할 때 사용된다.
  2. SPICE 형식: 표준 셀의 레이아웃에서 추출된 트랜지스터 회로의 네트리스트다. LVS 용도로 사용된다.
  3. Liberty 형식: 합성에서 사용되는 양식이다. 표준 셀 단위의 물리적 특성(기능, 크기, 지연 특성)을 담고있다.
  4. HDL 형식: 표준 셀 묘사의 가장 높은 수준의 양식이다. HDL 시뮬레이션을 위해 사용된다. 레이아웃의 트랜지스터와 스위치 수준에서 등가로 기술되며 게이트의 지연 특성, 플립플롭의 셋업-홀드 바이얼레이션을 검사할 수 있다.

합성으로 얻은 표준 셀의 네트리스트에서 디자인 킷의 표준 셀 SPICE 하위 회로를 불러들여 트랜지스터 회로를 만들게 된다. 합성 후 SPICE 네트리스트의 일부를 보면 아래와 같다.

    .subckt INVX1 A Y vdd gnd
    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
    <......>
    .subckt NAND2X1 A B Y vdd gnd
    M1000 vdd B Y vdd pfet w=6u l=0.6u
    +  ad=12.600001p pd=16.2u as=7.200001p ps=8.400001u
    M1001 a_24_14# A gnd gnd nfet w=6u l=0.6u
    +  ad=2.7p pd=6.9u as=12.600001p ps=16.2u
    M1002 Y B a_24_14# gnd nfet w=6u l=0.6u
    +  ad=16.2p pd=17.400002u as=2.7p ps=6.9u
    M1003 Y A vdd vdd pfet w=6u l=0.6u
    +  ad=7.200001p pd=8.400001u as=12.600001p ps=16.2u
    .ends
    <......>

    .subckt ALU_wrapper vdd gnd clk iAB[0] iAB[1] iAB[2] iAB[3]
    + iAB[4] iAB[5] iAB[6] iAB[7] iOutSel iSel[0] iSel[1] oACC[0]
    + oACC[1] oACC[2] oACC[3] oACC[4] oACC[5] oACC[6] oACC[7] reset
    <......>
    XFILL_2__291_ gnd vdd FILL
    X_512_ _155_ _156_ vdd gnd INVX1
    XFILL_2__347_ gnd vdd FILL
    XFILL60750x19650 gnd vdd FILL
    X_321_ iAB[4] _36_ vdd gnd INVX1
    XFILL_1__369_ gnd vdd FILL
    XFILL_2__576_ gnd vdd FILL
    XFILL_3__518_ gnd vdd FILL
    X_550_ _192_ _191_ _193_ vdd gnd NAND2X1
    XFILL_1__598_ gnd vdd FILL
    XFILL_0__603_ gnd vdd FILL
    <......>
    .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의 배선 규칙은 다음과 같다.

    UNITS
      DATABASE    MICRONS 1000 ;
    END UNITS

    MANUFACTURINGGRID    0.15 ;

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


    LAYER via1
      TYPE CUT ;
      SPACING 0.9 ;
    END via1
    LAYER via2
      TYPE CUT ;
      SPACING 0.9 ;
    END via2

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

LEF 배선 룰은 인접 금속층 사이의 연결을 위한 구멍(cut)을 내는 규정이 있다. 금속1층에서 금속3층으로 연결이 필요한 경우 M2_M1 비아와 M3_M2 비아를 쌓아 연결 한다. 이를 겹친 비아(Stacked VIA)라고 한다.

[이미지출처] https://www.vlsi-expert.com/2017/12/vias.html

b. 자동배선 도구의 겹친 비아 금지 옵션

좁은 영역에서 효과적인 배선을 위해 겹친 비아를 허용한다. 하지만 겹친 비아가 금지된 공정도 있다. 우리가 사용하려는 ETRI 0.5um CMOS 공정은 비아가 겹쳐 있을 경우 접점이 형성되지 못한다. 따라서 겹침 비아가 절대 허용될 수 없다. LEF에는 겹친 비아에 대한 규정이 없으므로 이 배선규칙을 따르는 자동 배선도구에 겹친 비아를 차단하는 옵션을 주어야 한다.

QFlow의 프로젝트 파일 prohect_vars.sh 에서 via_stacks 에 none 값을 설정 해준다. 기본값은 all 이다.

    Placement command options:
    # -------------------------------------------
    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. 겹친 비아 검사

추상화 수준이 낮아 질 수록 자동화 도구가 처리해야할 요소가 급격히 증가한다. 그만큼 자동화 도구의 결과에 오류가 존재할 가능성도 높아 지므로 추상화 단계가 전이할때 마다 반드시 검사가 이뤄져야 한다. 자동 배선도구에 겹침 비아를 금지 시켰으나 수많은 비아에 겹침을 모두 피했다고 확신할 수 없다. 디자인 킷에는 자동 배선 도구가 생성한 레이아웃에서 비아 겹침을 검사하는 파이썬 스크립트를 제공한다. 사용법은 아래와 같다.

    $ pwd
        ..../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

    $ ../../../scripts/check_via_stack.py ALU_wrapper m2contact m3contact 6

    Mult=1 / Div=2
    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의 일련의 명령은 다음과 같다.

    drc off
    extract all
    hierarchy on
    format ngspice
    cthresh infinite
    rthresh infinite
    renumber off
    scale off
    blackbox on
    subcircuit top auto
    global off
    ext2spice subcircuit top off
    ext2spice

LVS가 필요할 때마다 위 명령들을 반복적으로 입력하기란 여간 번거로운 일이 아니다. 스크립트로 저장해 두었다가 반복적으로 사용하기로 한다. Magic의 레이아웃에서 SPICE 네트리스트를 추출하는 쉘 스크립트는 extract_spice.sh 다. 디자인 킷의 scripts 폴더에 있다. 수정한 레이아웃을 ALU_wrapper_Fixed 로 저장한 후 SPICE 네트리스트를 추출하는 스크립트를 실행 한다.

    $ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed

수정한 레이아웃의 SPICE 네트리스트를 합성으로 얻은 네트리스트와 LVS를 실시한다.

    $ netgen -noc lvs \
        "../synthesis/ALU_wrapper.spc ALU_wrapper"  \
        "ALU_wrapper_Fixed.spice ALU_wrapper_Fixed"  \
        ../../../tech/etri050_setup.tcl

    <......>
    Contents of circuit 1:  Circuit: 'ALU_wrapper'
    Circuit ALU_wrapper contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
    <......>
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Contents of circuit 2:  Circuit: 'ALU_wrapper_Fixed'
    Circuit ALU_wrapper_Fixed contains 366 device instances.
      Class: OR2X2                 instances:   5
      Class: MUX2X1                instances:   1
    <......>
      Class: INVX4                 instances:   3
      Class: INVX8                 instances:   1
    Circuit contains 381 nets.

    Circuit 1 contains 366 devices, Circuit 2 contains 366 devices.
    Circuit 1 contains 381 nets,    Circuit 2 contains 381 nets.

    Final result:
    Circuits match uniquely.

    % quit

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를 실시한다.

    $ netgen -noc lvs \
        "../synthesis/ALU_wrapper.spc ALU_wrapper"  \
        "ALU_wrapper_Fixed.spice ALU_wrapper_Fixed"  \
        ../../../tech/etri050_setup.tcl

    <......>
    Circuit 1 contains 366 devices, Circuit 2 contains 366 devices.
    Circuit 1 contains 381 nets,    Circuit 2 contains 382 nets. *** MISMATCH ***

    Final result:
    Netlists do not match.

아쉽게도 두 네트리스트가 일치하지 않는다. LVS의 로그는 따로 지정하지 않으면 comp.out 이다. 두 회로에서 일치하지 않는 네트를 확인한다.

Subcircuit summary:
Circuit 1: ALU_wrapper                     |Circuit 2: ALU_wrapper_Fixed
-------------------------------------------|-------------------------------------------
AOI22X1 (13)                               |AOI22X1 (13)
DFFSR (24)                                 |DFFSR (24)
INVX1 (41)                                 |INVX1 (41)
                    <......>
OAI22X1 (1)                                |OAI22X1 (1)
CLKBUF1 (6)                                |CLKBUF1 (6)
Number of devices: 366                     |Number of devices: 366
Number of nets: 381 **Mismatch**           |Number of nets: 382 **Mismatch**
---------------------------------------------------------------------------------------
NET mismatches: Class fragments follow (with fanout counts):
Circuit 1: ALU_wrapper                     |Circuit 2: ALU_wrapper_Fixed

---------------------------------------------------------------------------------------
Net: _25_                                  |Net: _306_/Y
  INVX1/Y = 1                              |  INVX1/Y = 1
  OAI21X1/A = 1                            |
                                           |
(no matching net)                          |Net: _311_/A
                                           |  OAI21X1/A = 1
---------------------------------------------------------------------------------------
Netlists do not match.

RTL 합성 네트리스트 ALU_wrapper.spc 에서 네트명 _25_ 가 수정 네트리스트에서 두개의 네트 _306_/Y 와 _311_/A 로 분리된 것으로 보고되었다. Magic에서 네트를 찾는 명령은 goto 다[Magic-8.3 Command Reference].

끊어진 네트를 찾아 이어준다.

다시 네트리스트를 추출한 후 LVS 를 실시한다.

    $ ../../../scripts/extract_spice.sh ALU_wrapper_Fixed

    $ netgen -noc lvs \
        "../synthesis/ALU_wrapper.spc ALU_wrapper"  \
        "ALU_wrapper_Fixed.spice ALU_wrapper_Fixed"  \
        ../../../tech/etri050_setup.tcl

LVS 결과 로그를 보면 두 네트리스트가 사용된 셀, 네트 그리고 입출력 핀까지 완전히 일치함을 확인할 수 있다.


<......>
Subcircuit summary:
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.

<......>

Subcircuit summary:
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.

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

[목차][이전][다음]