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>


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

[목차][이전]


댓글 없음:

댓글 쓰기