2024년 1월 25일 목요일

ETRI 0.5um CMOS DK 예제: CPU 6502[9]/실습 요약

ETRI 0.5um CMOS DK 예제: CPU 6502[9]

실습 요약

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

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

+---------------------------------------------------+
|Verilog RTL:                                       |
|A Verilog HDL version of the old MOS 6502 CPU[Link]|
+-----+---------------------------------------------+
      |                            +--------------------------------+
      |                            | Apple I Circuit & Wozniac ROM|
      |                            | Apple-1 Operation Manual[Link] |
      |                            +-----------------+--------------+
      |                                              |
      |                            +-----------------V--------------+
      |                            | Executable Spec.SystemC/C++  |
      |                            |   Memory / Keyboard / Display  |
      +--------------------+       +-----------------+--------------+
      |                    |                         |
      |         +----------V-------------------------V-----------+
      |         | Functional Simulation:                         |
     (?)<<<<<<<<<   VERILATOR & QuestaSim: SystemC/C++ Testbench |
      |         +-----------------------------+------------------+
      |                                       |
+-----V-----------------------------------+   |
|Yosys: RTL Synthesis  <---[Std-Cell Liberty] |
|      (FSM Synthesis/Instruction Decoder)|   |
|    -> 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.|
      |               |    VERILATOR & QuestaSim                |
      |               +-------------------------------:---------+
+-----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 의 이해
        * cpu.v
        * ALU.v

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

    - 추상화 수준: SystemC가 테스트 벤치 작성에 효과적인 이유
    - Verilog HDL 감싸개(wrapper)
    - 동기식 메모리 모델(Synchronous memory SystemC model)
        * 메모리 매핑된 입출력 장치(Memory mapped PIA for Keyboard & Display)

    - 테스트 벤치 빌드: make 유틸리티 사용법 익히기

    $ cd simulation

    * 언어변환기(베릴레이터) 사용 6502-시뮬레이터(SystemC Simulation)

    $ make

    $ make run

    * HDL 시뮬레이터(QuestaSim) 사용 6502-시뮬레이터 (SystemC-HDL Co-Simulation)

    $ make mti_fun_build

    $ make mti_fun_run

    - 베릴로그와 C++의 병행 시뮬레이션(Co-Simulation)의 이해
    - 언어변환기(Verilator)사용 SystemC 단일 시뮬레이션
                    vs. HDL-SystemC 병행 시뮬레이션(Co-Simulation)

    - 6502 크로스 C-컴파일러 및 어셈블러

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

    $ qflow synthesis -T etri050 cpu

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

    * HDL 시뮬레이터(QuestaSim) 사용 합성 후 시뮬레이션 (SystemC-HDL Co-Simulation)

    $ make mti_net_build

    $ make mti_net_run

4. 자동 배치

    $ qflow place -T etri050 cpu

    - 표준셀 배치
    - 자동배치 옵션
        * 배치밀도(initial_density): 0.3
        * 배치 가로세로비(aspect ratio): 1.0
        * 핀 위치(CEL2): 사용하지 않음

5. 자동 배선

    $ qflow route -T etri050 cpu

    - 겹친 접점(Stacked Via) 금지

6. 표준 셀 병합(migration)

    $ qflow migrate cpu

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

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

    $ qflow lvs cpu

    - LVS 오류 발생 시 조치

    LVS Mismatched Net:
    -----------------------------------------------------------------
    Net: _3230_/CLK                  |Net: clk_bF$buf6
    DFFSR/CLK = 1                    |  DFFSR/CLK = 9
                                     |  DFFPOSX1/CLK = 4
                                     |  CLKBUF1/Y = 1
                                     |
    Net: _3267_/CLK                  |(no matching net)
    CLKBUF1/Y = 1                    |
    DFFSR/CLK = 8                    |
    DFFPOSX1/CLK = 4                 |
    -----------------------------------------------------------------
    Netlists do not match.

    - Magic 레이아웃 편집기로 배선되지 않은 네트를 찾아 수정

    $ magic -d XR cpu.mag

    유용한 Magic 명령어:

        select, expand
        goto _3230_/CLK
        findbox [zoom]
        - save cpu_lvs

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

    $ ./run_lvs.sh cpu_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/cpu.spc cpu" \
        setup.tcl \
        LVS_$1.txt

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

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

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

    $ magic -d XR cpu_lvs_Stacked.mag

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

    유용한 Magic 명령어:

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

    - 수정 후 LVS 재실시: 겹친 접점 수정 레이아웃(cpu_lvs_Stacked_Fixed.mag)

    $ ./run_lvs.sh cpu_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
        - 단축키: ':', 'a', 's', 'S', 'z', 'Z', 'x', 'X', 'p', 'u'
        - erase [layer]
        - 숫자키 패드(방향키) 사용
        - save cpu_lvs_drc_Fixed
        - DRC manager 창 열기

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

    $ ./run_lvs.sh cpu_lvs_drc_Fixed

10. 입출력 정리

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

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

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

    $ ./run_lvs.sh cpu_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
    -rwxr-xr-x 1 goodkook ...... generate_cpu
    lrwxrwxrwx 1 goodkook ...... pads_ETRI050 -> .../pads_ETRI050

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

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

    - 패드 프레임 복사
        * MPW는 칩의 면적과 입출력 핀 수가 고정되어 있다.

    $ cp pads_ETRI050/PAD_FRAME_3650_68pin.mag cpu6502_Top.mag

    - 입출력 패드 배선

    $ magic -d XR cpu6502_Top

    - 유용한 Magic 명령어:

        - box 870um 830um 870um 830um
        - getcell cpu6502_Core

    - 프레임 에서 코어를 읽어들인 후 입출력 패드 셀 편집
        * 텍스트 편집기 사용

12. GDS 생성

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

    I. 입출력 패드

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

        $ ....../scripts/xPad.py cpu6502

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

    II. 코어

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

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

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

        $ ....../scripts/xPin_Route.py cpu6502

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

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

    cpu6502_Top
    +------------------------------------+
    |  cpu6502_Pad (MPW Pad Frame)       |
    |    +---------------------------+   |
    |    |   cpu6502_Pin_Route       |   |
    |    |      +-----------------+  |   |
    |    |      |   cpu6502_Core  |  |   |
    |    |      |   (getcell)     |  |   |
    |    |      |                 |  |   |
    |    |      |                 |  |   |
    |    |      |                 |  |   |
    |    |      |                 |  |   |
    |    |      +-----------------+  |   |
    |    +---------------------------+   |
    +------------------------------------+

    - 칩-탑 구성 요소 분리 후 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 cpu6502 424 423 866.55 832.4




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

[목차][이전]



댓글 없음:

댓글 쓰기