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

2024년 1월 26일 금요일

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

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502

목차

I. 개요

II. 시스템 수준 테스트 벤치

[1부]

    II-1. Apple-1 컴퓨터 시스템 모델
    II-2. 6502 CPU의 베릴로그 RTL

[2부]

    II-3. 베릴로그 RTL과 SystemC/C++의 결합
        simulation/sc_CPU_6502_Top.h
        simulation/obj_dir/Vcpu.h
        simulation/mti_sim/CPU_6502.h
        simulation/mti_sim/Vcpu.h
        베릴레이터의 언어 변환(Language Translation) 시뮬레이터
        QuestaSim의 동적 링크(Dynamic Linking) 시뮬레이터

    II-4. 동기식 메모리 모델
        simulation/sc_mem.h
        simulation/sc_mem.cpp

    II-5. Apple-1 컴퓨터
        simulation/sc_main.cpp

[3부]

    II-6. Apple-1의 표준 입력 장치: 키보드
        simulation/a1_keyboard.cpp
        Apple-1의 입력용 PIA: 메모리 매핑된 키보드 포트

    II-7. Apple-1의 표준 출력장치: 디스플레이
        simulation/a1_display.cpp
        Apple-1의 출력용 PIA: 메모리 매핑된 디스플레이 포트

III. 6502 CPU 기능적 검증

    III-1. 모니터 프로그램
        WozMon

    III-2. Apple-1 시뮬레이터 빌드
        simulation/Makefile

    III-3. Apple-1 시뮬레이터 실행
        Apple-1 메모리에 응용 프로그램을 적재하는 방법
        6502 C 컴파일러
        좀더 검증, Applesoft BASIC

    III-4. HDL 과 SystemC의 병행 시뮬레이션(Co-Simulation)
        QuestaSim 의 SystemC
        simulation/mti_sim/compile_fun.do
        Verilator vs. QuestaSim HDL simulator

IV. 6502 CPU 베릴로그 합성

    IV-1. 유한 상태 기계(FSM)

    IV-2. CPU의 명령 디코더

    IV-3. Yosys의 FSM 합성기

    IV-4. 합성 후 네트 시뮬레이션

V. 자동 배치와 배선

    V-1. 자동 배치

    V-2. 네트리스트 파일 형식

     V-3. 자동 배선

VI. 레이아웃 검증

    VI-1. 배선 후 얻은 DEF

    VI-2. LVS 레이아웃 검증

    VI-3. 겹친 접점(Stacked VIA) 검사
        DEF 에서 Magic 레이아웃 변환
        LVS: 배선 후 레이아웃 네트리스트 vs 합성 후 네트리스트 비교

    VI-4. 디자인 룰 검사

VII. 실습요약

VIII. 맺음말

6502 CPU는 70년대 중반에 생산되기 시작하여 Apple-1 컴퓨터를 비롯하여 다양한 컴퓨터와 게임기에 사용되었다[바로가기]50년전의 CPU를 이제와서 다시 설계하는 이유는 설계기법과 환경의 어떻게 변했는지 살펴보기 위함이다. 사실 반도체를 전자회로로 따진다면 달라진 것은 없다고 해도 과언은 아니다. 다만 칩 당 집적되는 규모의 급격한 증가(회로의 트랜지스터 갯수로 따져 본다면 수천개에서 수억개로 늘었다)에 따른 제조 및 설계 비용이 관건이다. 설계시간과 비용의 압박을 극복하고자 여러 기법이 등장하고 자동화 도구들의 발전해왔다. 그중에서도 하드웨어 기술 전용 언어[바로가기]를 사용한 반도체 설계 기법은 이제 일반화 되었고 소프트웨어 개발용이라고 알려진 일반 컴퓨팅 언어들도 반도체 설계와 검증의 용도로 사용된다[바로가기]. 컴퓨팅 언어보다 높은 추상화 수준의 시스템 모델링 도구들도 사용되고 있다. 화려한 외양을 갖춘 고가의 시스템 검증 도구들은 언듣 보기에 멋져 보일지 모르지만 융통성이 매우 적다. 많은 것을 할 수 있다고 하지만 정작 하려면 할게 없다. 결국 또다른 언어로 귀결될 것이다.

시스템의 일부로 사용될 하드웨어를 설계할 때 짜여진 순서에 의거한 시험은 불완전한 시험이 될 수 있다. 하드웨어 설계가 우선인 여건(개발시간의 압박, 제한된 인력 투입 등)에서 실제 적용될 시스템에서 일어날 돌발 상황을 모두 고려한 시스템 모델을 만들어내기 어렵다. 하드웨어 기술 언어는 고도의 시스템 모델을 구현하기에 적합하지 않다. 이를 극복하기 위해 다양한 시스템 모델링 도구가 상용화 되어 있긴 하지만 하드웨어 기술 언어와 큰 격차를 좁히기 어렵다. 시스템 모델링이라고 표방하는 도구들의 실체를 보더라도 코드 생성기(IP generator)라고 봐야 할 것이다.

소프트웨어 제작 기술이 발전하여 이종 언어간 혼합 실행 기법이 널리 활용되는 지금 굳이 어렵게 하드웨어 언어로 테스트 벤치 작성하는 일은 줄어들고 있다. 하드웨어 언어는 설계에 집중하고 시스템 수준 검증도구로 C/C++를 활용하는 추세다. 하드웨어 언어에 C/C++의 연결이 표준화 되었으나 반도체 설계자들은 오히려 역사 깊은 C/C++ 언어에 대한 이해가 부족한 실정이다. 이는 화려한 외양을 갖춘 시스템 설계 도구들이 등장하는 이유이기도 하다.

6502는 반세기 전의 CPU 이긴 하나 오늘날의 정보산업 사회를 연 시발점이라고 해도 과언이 아니다. C 언어 컴파일러를 비롯하여 수많은 개발도구, 응용 프로그램이 등장 했다. 본 예제는 RTL 베릴로그로 기술된 CPU를 검증 하기위한 테스트 벤치로 SystemC를 이용하여 47년전 발매된 Apple-1 컴퓨터 시뮬레이터를 제작하였다. 하드웨어의 시스템 수준 모델링을 위해 C++ 프로그래밍 언어의 크래스 라이브러리로 개발된 SystemC를 사용하였다. HDL과 SystemC의 병행 시뮬레이션(Co-Simulation)이다. Apple-1 시뮬레이터는 발매당시 탑재되었던 워즈니악의 모니터 프로그램을 수정 없이 실행 될 뿐만 아니라 어셈블러, C 컴파일러에서 생성된 2진 코드를 실행 시킬 수 있다. Applesoft의 BASIC 바이너리도 완벽히 실행된다. 예제의 Apple-1 시뮬레이터는 높은 추상화 수준의 SystemC/C++를 이용하면 시스템 수준 RTL 검증을 효과적(낮은 비용, 짧은 개발 기간)으로 수행 할 수 있음을 보여준다.

시스템 수준 검증이 완료된 6502 CPU의 RTL 베릴로그는 오픈 소스 도구들 만을 사용하여 GDS까지 생성한다. 합성기로서 Yosys, 지동 배치와 배선에 GrayWolf와 QRouter 그리고 레이아웃 편집, 디자인 룰 검사, 그리고 GDS 생성 도구로 Magic이 사용 되었다. 합성전 기능 검증과 합성 후 네트리스트 시뮬레이션을 실시하였다. HDL과 SystemC의 병행 시뮬레이션에 상용 QuestaSim을 사용하고 오픈 소스 언어변환 도구인 베릴레이터(VERILATOR)와 비교하였다. 아울러 합성 네트리스트와 레이아웃 추출 네트리스트의 비교 LVS 도 수행 하였다. 대상 공정은 ETRI 0.5um CMOS 2P3M 이다. 표준 셀 라이브러리는 경희대학교 반도체 전공 트랙에서 개발한 디자인 킷을 활용하였다.

검증의 도구로서 분만 아니라 미래의 반도체 설계 언어로 C/C++가 도입되기 시작 했고 이를 RTL로 합성하는 자동화 도구 HLS (Hihg-Level Synthesis)들이 상용화 되었다. 이제 하드웨어 설계자 들도 RTL의 HDL에서 벗어날 때가 되었다. 오늘날 어셈블리언어로 소프트웨어를 개발하는 사례를 찾아볼 수 없듯이 하드웨어 설계도 곧 그런 시대가 될 것이다.

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

[이전 게시글 참조]

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"

1. SystemC 및 SDL2 라이브러리 빌드 하는 방법 [링크]

2. Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기 [링크]

3. Project_6502 예제의 기능적 Co-Simulation 실시 방법 [링크]

4. Project_6502 예제의 합성 후 Co-Simulation 실시 방법 [링크]

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

참고/웹 링크

[1] ETRI 0.5um STd-Cell Design Kit/KHU, https://fun-teaching-goodkook.blogspot.com/2023/12/etri-05u-cmos-v1a-2023-12-13.html

[2] KION 국가나노 인프라 협의체, https://kion.or.kr/

[3] KION 국가나노 인프라 협의체, 내칩 MPW, https://mpw.kion.or.kr/

[4] MOS Technology, https://en.wikipedia.org/wiki/MOS_Technology

[5] MOS 테크놀로지 6502, https://namu.wiki/w/%EB%AA%A8%EC%8A%A4%20%ED%85%8C%ED%81%AC%EB%86%80%EB%A1%9C%EC%A7%80%206502?from=6502

[6] Retro Computing/Apple-1 Replica, http://retro.hansotten.nl/6502-sbc/apple-1/

[7] Apple-1 Replica,"Insanly Great", https://www.apple-1-replica.com/

[8] [넥슨컴퓨터박물관] 애플I 소장품 실제 구동영상 (Apple1, AppleⅠ), https://www.youtube.com/watch?v=TgKgH5abLfg

[9] Arlet's 6502 Github, "A Verilog HDL version of the old MOS 6502 CPU.", https://github.com/Arlet/verilog-6502

[10] SystemC, https://systemc.org/

[10a] C/UNIX Functions for VHDL Testbenches, http://bear.ces.cwru.edu/VHDL/doc/snug2002_20040606_slides.pdf

[10b] SystemC, Bridge the Gap, https://drive.google.com/file/d/11MSOZ4e592zwhy8jXRqmM6qg1AiMCfcd/view?usp=sharing

[10c] 시스템 수준 언어: SystemC & SystemVerilog, https://drive.google.com/file/d/11fQKIcAC78B5gLcw-FZkJ800B1PV7o3B

[11] Steve Wozniak, https://en.wikipedia.org/wiki/Steve_Wozniak

[12] ICARUS Verilog, https://steveicarus.github.io/iverilog/

[13] Icarus Verilog, Wikipedia, https://en.wikipedia.org/wiki/Icarus_Verilog

[14] iVerilog 동영상, https://www.youtube.com/results?search_query=icarus+verilog+iverilog

[15] VERILATOR, https://www.veripool.org/verilator/

[16] Co-Simulation, https://en.wikipedia.org/wiki/Co-simulation

[17] What is Cosimulation ?, https://opensimulationplatform.com/co-simulation/

[18] QuestaSim Advanced Simulator, https://eda.sw.siemens.com/en-US/ic/questa/simulation/advanced-simulator/

[19] Intel QuestaSim FPGA Edition, https://www.intel.co.kr/content/www/kr/ko/software/programmable/quartus-prime/questa-edition.html

[20] Hardware Description Language, https://en.wikipedia.org/wiki/Hardware_description_language

[21] OpenROAD Project Publications, https://theopenroadproject.org/publications/

[22] The Linux Programming Interface: A Linux and UNIX System Programming Handbook, https://en.wikipedia.org/wiki/The_Linux_Programming_Interface, [e-Book]

[23] High-Level Synthesis, https://en.wikipedia.org/wiki/High-level_synthesis

[24] Integrating SystemC Models with Verilog and SystemVerilog Models Using the SystemVerilog Direct Programming Interface, https://sutherland-hdl.com/papers/2004-SNUG-Europe-paper_SystemVerilog_DPI_with_SystemC.pdf

[25] Towards Automatic High-Level Code Deployment on Reconfigurable Platforms: A Survey of High-Level Synthesis Tools and Toolchains, https://ieeexplore.ieee.org/abstract/document/9195872

[26] HLS Blog, https://hls-goodkook.blogspot.com/2021/08/ug871-xilinx-high-level-synthesis.html

[27] WozMon, http://retro.hansotten.nl/6502-sbc/apple-1/

[28] cc65 C-Compiler for 6502, https://www.cc65.org/

[29] Verilog BASIC, Intel, https://youtu.be/PJGvZSlsLKs?si=-DU-GBL5oDlex0G_

[30] Verilog HDL 입문 8시간 완성, https://youtu.be/HcdlkMI54Vg?si=LMxz8U-LbaNKa3lC

[31] SystemVerilog DPI, https://en.wikipedia.org/wiki/SystemVerilog_DPI

[32] Tutorial On DPI, https://github.com/adki/DPI_Tutorial

[33] Xilinx Synchronous RAM Timing, https://docs.xilinx.com/r/en-US/am007-versal-memory/NO_CHANGE-Mode-DEFAULT

[34] Apple-1 Operation Manual, http://retro.hansotten.nl/uploads/apple1/APPLE%20I_Operation%20Manual.pdf

[35] Inter-Process Communication, https://en.wikipedia.org/wiki/Inter-process_communication

[36] GNU Make 강좌, https://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make.html#toc1

[37] Intel HEX, https://en.wikipedia.org/wiki/Intel_HEX

[38] 6502 Instructions, https://www.cs.otago.ac.nz/cosc243/pdf/6502Poster.pdf

[39] Synopsys' Open-Source Liberty Format to Incorporate On-Chip Variation Extensions, https://news.synopsys.com/index.php?s=20295&item=123415

[40] Liberty Timing File, https://redirect.cs.umbc.edu/~cpatel2/links/641/slides/lect05_LIB.pdf

[41] Finite State Machine, https://en.wikipedia.org/wiki/Finite-state_machine

[42] High Level Synthesis FSM, https://users.ece.utexas.edu/~gerstl/ee382v-ics_f09/lectures/lecture_9.pdf

[43] Instruction Cycle, https://en.wikipedia.org/wiki/Instruction_cycle

[44] Microprocessor Design, WikiBooks, https://en.wikibooks.org/wiki/Microprocessor_Design

[45] State Machine Coding Styles for Synthesis, http://www.sunburst-design.com/papers/CummingsSNUG1998SJ_FSM.pdf

[46] QFlow 1.4 Reference Manual, http://opencircuitdesign.com/~tim/programs/qflow/reference.html

[47] Fast Prototyping of a Deep Neural Network on an FPGA, IEEE Xplore, https://ieeexplore.ieee.org/document/9333030

[48] FINN: A Framework for Fast, Scalable Binarized Neural Network Inference, https://arxiv.org/abs/1612.07119

[49] Tutorial (ISFPGA'2021): Neural Network Accelerator Co-Design with FINN, https://youtu.be/zw2aG4PhzmA?si=mEvtFU988UW5lZ5

[50] Machine Learning on FPGA, https://www.youtube.com/watch?v=4MBbV2gKE98&list=PLGzeDuLmmxDpEsCAjf_sYrMC6p-Y0Ummk

[오픈 소스 반도체 설계도구]

[1] QFlow, http://opencircuitdesign.com/qflow/index.html

[2] OSS CAD Suite (Yosys/iVerilog & etc.), https://github.com/YosysHQ

[3] GrayWolf: 표준 셀 자동 배치 도구, git://github.com/rubund/graywolf

[4] QRouter: 표준 셀 자동 배선 도구, http://opencircuitdesign.com/qrouter/index.html

[5] Magic: VLSI 레이아웃 그리기 및 파일 변환, http://opencircuitdesign.com/magic/index.html

[6] irsim: 스위치 수준 시뮬레이터, http://opencircuitdesign.com/irsim/index.html

[7] Netgen: LVS 검증도구, http://opencircuitdesign.com/netgen/index.html

[8] XSchem: 회로 입력 도구, https://github.com/StefanSchippers/xschem

[9] ngSpice: SPICE 회로 시뮬레이터, https://ngspice.sourceforge.io/

[10] gtkWave: 디지털 회로 파형 VCD 보기, https://gtkwave.sourceforge.net/

[11] KLayout: VLSI 레이아웃 툴, https://www.klayout.de/

[12] SystemC, https://systemc.org/

[13] ICARUS Verilog, https://steveicarus.github.io/iverilog/

[14] VERILATOR, https://www.veripool.org/verilator/

[15] 반도체 설계 오픈 소스 도구, https://fun-teaching-goodkook.blogspot.com/2024/01/etri-05um-cmos-std-cell-dk.html


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




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

[목차][이전]



2024년 1월 20일 토요일

ETRI 0.5um CMOS Std-Cell DK 예제: CPU 6502 [8]/레이아웃 검증

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

VI. 레이아웃 검증

    VI-1. 배선 후 얻은 DEF
    VI-2. LVS 레이아웃 검증
    VI-3. 겹친 접점(Stacked VIA) 검사
        DEF 에서 Magic 레이아웃 변환
        LVS: 배선 후 레이아웃 네트리스트 vs 합성 후 네트리스트 비교
    VI-4. 디자인 룰 검사

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

VI. 레이아웃 검증

자동 배선까지 마치면 마스크를 제작할 수 있는 레이아웃이 준비된 것과 같다. 자동배선을 수행하기까지 자동화 도구들을 동원하여 추상화 수준을 낮춰 왔다. 이 과정에서 자동화 도구의 오류가 끼어들 여지가 많다. 이를 확인하는 과정이 레이아웃 검증이다. LVS (Layout vs. Schematic)은 합성으로 생산된 표준 셀의 네트리스트와 자동 배선으로 얻은 레이아웃 도면이 트랜지스터 회로 수준에서 일치하는지 비교한다. 합성으로 얻은 표준 셀 네트리스트는 베릴로그 언어로 기술된 회로도다. 배선후 얻은 레이아웃은 반도체 물질과 메탈의 적층 도면이다. 기하학적인 적층 도면에서 트랜지스터 회로를 추출하여 표준 셀의 네트리스트와 비교하여 서로 다른 추상화 수준의 설계물이 일치하는지 확인한다.

VI-1. 배선 후 얻은 DEF

자동배치와 배선을 수행한 DEF에 표준 셀 부품(COMPONENTS)과 배선한 메탈 선(NETS)의 좌표가 기록된다.

    COMPONENTS 22922 ;
    - FILL_0__1694_ FILL + PLACED ( 150 150 ) S ;
    - FILL_1__1694_ FILL + PLACED ( 450 150 ) S ;
    ......
    - FILL_11__1694_ FILL + PLACED ( 3450 150 ) S ;
    - _1694_ INVX1 + PLACED ( 3750 150 ) S ;
    - FILL_0__1833_ FILL + PLACED ( 4350 150 ) S ;
    ......
    - FILL_10__1815_ FILL + PLACED ( 183750 183450 ) FN ;
    - _1815_ NAND2X1 + PLACED ( 184050 183450 ) FN ;
    - FILL_0__3484_ FILL + PLACED ( 184950 183450 ) N ;
    .....
    - FILL_10__3484_ FILL + PLACED ( 187950 183450 ) N ;
    - _3484_ INVX1 + PLACED ( 188250 183450 ) N ;
    - FILL189450x150 FILL + PLACED ( 189450 150 ) S ;
    ......
    - FILL190950x183450 FILL + PLACED ( 190950 183450 ) N ;
    - FILL191250x183450 FILL + PLACED ( 191250 183450 ) N ;
    END COMPONENTS

    PINS 40 ;
    - gnd + NET gnd
      + LAYER metal1 ( -450 0 ) ( 450 0 )
      + PLACED ( 192195 30 ) N ;
    - vdd + NET vdd
      + LAYER metal1 ( -450 0 ) ( 450 0 )
      + PLACED ( -495 30 ) N ;
    - AB[15] + NET AB[15]
      + LAYER metal3 ( -60 -60 ) ( 60 60 )
      + PLACED ( -300 123000 ) N ;
    ......
    - clk + NET clk
      + LAYER metal2 ( -52 -52 ) ( 52 52 )
      + PLACED ( 180300 188100 ) N ;
    - reset + NET reset
      + LAYER metal2 ( -52 -52 ) ( 52 52 )
      + PLACED ( 179700 188100 ) N ;
    END PINS

    NETS 1997 ;
    - _815_
      ( _3160_ Y ) 
      ( BUFX2_insert82 A ) 
      ( BUFX2_insert83 A ) 
      ......
    + ROUTED metal2 ( 16500 174300 ) ( * 177000 ) 
      NEW metal2 ( 40800 174300 ) ( * 176400 ) M3_M2 
      NEW metal3 ( 40800 176400 ) ( 16500 * ) M3_M2 
    ......
    - WE
      ( PIN WE ) 
      ( _3563_ Y ) 
    + ROUTED metal2 ( 96300 188100 ) ( 96000 * ) ( * 187200 ) M3_M2 
    ......
    END NETS

6502 CPU의 베릴로그 RTL을 합성한 로그를 보면 1896개의 표준 셀이 사용 되었다. 배치와 배선의 결과 DEF에 부품의 수는 무려 22922개다. DEF의 부품 중 FILL 이름을 가진 셀이 가장 많이 보인다. 표준 셀을 배치할 때 밀집도가 0.32 였다. 표준 셀 기반 설계에서 자동화 배선을 위해 남겨둔 자리에 전원(Vdd)과 접지(GND) 만을 가진 셀(FILL)을 채워 넣었기 때문이다. 채우기 셀(filler cell)은 수평으로 배치된 표준 셀 사이에 전원과 접지선을 연결해 준다. 3중 메탈 공정에서 최하위 메탈 층은 표준-셀의 기초 배선에 쓰이며 셀 사이의 배선은 메탈 2 와 3을 이용한다.

VI-2. LVS 레이아웃 검증

DEF 에서 Magic 레이아웃 변환

DEF는 표준 셀의 위치와 배선용 메탈 그리고 접점의 위치를 표시했을 뿐이다. 적층 도면에서 트랜지스터 회로를 추출 하려면 표준 셀을 병합해야 한다. 디퓨전 반도체 층(diffusion layer)의 활성 영역과 폴리 실리콘 층(poly-silicon layer)의 선이 중첩된 영역에서 트랜지스터를 추출하고 메탈 층과 접점을 엮어 트랜지스터 네트리스트를 만들어 낼 수 있다. 오픈 소스 도구 Magic은 레이아웃 도면 편집기이자 회로 추출기다. 배선된 DEF로부터 Magic 레이아웃 파일의 생성은 단순한 전환(migration)으로 QFlow 명령은 다음과 같다.

    $ qflow migrate cpu

자동 배선된 layout/cpu.def를 읽어 레이아웃 layout/cpu.mag를 생성하고 그로부터 SPICE 형식의 네트리스트 layout/cpu.spice 를 추출한다. 이 SPICE 네트리스트는 목적은 시뮬레이션이 아닌 LVS용이다.

LVS: 배선 후 레이아웃 네트리스트 vs 합성 후 네트리스트 비교

합성으로 얻은 베릴로그 네트리스트에서 추출한 트랜지스터 수준 네트리스 synthesis/cpu.spc와 자동 배선 후 레이아웃에서 추출한 네트리스트를 비교한다. QFlow의 LVS 실시 명령은 아래와 같다.

    $ qflow lvs cpu

이 명령으로 수행되는 SPICE 네트리스트 비교 도구는 오픈 소스 netgen 이다. LVS의 로그 파일을 보면 netgen 이 어떻게 작동 하는지 알 수 있다. 레이아웃을 수정할 때마다 이 도구를 이용하게 될 것이므로 어떻게 작동 되는지 알아두도록 한다.

    netgen -batch lvs "cpu.spice cpu" \
        "../synthesis/cpu.spc cpu" \
        etri050_setup.tcl comp.out -json -blackbox

두 네트리스트를 비교하여 배치 모드(대화창을 띄우지 않음)로 LVS 를 수행 한다. 각 네트리스트는 계층적 구성을 하고 있고 최상위 회로의 이름이 cpu 다. 배선만을 검증하기 위한 목적이므로 표준 셀 내부는 블랙박스(blackbox)로 처리하고 있다. 실제로 layout/cpu.spice 에서 SPICE 하위회로(.subckt)로 기술된 내부 트랜지스터 회로는 노출되지 않는다.

    * Filename: layout/cpu.spice
    * Black-box entry subcircuit for FILL abstract view
    .subckt FILL vdd gnd
    .ends
    
    * Black-box entry subcircuit for INVX1 abstract view
    .subckt INVX1 A Y vdd gnd
    .ends
        .....
    * Black-box entry subcircuit for NOR3X1 abstract view
    .subckt NOR3X1 A B C Y vdd gnd
    .ends
    
    .subckt cpu gnd vdd AB[15] AB[14] AB[13] AB[12] ......
    + DI[7] DI[6] DI[5] DI[4] DI[3] DI[2] DI[1] DI[0]
    + DO[7] DO[6] DO[5] DO[4] DO[3] DO[2] DO[1] DO[0]
    + IRQ NMI RDY WE clk reset
    XFILL_3__2586_ vdd gnd FILL
    XFILL_1__1670_ vdd gnd FILL
        ......
    XFILL_6__2364_ vdd gnd FILL
    XFILL_3__2655_ vdd gnd FILL
    X_3224_ _3224_/D vdd _3246_/R _3273_/CLK _3224_/Q vdd gnd DFFSR
    .ends

LVS는 부품 회로도 수준의 네트리스트 비교임을 알 수 있다. LVS 결과 두 회로의 네트리스트가 일치하는 결과를 얻음으로써 자동 배치와 배선이 정확이 이뤄졌음을 확인 할 수 있다.

    ......
    Contents of circuit 1:  Circuit: 'DFFPOSX1'
    Circuit DFFPOSX1 contains 0 device instances.
    Circuit contains 0 nets.
    Contents of circuit 2:  Circuit: 'DFFPOSX1'
    Circuit DFFPOSX1 contains 22 device instances.
      Class: pfet                  instances:  11
      Class: nfet                  instances:  11
    Circuit contains 17 nets.

    Circuit DFFPOSX1 contains no devices.
        ......
    Circuit 1 contains 1983 devices, Circuit 2 contains 1983 devices.
    Circuit 1 contains 1998 nets,    Circuit 2 contains 1998 nets.
    Final result:
    Circuits match uniquely.

LVS의 대상인 첫번째 회로에서 표준 셀 내부를 노출 시키지 않았지만 참고 회로의 내부는 트랜지스터 수준의 회로가 기술술되어 있다.

VI-3. 겹친 접점(Stacked VIA) 검사

자동 배선 도구는 인접한 금속층 사이에 접점(via) 뚫어 배선을 완성한다. 다중 메탈 공정의 경우 배선의 효율을 높이기 위해 두개 이상의 인접 금속층을 연결하는 겹친 접점(stacked via)를 허용한다. 정교하지 않은 공정은 겹친 접점을 확신하지 못하는 경우도 있어서 디자인 룰에서 이를 금지한다. ETRI 0.5um 공정은 겹친 접점을 허용하지 않고 있다. 자동 배치 도구를 실행 할 때 미리 이를 금지 시켰으나 이를 확실하게 처리 했다고 확신 할 수 없다. 2천여개의 네트에 불과하지만 배선 로그에 따르면 실제 배선할 지점이 2만여를 넘었던 것으로 보고되었다. 단 2개의 금속층으로 배선을 하려면 건너뛰어야 하는 배선이 엄청나게 늘었다는 의미이기도 하다. 그 과정에서 수많은 접점이 생겨나는데 겹친접점까지 금지하기에 배선이 쉽지 않다. 자동 배선 도구는 배선 오류를 최대한 줄일 뿐이지 모두 처리하지 못할 뿐만 아니라 이에대한 보고조차 불분명한 경우가 허다하다. 설계 자동화 도구중 가장 긴 작업시간을 소요하는 과정이 바로 배선이다. 따라서 자동 배선 후 LVS는 필수다. 비록 LVS 가 성공적이더라도 공정에서 요구하는 특별한 조건에 대하여 추가 검사를 해주어야 한다. ETRI 0.5um 공정의 겹침접점 금지 조건을 검사하는 스크립트를 제공한다. 디자인 킷의 scripts/check_via_stack.py 다. LVS 까지 완료된 레이아웃 layout/cpu.mag 에 대하여 겹침접점을 검사한다.

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

위의 명령은 금속 1과 2사이의 접점 m2contact 과 금속 2와 금속 3 사이의 접점 m2contact 이 서로 중심에서 6um 이내에 놓이면 겹친 것으로 본다. 검사결과 총 20개의 겹친 접점이 발견 되었다.

    Stacked #1
    << m2contact >> rect 5413 11533 5427 11547
    << m3contact >> rect 5413 11533 5427 11547
    Box(Scaled): 2706 5766 2713 5773
    Stacked #2
    << m2contact >> rect 4433 11433 4447 11447
    << m3contact >> rect 4433 11433 4447 11447
    Box(Scaled): 2216 5716 2223 5723
        ......
    Stacked #19
    << m2contact >> rect 2553 2193 2567 2207
    << m3contact >> rect 2553 2193 2567 2207
    Box(Scaled): 1276 1096 1283 1103
    Stacked #20
    << m2contact >> rect 1093 113 1107 127
    << m3contact >> rect 1093 113 1107 127
    Box(Scaled): 546 56 553 63
    ***************************************
    20 Stacked Contact and/or Via found!
    Magic layout "cpu_Stacked.mag" created with DRC error layer

접점이 겹친 위치에 오류표시를 하고 레이아웃 파일명 cpu_Stacked.mag으로 저장된다. 레이아웃 도구 Magic으로 겹친 레이아웃을 수동으로 고쳐 준다. 레이아웃의 수동 편집은 전편의 예제 "ALU8"의 "레이아웃 검증[바로가기]"을 참조한다. 설계 자동화에 인간의 개입은 매우 위험하다. 반드시 검증의 절차를 수행 해야 한다. LVS를 위해 겹침접점을 수정한 레이아웃에서 SPICE 네트리스트를 추출 한다. 수정한 레이아웃 파일명이 cpu_fixed.mag 라면,

    $ ../../../scripts/extract_spice.sh cpu_fixed

추출된 네트리스트는 cpu_fixed.spice 다. 합성후 얻은 네트리스트와 LVS를 실시한다.

    $ netgen -batch lvs \
            "cpu_fixed.spice cpu_fixed" \
            "../synthesis/cpu.spc cpu"  \
            ../../../tech/etri050_setup.tcl comp.out

레이아웃에서 추출한 SPICE 네트리스트는 표준 셀의 내부 트랜지스터 회로까지 포함되었으므로 블랙박스 옵션은 사용하지 않았다. 수동 편집된 레이아웃임을 감안해 상세하게 트랜지스터 회로 수준의 LVS를 실시했다.

        ......
    Contents of circuit 1:  Circuit: 'DFFPOSX1'
    Circuit DFFPOSX1 contains 22 device instances.
      Class: pfet                  instances:  11
      Class: nfet                  instances:  11
    Circuit contains 17 nets.
    Contents of circuit 2:  Circuit: 'DFFPOSX1'
    Circuit DFFPOSX1 contains 22 device instances.
      Class: pfet                  instances:  11
      Class: nfet                  instances:  11
    Circuit contains 17 nets.
        ......
    Circuit 1 contains 1983 devices, Circuit 2 contains 1983 devices.
    Circuit 1 contains 1998 nets,    Circuit 2 contains 1998 nets.

    Final result:
    Circuits match uniquely.

비교의 대상이된 두 회로 모두 표준 셀 내부의 트랜지스터까지 검사되었음을 보여준다.

VI-4. 디자인 룰 검사(DRC)

6502 CPU의 베릴로그 RTL을 합성한 네트리스를 가지고 레이아웃(반도제 공정용 적층 도면)을 만들어 냈다. 자동화 도구가 행한 2만여개에 이르는 배선이 공정의 도면 작성 규칙(Design Rule)에 부합하는지 검사한다. 배선 자동화 도구는 표준 셀의 LEF에 규정된 도면 규칙(디자인 룰, Design Rule)을 참조 하지만 이를 완벽히 지켜 내지 못한다. LEF의 도면 규칙은 배선을 담당할 금속선의 두께와 인접 선 사이 간격 그리고 접점의 크기를 규정한다. 레이아웃 도구 Magic 을 써서 설계 규칙을 검사(DRC, Design Rule Check)하고 규정에 위배된 부분을 찾아 수정한다.

    $ magic -d XR cpu_fixed.mag

Magic의 명령 줄에서 설계규정 위반을 검사한다.

20개의 위반이 있다고 나온다. DRC 관리자 창을 열어 규정 위반 개소를 찾아 수정해 준다. 대부분 금속 배선 사이의 간격 위반 사항이다. 동일한 네트의 경우 비아 간격이 전기적으로 문제가 되지 않으나 오류로 판정한다. Magic의 디자인 룰 검사는 그렇게 지능적이지 못하다. 보고된 모든 DRC 오류난 개소를 찾아 수정해 준후 다시 검사하면 여전히 상당수의 위배사항이 있다고 보고된다.


오류 메시지를 보면,

This layer can't abut or partially overlap between subcells

인접 셀 사이에 겹치는 부분이 있다는 보고다. 공정 설계룰의 해당 사항이 아닌 Magic 의 내부 규정이다. 표준 셀을 수평으로 이어 붙이는 방식으로 배열 되는 점을 감안해 전원과 접지선을 유효 영역보다 넓게 그렸기 때문이다. 레이아웃을 검사하고 수정하다 보면 오픈 소스 자동화 도구들의 비 지능적인 모습을 종종 보게될 것이다. 상용 설계 자동화 도구들이 내세우는 '지능적' 이라는 표현이 동원되는 이유를 이해할 수 있다.

비록 오픈 소스 '자동화' 도구들이 지능이 지능적이지 않더라도 검사 수단을 제공 하고 있는 점은 다행이다. 그때마다 설계자의 판단이 필요하고 수정이 가해진 후 검증은 필수다. 수정한 레이아웃에서 SPICE 네트리스트를 추출하고,

    $ ../../../scripts/extract_spice.sh cpu_core

LVS 를 실시한다.

    $ netgen -noc -batch lvs
            "cpu_core.spice cpu_core" \
            "../synthesis/cpu.spc cpu" \
            setup.tcl LVS_cpu_Core.txt

LVS의 결과는 LVS_cpu_Core.txt 에 저장토록 했다. 잘못된 사항이 있는 면밀히 검토하여 최종 레이아웃 결과물을 확보한다. LVS 검사시 오류가 났을 경우 해당 네트를 찾아 수정하는 과정은 이전 예제 'ALU8' 편에서 설명 하였다[바로가기].

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

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