This blog is about VLSI design using Open-Source EDA Tools, including SystemC, iVerilog, Yosys, Auto-P&R, NetGen and Magic.
If you're about to begin IC design, Start here;
"[베릴로그 RTL 예제] 탁구 게임기"는 "내 칩 설계교실"의 한학기 분량의 교재 입니다. 오픈-소스 툴 사용법은 줄이고 디지털 반도체 "설계"에 집중합니다. 선수과목으로 "디지털 논리회로", 베릴로그 HDL 그리고 C++ 과목을 이수를 전재로 쉽게 작성하려고 했습니다. 디지털 회로에서 배웠던 카운터 회로부터 시작하여 시스템 수준 테스트벤치, 코-시뮬레이션, FPGA 활용 코-에뮬레이션 검증 그리고 "내 칩 제작 서비스"의 공정으로 합성에서 레이아웃 생성까지 다룹니다. 총 8편으로 구성되었습니다.
2-1. 도트 매트릭스 그래픽 LCD 구동 칩 2-2. 인터페이스 프로토콜 2-3. 그래픽 데이터 메모리 2-4. SystemC 모델 a. 리셋 동작 b. 명령 또는 데이터 구분 c. 명령 해석 d. 그림 데이터 접근(읽기 또는 쓰기) 2-5. 실습 a. 따라하기 b. 과제
7-1. 테스트벤치 재사용 코-에뮬레이션 7-2. "내 칩" 에뮬레이션 검증 키트 7-3. 에뮬레이터 작동 모드 a. 싸이클 상세(CA, Cycle Accurate) 모드 b. 전송수준(TL, Transaction Level) 모드 c. 시스템 응용(SA, System Application) 모드 7-4. 실습 및 과제 a. 싸이클 상세(CA) 모드 b. 전송수준(TL) 모드 c. 시스템 응용(SA) 모드 d. 과제
8. "내 칩" https://fun-teaching-goodkook.blogspot.com/2026/03/rtl-8.html 8-1. 반도체 제조도면 8-2. 합성 8-3. 합성 후 시뮬레이션 8-4. 표준 셀 배치와 배선 8-5. 사인-오프: '레이아웃' 도면 검사 a. 적층 비아 검사(Stacked Via Check) b. 디자인 룰 검사(Design Rule Check) c. 레이아웃 대 회로도(Layout versus Schematic) 검사 8-6. 칩-탑 8-7. 실습 및 과제
8. "내 칩" 8-1. 반도체 제조도면 8-2. 합성 8-3. 합성 후 시뮬레이션 8-4. 표준 셀 배치와 배선 8-5. 사인-오프: '레이아웃' 도면 검사 a. 적층 비아 검사(Stacked Via Check) b. 디자인 룰 검사(Design Rule Check) c. 레이아웃 대 회로도(Layout versus Schematic) 검사 8-6. 칩-탑 8-7. 실습 및 과제
---------------------------------------------------------------------------------------------------------------- 오픈-소스 반도체 설계 도구가 설치된 "내 칩 디자인 킷"의 WSL 가상 디스크 이미지 [링크] ----------------------------------------------------------------------------------------------------------------
8. "내 칩"
설계와 검증을 마친 "탁구 게임기"를 ASIC으로 제작하기로 한다. 반도체 제조 공정은 "내 칩 제작 서비스[모아팹 링크]"의 0.5um Si-CMOS 2-Poly 3-Metal 공정이다. 학생들의 설계를 제출 받아 무료로 제작해주는 MPW 서비스다. 이 서비스를 이용 하려면 지원서와 함께 제조도면(레이아웃)을 GDS 형식으로 제출한다. 오픈-소스 반도체 설계 도구를 사용하여 구축된 표준 셀 디자인 킷[링크]을 활용하여 베릴로그 합성에서 GDS 레이아웃을 생성하는 과정을 설명한다.
"탁구 게임기"를 베릴로그로 기술하고 시뮬레이션과 에뮬레이션으로 검증까지 마쳤다. 설계를 마친 셈이다. 이제 "내 칩"을 제작의뢰 하기 위해 도면을 그릴 차례다. 설계자가 반도체라는 물질을 가지고 트랜지스터를 제조하는 과정을 모두 알 필요는 없다. 궁금 하다면 이래의 동영상을 한번 보는 것 만으로 충분하다.
반도체 제조 도면을 "레이아웃"이라 한다. 평면위에 반도체 물질을 배치하여 트랜지스터를 구성하고 이들을 배선한 기하학적인 도면이다. 전자회로 인쇄기판 PCB(Printed Circuit Board)의 도면과 다를바 없다. 도면의 그림 형식이 GDS 다. 간단한 "탁구 게임기"만 해도 필요한 트랜지스터 갯수가 수천에 이른다. 이들을 평면에 배치와 배선을 손수 할 일이 아니다. 프로그래밍 언어로 코딩을 해놓으면 컴파일러가 알아서 기계어로 바꿔 주고 운영체제가 이를 실행 시켜주었다. "탁구 게임기"를 베릴로그로 코딩해 놓으면 합성기가 이를 디지털 논리회로로 바꿔주고 자동 배치 배선 도구가 도면을 완성해 준다. 반도체 도면 생성은 자동화 되어있다.
제조도면 그리기는 "설계"가 아니다.
8-2. 합성
앞서 에뮬레이터 검증 편에서 "탁구 게임기"를 묘사한 베릴로그 문장을 FPGA 반도체에서 작동시켰었다. 논리회로도를 작성하지 않았었고 배치와 배선까지 자동화 도구가 해줬다. 반도체 공장에 "내 칩"을 제조해 달라고 도면을 만드는 과정 역시 상당부분 자동화 되어있다. FPGA 에서 0.5um CMOS 공정의 전용 칩 ASIC(Application Specific IC)으로 바뀌었을 뿐이다.
"합성"은 베릴로그로 묘사된 구문을 디지털 논리 회로도로 변환해주는 과정이다. "탁구 게임기"를 묘사한 베릴로그 문장을 디지털 논리회로로 변환해 주는 오픈-소스 도구는 Yosys 다. 이 합성도구를 사용하는 방법은 GNU C++ 컴파일러 사용법과 다르지 않다. 다만 제조할 공정을 지정하고 라이브러리의 경로를 맞춰줘야 하는 절차가 필요하다. C++컴파일러에서도 유사한 절차를 따라야 하지만 개발환경 도구들(아듀이노 IDE, 라즈베리 SDK 등)이 사전에 설정해 놓은 덕에 프로그래머는 수월하게 개발을 할 수 있다. 오픈-소스 반도체 설계 도구의 개발환경이 QFlow 다. 그래픽 사용자 인터페이스 GUI(Graphic User Interface) 대신 명령줄 인터페이스 CLI(Command Line Interface)다. "탁구 게임기"를 디지털 논리회로로 합성해보자. 오픈-소스 반도체 개발 환경 QFlow 는 마이크로소프트사의 비쥬얼 스튜디오처럼 친절하지 않다는 점을 미리 기억해 두자. 검증을 마친 설계 파일들을 바탕으로 합성을 수행하기로 한다. 아래 과정은 리눅스 운영체제 상에서 도구의 사용법을 보여주기 위한 예시이므로 따라할 필요는 없다. 추후 "실습"에서 다룰 것이므로 지금은 읽기와 이해에 집중하자.
QFlow 를 사용할 환경이 준비됐다. 이후 과정은 모두 명령줄로 실행될 것이다. QFlow GUI는 더이상 사용하지 않을 것이므로 종료한다. 디렉토리 목록을 보면 project_vars.sh 가 생성된 것을 확인한다.
$ ll
total 24 drwxr-xr-x 2 mychip mychip 4096 Mar 22 11:37 layout drwxr-xr-x 2 mychip mychip 4096 Mar 22 11:37 log lrwxrwxrwx 1 mychip mychip 11 Mar 22 11:17 source -> ../pong_SbS drwxr-xr-x 2 mychip mychip 4096 Mar 22 11:18 synthesis -rw-r--r-- 1 mychip mychip 1733 Mar 22 11:37 project_vars.sh -rwxr--r-- 1 mychip mychip 1461 Mar 22 11:37 qflow_exec.sh -rw-r--r-- 1 mychip mychip 683 Mar 22 11:37 qflow_vars.sh
합성 명령을 주고 QFlow 실행 한다.
$ qflow synthesize -T etri050 pong_SbS
화면에 메시지가 순식간에 지나간다. log 디렉토리에 합성기의 메시지들이 기록된다. 노련한 설계자는 도구가 보여주는 각종 메시지를 읽고 이해한다. 실력은 이 기록 파일들을 이해하고 적절한 대응을 할줄 아는가에 달렸다. 최소한 합성 오류가 없다는 것부터 확인하자.
Done.
합성 로그 파일 log/synth.log 에서 기초적으로 확인할 사항은 "내 칩"의 디지털 회로 구성이다. 회로의 규모를 파악할 수 있다.
Qflow synthesis logfile created on Sun Mar 22 11:46:32 AM KST 2026 Running yosys for verilog parsing and synthesis
yosys -s pong_SbS.ys
/------------------------------------------------------------------\ | yosys -- Yosys Open SYnthesis Suite | | Copyright (C) 2012 - 2026 Claire Xenia Wolf<claire@yosyshq.com>| | Distributed under an ISC-like license, type "license" to see | \------------------------------------------------------------------/
506개의 표준 셀이 동원되었고 결선은 472개다. 조합 논리 셀(AND, OR, NOT 게이트)과 비동기 셋과 리셋이 있는 D-플립플롭이 있다. 이어 몇가지 중간 파일들을 만들어 냈다고 알려준다. 주로 네트리스트 파일들이다. 네트리스트는 논리 게이트와 플립플롭들의 결선을 언어로 기술한 것으로 회로도(schematics)를 그림 대신 언어로 표현했다. Spice 파일은 레이아웃과 LVS 용으로 사용될 것이다.
Generating RTL verilog and SPICE netlist file in directory /home/mychip/MyChip_Work/07_Co-Emulation/ETRI050/synthesis
합성기의 오류는 없을까? 베릴로그 구문에서 디지털 회로로 변환(합성)해 주는 Yosys 합성기는 소프트웨어(응용 프로그램)이다. 내부 '버그'로 부터 자유롭지 않다. 게다가 합성의 결과로 얻은 네트리스트는 소프트웨어에서 디지털 회로의 하드웨어로 옮겨 왔으므로 '회로 경로' 상 시간지연을 담고 있다. 클럭 엣지의 시간조건 오류(바이얼레이션, clock timing violation, setup-hold violation)도 살펴봐야 한다. 변환이 기능적으로 이상이 없을지, 회로상 바이얼레이션은 없을지 확인해보기 위해 합성 후 네트리스트 시뮬레이션을 실시한다.
합성 후 시뮬레이션 용도의 네트리스트 베릴로그로는 synthesis/pong_SbS_mapped.v 다. 무려 3천줄이 넘는다. 합성 로그에서 봤던 506개의 셀들과 450여개에 이르는 배선(wire)들이 기술되었다. (*...*) 는 합성기 내부 정보를 표시하는데 디지털 셀들이 베릴로그의 어느 문장에서 도출되었는지 표시하고 있다. 불필요하게 생성된 부분은 없는지 확인 할 수 있다.
합성 후 네트리스트의 하위 모듈들(BUFX2, DFFSR 등)은 모두 표준 셀이다. 이 표준 셀들의 기능적, 시간적 모델은 디자인 킷으로 제공된다. 표준 셀의 타이밍 모델과 네트리스트를 묶어 시뮬레이션을 실시한다. 합성 후 네트리스트 시뮬레이션 또한 검증의 일관성을 유지해야 한다. 기능 시뮬레이션에 사용했던 SystemC 테스트 벤치를 네트리스트 타이밍 시뮬레이션에서도 동일하게 적용한다. 베릴로그의 VPI(Verilog Procedural Interface)를 통하면 C 언어로 작성된 함수를 호출할 수 있다. 베릴레이터가 포용하는 범위는 제한적이다. 베릴로그로 높은 추상화 수준에서 타이밍 모델링할 수 있는 사용자 지정 프리미티브(UDP, User Defined Primitives)를 지원하지 않는다. 따라서 네트리스트 타이밍 시뮬레이션은 다른 오픈-소스 베릴로그 시뮬레이터 이카루스베릴로그 iVerilog를 사용한다.
VPI(PLI2.0) 표준은 매우 방대하다. 객체 표현 추상성이 낮은 C 언어에 기초하고 있어서 하드웨어를 기술하려면 번거로운 절차를 따라야 한다. 운용 방식은 기본적으로 사건과 콜-백 함수의 조합이다. GNU C++ 컴파일러의 넓은 호한성 덕에 SystemC의 C++를 VPI에 연결 시킬 수 있다. 방대한 VPI에 대한 설명은 다음으로 미루고 준비된 VPI 루틴을 활용하여 네트리스트 타이밍 시뮬레이션을 수행해본다.
vpi_stub:`./vpi_stub.vpi' failed to open using dlopen() because:
libsystemc.so.3.0: cannot open shared object file pong_SbS_TB.v:59: Error: System task/function $sc_pong_SbS_tb() is not defined by any module. pong_SbS_TB: Program not runnable, 1 errors.
쉐어드 오브젝트 libsystemc.so.3.0 를 찾지 못해서 VPI 함수 $sc_pong_SbS_tb()를 호출할 수 없다고 한다. 리눅스 파일 시스템에서 동적 링크 SystemC의 쉐어드 오브젝트 파일의 위치를 찾아보자.
클럭 clk 의 상승 엣지 부분을 확대해 보면 출력 신호들이 저마다 지연을 반영하고 있는 것을 확인할 수 있다.
만일 타이밍 시뮬레이션에서 오류가 발생한다면 디지털 파형은 중요한 단서를 제공한다. 베릴로그 설계에서 플립플롭이 모두 비동기식 리셋을 가졌음에도 불구하고 초기 "알수없음"으로 시작하는 이유를 찾아보라.
8-4. 표준 셀 배치와 배선
수백개에 이르는 부품을 배치하고 배선까지 수동으로 할 수 있는 인쇄회로 기판 PCB 설계 능력자를 상상하기 어렵다. 반도체 설계에서 표준 셀은 '부품'에 해당한다. "탁구 게임기"를 합성하여 얻은 네트리스트에 표준 셀이 500여개에 이른다. 배치와 배선은 자동화 할 수 밖에 없다. 표준 셀 자동 배치에 줄수 있는 옵션은 기판의 가로세로비, 입출력 포트(핀)를 뽑을 상하좌우 방향, 표준 셀 밀도다.
배치 평면의 가로세로비는 자동 배치 설정 파일 layout/pong_SbS.par 에서 지정한다. 이 파일은 합성 과정에서 생성된다. TWMC*chip.aspect.ratio 값을 변경하여 가로 또는 세로로 긴 배치를 할 수 있다. 기본 값은 1.0으로 정방형으로 배치한다.
# etri050.par --- Parameter file for GrayWolf
........
TWMC*chip.aspect.ratio : 1.0
GENR*flip_alternate_rows : 1
향후 패드 부착 위치를 지정하여 패키지 했을때 IC 부품 핀 번호에 규칙성을 가지도록 한다. 특히 한 신호가 다수의 비트로 구성되는 디지털 칩의 경우 응용 보드를 제작할 때 매우 유리하다. "내 칩"의 소비자를 고려해야 한다. 입출력 포트를 뽑을 방향을 지정하는 파일은 layout/pong_SbS.cel2 이다. 이 파일은 자동으로 생성되지 않으므로 직접 만들어 주어야 한다.
$ touch layout/pong_SbS.cel2
"탁구 게임기"는 x_pos와 y_pos 가 여러 비트로 구성된 포트다. 각각 좌측과 하단에 배치하기로 하자. 핀 배치 설정 파일의 예는 다음과 같다. 지정되지 않은 핀들은 임의로 배치된다.
$ cat layout/pong_SbS.cel2
padgroup _Clk_ permute twpin_clk nonfixed restrict side T
padgroup _x_pos_ permute twpin_x_pos[0] nonfixed twpin_x_pos[1] nonfixed twpin_x_pos[2] nonfixed twpin_x_pos[3] nonfixed twpin_x_pos[4] nonfixed twpin_x_pos[5] nonfixed twpin_x_pos[6] nonfixed restrict side L
padgroup _y_pos_ permute twpin_y_pos[5] nonfixed twpin_y_pos[4] nonfixed twpin_y_pos[3] nonfixed twpin_y_pos[2] nonfixed twpin_y_pos[1] nonfixed twpin_y_pos[0] nonfixed restrict side B
표준 셀 배치 밀도는 QFlow의 프로젝트 파일 project_vars.sh 에서 지정한다. 아울러 겹친 비아 배선을 금지해 놓아야 한다.
# Router command options: # ------------------------------------------- set route_show = 1 set via_stacks = none
ETRI050 디렉토리로 이동 후 자동 배치 명령을 주어 QFlow를 실행 한다.
$ pwd ~/MyChip_Work/07_Co-Emulation/ETRI050
$ qflow place -T etri050 pong_SbS
이어 배선이다.
$ qflow route -T etri050 pong_SbS
"탁구 게임기"는 크지 않은 설계인 까닭에 배치와 배선은 순식간에 끝난다. 배치와 배선은 상당히 까다로운 과정으로 자동화 도구를 운영하는 과정에서 큰 시간 비중을 차지하므로 신중히 결정해야 한다. 마이크로 프로세서와 주변장치들이 포함된 시스템 규모의 설계인 경우 배치와 배선에만 수시간을 넘어 수일씩 걸린다. 따라서 FPGA 를 비롯하여 상용 자동화 도구에서도 매우 공을 들이는 부분이기도 하다. 블럭으로 나눠 각각 배치배선 후 매크로 단위로 재배치 하거나 수정이 없는 부분을 따로 분리하여 하드 매크로로 사용하는 등의 기법이 동원된다. 이 때 각 블럭들의 관리 전략이 매우 중요하다.
자동 배치와 배선을 마치면 표준 셀을 병합해 준다.
$ qflow migrate -T etri050 pong_SbS
자동 배치와 배선 그리고 표준 셀 병합을 마치면 레이아웃은 생성된다. 검증이 완료된 설계에서 제조도면을 만드는 과정은 자동화 도구에 의하여 수행된다. 디지털 반도체 설계에서 레이아웃 도면을 손수 그릴 일은 없다. 다시한번 상기해 둔다. 도면 그리기를 "설계"로 오해하지 말자.
8-5. 사인-오프: '레이아웃' 도면 검사
자동 배치와 배선 도구의 오류는 없을까? 합성기와 마찬가지로 이 자동화 도구 역시 '버그'로부터 자유롭지 못한 응용 프로그램이다. 자동 배치배선도구가 만들어낸 레이아웃을 검사해 봐야 한다. 자동화 도구가 만들어낸 도면이 저장된 디렉토리 layout로 이동한다.
$ cd layout
$ ls -l
total 3392 -rw-r--r-- 1 mychip 34 Mar 22 22:19 fail.out -rw-r--r-- 1 mychip 45375 Mar 22 22:19 fillcells.txt -rw-r--r-- 1 mychip 1706 Mar 22 22:19 migrate_pong_SbS.tcl -rw-r--r-- 1 mychip 361263 Mar 22 22:19 pong_SbS.cel -rw-r--r-- 1 mychip 539 Mar 22 21:50 pong_SbS.cel2 ....... -rw-r--r-- 1 mychip 264599 Mar 22 22:19 pong_SbS.def -rw-r--r-- 1 mychip 1362701 Mar 22 22:19 pong_SbS.lef -rw-r--r-- 1 mychip 268021 Mar 22 22:19 pong_SbS.mag -rw-r--r-- 1 mychip 1671 Mar 22 11:37 pong_SbS.par ....... -rw-r--r-- 1 mychip 98630 Mar 22 22:19 pong_SbS_unroute.def
많은 중간(임시) 파일들이 보이는데 최종 레이아웃은 pong_SbS.mag 다. 레이아웃을 표현하는 파일 형식은 사용하는 도구마다 상이하다. 오픈-소스 레이아웃 편집 도구 Magic의 파일 확장자는 .mag 다. 최근 혼란을 피하기 위해 업계 표준으로 OASIS(An Open Artwork System Interchange Standard)가 제정되었다. 전통적으로 사용되어왔던 형식은 GDS다. 반도체 제조 공장에 제출하는 형식이다.
반도체 제조 공장에 제출할 도면을 검사하려는 참이다. 반도체 제조공장의 사정에 따라 공정 특성과 제약사항이 있다. 이 규정은 일반적인 사항이 아니므로 특별히 전용의 검사도구가 필요하다. 이러한 도구를 '인-하우스 툴(in-house tool)'이라 하며 디자인 킷의 일부로 제공된다. 이후 진행할 '레이아웃' 검사에 사용된 도구들은 "내 칩 MPW" 공정용 인-하우스 툴을 사용한다. '사인-오프(sign-off)'는 반도체 제조 공장에 제출할 도면이 최종적으로 공정의 요구조건을 따랐는지 확인 도장을 찍는 절차다. 적층 비아 검사(Stacked Via Checl), 디자인 룰 검사(Design Rule Check), 회로도 대 레이아웃 검사(Layout Versus Schematic Check)가 이에 해당한다. 내 칩 제작 서비스의 지원서에 이를 이행 했음을 확인하는 항목을 두고 있다.
a. 적층 비아 검사(Stacked Via Check)
"내 칩 MPW" 공정은 3개의 금속층을 가진다. PCB로 치면 3층 기판인 셈이다. 금속층 사이의 연결을 위해 뚫는 구멍을 비아(via)라 한다. "적층 비아"는 가장 아랫층과 윗층을 구멍 한개로 연결한 경우다.
"내 칩 MPW" 공정은 적층 비아를 금지한다. 인-하우스 도구 check_via_stack.py는 레이아웃 파일 pong_SbS.mag 을 읽어 금속 1층과 2층 사이의 비아와 금속 2층과 3층의 비아 사이의 거리를 검사한다. 이 도구는 파이썬으로 작성되었다.
$~/ETRI050_DesignKit/scripts/check_via_stack.py pong_SbS \ m2contact m3contact 6 | \ tee pong_SbS_Stacked.log
-------------------- Checking Stacked VIA in pong_SbS.mag From VIA: << m2contact >> To VIA : << m3contact >> Margin : 6 Mult=1 / Div=2
하지만 1개의 적층 비아가 검출 되었다. 자동화 도구가 항상 완벽하지 않다는 것을 보여준다. 레이아웃 편집 도구 Magic을 사용하여 적층 비아를 찾아 수정해 주어야 한다. 인-하우스 도구 check_via_stack.py는 적층 비아가 발견된 위치에 오류 표시를 해놓은 pong_SbS_Stacked.mag를 생성한다. 이 파일을 읽어 오류 위치를 찾아 수동으로 편집해 주어야 한다.
$ magic -d XR pong_SbS_Stacked.mag
적층 비아의 위치를 찾아 수정하려면 레이아웃 도구 Magic 의 사용법을 익혀야 한다. 그나저나 저 넓은(?) 평면위에서 적층 비아가 표시된 위치는 어떻게 찾을까?
b. 디자인 룰 검사(Design Rule Check)
디자인 룰은 공정의 정밀도를 감안하여 기하학적 허용치를 규정한 것이다. 표준 셀은 이 규정에 따라 제작되었다. 자동 배선도구에 의해 그려진 금속 배선이 디자인 규칙을 따랐는지 검사한다. 디자인 룰 검사를 수행하는 오픈-소스 도구는 Magic이다. 레이아웃 편집하는 목적이 아니므로 스크립트 run_drc.sh로 DRC를 수행한다. 이 스크립트는 인-하우스 도구의 일부로 디자인 킷에 포함되어 제공된다.
$~/ETRI050_DesignKit/scripts/run_drc.shpong_SbS | \ tee pong_SbS_DRC.log
Magic 8.3 revision 538 Starting magic under Tcl interpreter Using the terminal as the console.
......
Using NULL graphics device. Processing system .magicrc file Input style lambda=0.30(p): scaleFactor=30, multiplier=1
DRC 오류는 없으나 표준 셀이 겹친(overlap) 오류가 다수 검출 되었다. 배치될 때 이웃하는 표준 셀과 전원선을 공유하도록 여유를 두었기 때문이다. 표준 셀의 겹침은 무시해도 좋다.
c. 레이아웃 대 회로도(Layout versus Schematic) 검사
자동 도구가 배선을 완결 했는지 검사한다. 배선된 레이아웃으로부터 네트리스트를 추출하여 합성으로 얻은 네트리스트와 비교한다. 네트리스트 비교를 수행하는 오픈-소스 도구는 netgen 이다. 레이아웃 도구 Magic은 도면으로부터 Spice 네트리스트를 추출하는 기능을 가지고 있다. 네트리스트 추출과 비교를 수행하는 스크립트는 run_lvs.sh 다. 이 스크립트는 인-하우스 도구의 일부로 디자인 킷에 포함되어 제공된다.
$~/ETRI050_DesignKit/scripts/run_lvs.sh pong_SbS | \ tee pong_SbS_LVS.log
Magic 8.3 revision 538 Starting magic under Tcl interpreter Using the terminal as the console.
.......
Extracting DFFSR into /home/mychip/ETRI050_DesignKit/digital_ETRI/DFFSR.ext: Extracting BUFX2 into /home/mychip/ETRI050_DesignKit/digital_ETRI/BUFX2.ext: Extracting CLKBUF1 into /home/mychip/ETRI050_DesignKit/digital_ETRI/CLKBUF1.ext: Extracting FILL into /home/mychip/ETRI050_DesignKit/digital_ETRI/FILL.ext:
Extracting pong_SbS into pong_SbS.ext: exttospice finished.
두 네트리스트가 완벽히 일치한다. 자동 배치와 배선도구로 생성한 도면에 겹친 비아와 디자인 룰 오류가 발견될 경우 수동 편집이 불가피 하다. 수동 편집 후 LVS 검사는 필수다.
8-6. 칩-탑
"내 칩"이 반도체 부품으로 제작되어 응용 회로에 적용되려면 PCB 기판위에 납땜되어야 한다. 나노 미터 단위에서 기계적 조립이 가능한 미리미터 단위의 세계로 해상도를 높여야 한다. 기계적 측면 뿐만 아니라 전기적으로도 고려되어야 한다. 마이크로 미터 단위의 좁은 길이를 가지고 집적된 트랜지스터의 작동에 필요한 에너지는 나노 와트 미만이다. 자연계에서 발생하는 온갖 전기 에너지(정전기는 수천볼트에 육박한다!)에 의해 트랜지스터의 게이트 간격을 유지하는 산화막이 파괴될 수 있다. 정전기가 칩 내부로 침투하는 것을 차단하고 내부의 미세한 에너지 수준을 외부의 미리와트 세계로 바꿔주어야 한다. 입출력 패드가 이 역할을 한다.
"내 칩 MPW"에서 무료로 제작해 주는 칩의 크기는 1900x1900um 다. 입출력 핀의 갯수는 28개다. 설계와 검증을 마친 "내 칩"의 레이아웃을 이에 맞춰 배치하고 입출력 패드와 연결하는 작업이 '칩-탑'이다.
'칩-탑'은 레이아웃 편집 도구를 사용하여 PCB 그리기와 다를바 없는 금속층으로 연결 패턴을 그리는 작업이다. 아래 링크의 문서를 참고하여 연습해 보자.
total 32 drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 chip_top drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 layout drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 simulation -rw-r--r-- 1 mychip mychip 5064 Mar 22 10:59 Makefile -rw-r--r-- 1 mychip mychip 1771 Mar 22 10:59 project_vars.sh
Makefile이 준비되었다.
$ make
Symbolic link './source' to RTL... Create synthesis folder...
Makefile for "Verilog-RTL Ex.: pong_SbS" QFlow RTL-to-Layout using ETRI 0.5um CMOS Technology
TOP_MODULE=pong_SbS make synthesize TOP_MODULE=pong_SbS make place TOP_MODULE=pong_SbS make sta TOP_MODULE=pong_SbS make route TOP_MODULE=pong_SbS make migrate TOP_MODULE=pong_SbS make lvs TOP_MODULE=pong_SbS make size
CC BY-NC, by GoodKook, goodkook@gmail.com
베릴로그 소스 디렉토리를 심볼 링크 하고 합성으로 생성되는 임시 파일들이 저장될 디렉토리 synthesis 를 만들었다.
a. 베릴로그 합성
합성명령을 주고 QFlow를 실행한다. 합성 목표 공정은 etri050 이다.
$ make synthesize
qflow synthesize -T etri050 pong_SbS
yosys -s pong_SbS.ys ...... Done.
오픈-소스 합성기는 yosys 다. QFlow가 만든 스크립트 source/pong_SbS.ys 를 불러들여 합성한다.
표준 셀의 외형을 기술한 LEF 파일을 참조하여 합성기의 출력 네트리스트 pong_SbS.rtlnopwr.v로부터 자동 배치 도구용 파일 pong_SbS.cel 을 만든다. 배치 단계에서 pong_SbS.cel2을 참조하여 입출력 핀을 뽑을 방향을 정할 수 있다. 자동배치 도구는 graywolf 다.
[과제] 배치가 완료되면 대략적인 배선 경로를 알 수 있다. 정적 타이밍 분석(STA, Static Timing Analysis)을 통해 가장 긴 경로를 파악할 수 있다.
$ make sta
STA를 수행하여 가장 긴 경로을 가진 신호를 파악하라. STA의 설명은 아래 링크의 문서를 참조한다.
1. AN 545: Design Guidelines and Timing Closure Techniques for HardCopy ASICs[pdf] 2. Achieving Timing Clouser[Link]
c. 표준셀 배선
자동 배선을 실시한다.
$ make route
qflow route -T etri050 pong_SbS
Technology set to etri050 Regenerating files for existing project pong_SbS Running qrouter 1.4.88.T
qrouter -noc -s pong_SbS.cfg
*** Running stage1 routing with defaults Nets remaining: 500 Nets remaining: 400 ...... Nets remaining: 90 Progress: Stage 1 total routes completed: 1196 Failed net routes: 92 ......
*** Running stage3 routing with defaults, 2nd round Nets remaining: 500 Nets remaining: 400 ...... Nets remaining: 3 Nets remaining: 2 Progress: Stage 3 total routes completed: 4620 No failed routes! *** Writing DEF file pong_SbS_route.def Final: No failed routes!
자동 배선 도구는 qrouter 다. 표준 셀이 배치된 DEF 파일 pong_SbS_unroute.def을 읽어 배선을 실시한다. 최적의 배선을 위해 몇번의 배선 시도를 한 후 pong_SbS.def에 저장한다. DEF/LEF는 자동 배치와 배선 도구 사이에 주고받기 위한 업계표준 형식이다. 배선까지 마치면 배선의 길이를 감안하여 선로상의 기생 RC 를 계산한다. RC 값은 반도체 제조 공정에서 제공되는 PDK를 근거로 LEF에 설정되었다. 배선 선로가 길어 지연이 과도할 경우 버퍼를 삽입한다. 만일 버퍼가 삽입되면 논리식은 변함 없지만 네트리스트가 변경 되므로 새로운 네트리스트를 추출해 주어야 한다.
[과제] 레이아웃 디렉토리에서 배선 전 pong_SbS_unroute.def와 배선 후 pong_SbS.def 를 비교해 보고 차이점에 대하여 알아보자.
[과제] 네트리스트 타이밍 시뮬레이션에서 가장 긴 지연을 보였던 네트가 v_sync 였다. 이 네트의 경로에 버퍼가 삽입 되었다. synthesis/pong_SbS_mapped.v와 synthesis/pong_SbS_postroute.v 를 비교하고 삽입된 버퍼를 확인하라.
[과제] synthesis/pong_SbS_postroute.v dp 에 대하여 타이밍 시뮬레이션을 실시하고 synthesis/pong_SbS_mapped.v의 결과와 파형을 비교해보라.
d. 표준 셀 병합
배치와 배선을 완료하여 얻은 DEF 파일 layout/pong_SbS.def은 표준셀과 배선의 좌표들로 채워져있다. 표준 셀의 내부 트랜지스터 모습은 디자인 킷의 라이브러리로 제공된다. DEF의 표준 셀 내부를 채워 넣음으로써 레이아웃을 완성 할 수 있다. 표준 셀을 병합하는 도구는 Magic이다.
$ make migrate
qflow migrate -T etri050 pong_SbS
Technology set to etri050 Regenerating files for existing project pong_SbS Running magic 8.3.538
*************************************** 2 Stacked Contact and/or Via found! Magic layout "pong_SbS_Stacked.mag" created with DRC error layer
2개의 적층 비아가 검출되었다. 레이아웃 편집기 Magic으로 겹친 비아를 에러 레이어로 표시해 놓은 pong_SbS_Stacked.mag 를 수정한다.
$ magic -d XR pong_SbS_Stacked
적층 비아를 찾기위해 다음과 같은 순서로 명령을 입력한다.
view
select
expand
drc find next
findbox zoom
굳이 Magic의 명령어 사전을 찾아보지 않더라도 그 뜻을 알 수 있다. Magic은 레이아웃 편집을 위해 GUI의 외양을 띄고 있지만 메뉴 체계는 매우 빈약하고 대부분 Tcl 명령창을 통해 작업을 수행한다.
Magic을 포함해서 상용 설계 도구들이 가지고 있는 방대한 명령을 갖추고 있다. 모두 알아야 만 할것 같은 강박은 버리자. 그림판에 마우스 포인터를 찍어 사각형을 만들고 그안에 레이어를 채우거나 이미 그려져 있는 사각형을 임의의 위치로 옮기는 등 보통의 앱에서 그림 그리기와 다를바 없다. 다만 그림 그리기의 생산성 향상을 위해 다양한 명령들을 파생시킨 탓에 명령체계가 복잡해졌을 뿐이다. 이 명령을 하나라도 더 안다는 것을 자부하는 우를 범하지 않도록 하자. "설계"는 그림 그리기 도구 사용법이 아니다. 다행히 대부분 명령들은 일상 영어 형식을 빌어 만들어졌다. Magic의 명령어 목록은 아래 링크에서 찾을 수 있다. 사용법을 간단하게 요약한 문서[pdf]도 디자인 킷에 포함되어 있으니 찾아보라.
긴 분량으로 한학기 수업용으로 제작되었다고 한다. 공개된 SkyWater130 공정 PDK를 대상으로 한다. 따라할 필요 없다. 모두 이해할 필요도 없다. 처음 7편까지 보고 반도체 설계 도구의 감을 잡아보도록 한다.
[과제] 적층 비아를 모두 찾아 수정해 준 후 pong_SbS 로 저장하고 Magic을 종료 한다.
save pong_SbS
quit
적층 비아가 모두 해소되었는지 다시 검사하라.
[참고] 연구노트 12: MPW 요건 맞추기, FIR 필터의 파이프라인 PE 설계 (2부:GDS)[pdf][Link]
e-2. 레이아웃 대 회로도 비교
레이아웃 대 회로도 비교(LVS, Layout Versus Schematics)는 레이아웃에서 추출한 네트리스트와 합성 후 자동 배치와 배선까지 마친 네트리스트를 비교한다. 적층 비아를 해소하느라 수동 편집된 레이아웃은 반드시 LVS 검사를 해야 한다.
$ rm pong_SbS_LVS.log
$ make lvs
......
Final result: Circuits match uniquely. . LVS Done.
[주] 네트리스트는 synthesis 디렉토리에 Spice 형식으로 저장된다. 자동 배치와 배선을 거치면서 버퍼가 삽입되었으므로 합성 직후 생성된 네트리스트는 레이아웃 검사단계의 네트리스트와 다르다. 합성 후 베릴로그 네트리스트 pong_SbS_mapped.v와 자동 배선 후 pong_SbS_postroute.v는 차이가 있다. 레이아웃 검사단계에서 비교의 기준이 되는 synthesis/pong_SbS.spc 는 자동 배선을 마친 후 얻은 네트리스트다.
e-3. 디자인 룰 검사
디자인 룰 검사,
$ make drc
~/ETRI050_DesignKit/scripts/run_drc.sh pong_SbS | \ tee pong_SbS_DRC.log
Magic 8.3 revision 538
...... Cell pong_SbS read from current working directory
...... Cell pong_SbS_DRC has 17 error tiles. Total DRC errors found: 0 This layer can't abut or partially overlap between subcells Design-rule checker statistics (recent/total): Squares processed: 110/110 Tiles processed: 332311/332311 Edges pieces processed: 680709/680709 Constraint areas checked: 3467199/3467199 Multi-tile constraints: 2494110/2494110 Interaction areas processed: 84/84 Tiles processed for interactions: 332311/332311 Tiles processed for arrays: 0/0
[과제] 레이아웃 검사 중 나오는 모든 오류가 치명적인 것은 아니다. 충분한 이유가 있는 경우 설계자는 해당 사항을 "용인(waive)" 할 수 있다. DRC 오류 중 아래의 경우 "용인" 가능한 이유를 설명해보자.
This layer can't abut or partially overlap between subcells
f. 칩-탑
검증과 검사를 마친 "탁구 게임기" 레이아웃에 입출력 패드를 달고 "내 칩"제작 의뢰용 GDS를 생성한다. 칩-탑 작업 디렉토리로 이동,
$ cd ~/MyChip_Work/Projects/RTL/pong_SbS/08_ETRI050/ETRI050/chip_top
$ ls -la
total 32 drwxr-xr-x 2 mychip mychip 4096 Mar 22 10:59 . drwxr-xr-x 7 mychip mychip 4096 Mar 23 20:09 .. -rw-r--r-- 1 mychip mychip 14563 Mar 22 10:59 ETRI050_CMOS.lyp -rw-r--r-- 1 mychip mychip 779 Mar 22 10:59 .magicrc -rw-r--r-- 1 mychip mychip 2591 Mar 22 10:59 Makefile
$ make
Generate Chip-Top: pong_SbS_Top.gds
TOP_MODULE=pong_SbS make copy_pad_frame TOP_MODULE=pong_SbS make copy_core TOP_MODULE=pong_SbS make extract_pad TOP_MODULE=pong_SbS make extract_pin_route TOP_MODULE=pong_SbS make generate_gds
************************************************************** * Measure the size of the Core **************************************************************
Magic 8.3 revision 538 Starting magic under Tcl interpreter Using the terminal as the console.
************************************************************* * Generate GDS layout for Pad *************************************************************
Magic 8.3 revision 538 .....
$ ls -la
total 13376 drwxr-xr-x 2 mychip mychip 4096 Mar 24 18:28 . drwxr-xr-x 7 mychip mychip 4096 Mar 23 20:09 .. -rw-r--r-- 1 mychip mychip 14563 Mar 22 10:59 ETRI050_CMOS.lyp -rw-r--r-- 1 mychip mychip 779 Mar 22 10:59 .magicrc -rw-r--r-- 1 mychip mychip 2615 Mar 24 18:26 Makefile -rw-r--r-- 1 mychip mychip 5292762 Mar 24 18:28 pong_SbS_Core_F.gds -rw-r--r-- 1 mychip mychip 248013 Mar 24 16:36 pong_SbS_Core.mag -rw-r--r-- 1 mychip mychip 520318 Mar 24 18:28 pong_SbS_Pad.gds -rw-r--r-- 1 mychip mychip 7326 Mar 24 18:01 pong_SbS_Pad.mag -rw-r--r-- 1 mychip mychip 10698 Mar 24 18:28 pong_SbS_Pin_Route_F.gds -rw-r--r-- 1 mychip mychip 3967 Mar 24 18:01 pong_SbS_Pin_Route.mag -rw-r--r-- 1 mychip mychip 7553224 Mar 24 18:28 pong_SbS_Top.gds -rw-r--r-- 1 mychip mychip 10594 Mar 24 18:01 pong_SbS_Top.mag
f-7. 최종 GDS
PDK에서 제공된 GPIO로 교체후 마무리,
$ klayout -l ETRI050_CMOS.lyp pong_SbS_Top.gds
GPIO 셀은 매우 민감하다. 아래 링크의 문서에 따라 GPIO 셀들을 PDK에서 제공된 셀로 변경되어야 한다.