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;
[MyChip-on-MyDesk 예제/유튜브] "탁구 게임기"[링크]는 오픈-소스 도구를 사용하여 "내 칩"을 설계하는 예제 입니다. "내 칩"을 설계하기 전에 게임 규칙(알고리즘에 해당하는)을 마이크로 컨트롤러("남의 칩")에 프로그래밍 언어(C++)로 먼저 구현하고 하드웨어 언어(베릴로그)로 전용 칩(ASIC)을 설계하는 반도체 설계 교육 과정의 예제입니다. 미래에 어떤 일을 할지 모르니 반도체 설계를 기화로 내장형 소프트웨어 제작도 맛보길 바라면서 작성한 예제 이기도 합니다.
구글의 인공지능(AI) 제미니에게 "남의 칩"에 구현한 탁구 게임기의 소스를 분석해 달라며 아래와 같이 물어봤습니다.
남이 제작한 소스 코드의 맥락을 파악하는데 도움이 될만한 답변을 해줍니다. 언뜻 신통하다 싶다가 가만히 보니 구체성이 다소 부족합니다. "무료" 버젼이라 그런가요? "유료" 인공지능은 좀더 다른 답변을 줄런지 알 수 없습니다. 어쨌든 인공지능의 답변이 이 소스코드를 설명한 아래 링크의 글을 읽는데 도움이 될 수도 있을 것 같습니다.
"남의 칩"으로 탁구 게임기를 구현하는 이유는 탁구 게임기를 "내 칩"으로 설계하기 전에 탁구 게임의 규칙(알고리즘)을 실현(또는 확인)해 보려는 목적이었습니다. 그리고 하드웨어 언어와 소프트웨어 언어의 차이도 이해할 목적도 있습니다. 막상 해놓고 보니 굳이 "내칩"을 만들어야 해? 라는 "현타"가 옵니다. 그래서 이 글의 마지막에 "고속 마이크로 컨트롤러를 사용하면 충분히 그리고 쉽게 구현 할텐데 굳이 전용 반도체를 만들어야 하는 이유"를 토론해 보자는 과제를 던집니다.
이 질문에 인공지능은 그럴듣 하지만 일반적인 답변을 내놓습니다. 인공지능이 주는 전용 칩의 잇점, "처리속도", "전력효율성" 그리고 "실시간"의 측면에서 "남의 칩"과 "내 칩"을 "탁구 게임기"를 예로 구체적으로 비교할 수 있을까요? 우리는 공학도 입니다. 그럴듣함에 더하여 실제적(실무적)답을 할 수 있어야 합니다. 실제 게임기 "내 칩"을 만들어 봤다면 이 질문에 아주 구체적인 답을 할 수 있을 겁니다. 전용 하드웨어를 설계하는 절차를 이해 했을 것이며 그로부터 얻는 장점을 자신있게 그리고 조리있게 설명한다면 "신입" 이상의 인상을 보여줄 수 있을 것입니다.
소프트웨어와 마찬가지로 꽤나 신통한 설명을 내놓습니다. 그중에 문제점으로 "제공된 소스코드 내부에는 공이 패들에 맞고 튕겨 나가는 판정 로직이 없다"고 합니다. 그래서 이어 질문을 던져봅니다. "패들 충돌 로직 반영 코드"를 작성하라고 했더니 아래와 같은 베릴로그 코드를 내놓았습니다. 중간중간 설명과 함께,
verilog
// 변경 전: 항상 x_ball == 119에서 튕기던 로직을 제거하고 아래 코드로 대체합니다.
reg sign_x;
reg sign_y;
always @( posedge clk or posedge reset)
begin
if (reset)
begin
sign_x <= 0;
sign_y <= 0;
end
else if (v_sync)
begin
// --- 세로 벽 반사 (상/하단 벽은 기존과 동일) ---
if (y_ball == 55)
sign_y <= 1;
else if (y_ball == 0)
sign_y <= 0;
// --- 가로 벽 및 패들 충돌 판정 ---
// 1. 왼쪽 벽에 부딪히면 오른쪽으로 반사
if (x_ball == 0)
sign_x <= 0;
// 2. 패들이 위치한 가로 경계(x_ball == 115)에 공이 도달했을 때
else if (x_ball == 115)
begin
// 공의 y축 위치가 패들의 세로 범위(paddle ~ paddle+20) 안에 있는지 검사
sign_x <= sign_x; // 패들을 놓치면 반사하지 않고 그대로 진행 (실점 처리용)
end
// 3. 패들을 놓쳐서 화면 오른쪽 끝까지 완전히 나갔을 때의 예외 처리 (리셋 대용)
else if (x_ball == 120)
sign_x <= 1; // 임시로 화면 끝에서 튕기게 처리 (이후 점수 루틴 연동 가능)
end
end
예제 작성자(중견 기술자)가 보기에 인공지능의 실력이 만만치 않군요. 그런데 일은 누가 시켰죠? "신입"은 시키는 일을 맡아 하다가 경험이 쌓이고 중견 기술자(연구자)로 성장 합니다. 인공지능도 시키는 일은 잘 합니다. 중견 기술자가 보기에 인공지능이 해놓은 결과를 보면 시원찮은 "신입"보다 빠릿해 보일 겁니다. 그렇다고 "신입"을 뽑지 않는다거나 내보낸다면 그 회사(사회)의 미래가 걱정 스럽습니다. 미래를 바쳐줄 기초는 생각하지 않고 당장 인건비 절약을 따지는 꼴이라는 생각을 떨칠 수가 없군요. 몇년 전까지만 해도 키워 놓으니 대기업으로 떠난다는 중소기업의 사장님들의 하소연을 종종 듣던 때가 있었습니다. 중소기업 사장님에게는 안타깝지만 사회 성장 체계는 엄연했습니다. 이제는 그나마 "신입"조차 내보내는 풍조라고 하니 다가올 미래 사회가 우려 스럽습니다. 중견 기술자의 수명이 다하면 "소"는 누가 키운 답니까?
강의를 하면서 학생들에게 듣는 질문에 "인공지능이 코딩을 해준다고 한다"며 다소 걱정어린 표정을 짓곤 합니다. 여러 매체에서 인공지능이 다 해준다며 신입 직원을 뽑지 않는다는 말을 서슴없이 해대는 까닭에 이제 막 사회에 나서려는 학생들이 어지간히 주눅이 들까봐 걱정 입니다. 사회가 "신입"을 배려해 주지 않더라도 스스로 커가는 패기를 기대해 봅니다. 내 칩 제작 서비스의 오픈-소스 디자인 킷 사용자 그룹 "MyChip-on-MyDesk[https://groups.google.com/g/mychip-on-mydesk]"은 그 패기에 도움과 응원을 보냅니다.
"[베릴로그 RTL 예제] 탁구 게임기"는 "내 칩 설계교실"의 한학기 분량의 교재 입니다. 오픈-소스 툴 사용법은 줄이고 디지털 반도체 "설계"에 집중합니다. 선수과목으로 "디지털 논리회로", 베릴로그 HDL 그리고 C++ 과목을 이수를 전재로 쉽게 작성하려고 했습니다. 디지털 회로에서 배웠던 카운터 회로부터 시작하여 시스템 수준 테스트벤치, 코-시뮬레이션, FPGA 활용 코-에뮬레이션 검증 그리고 "내 칩 제작 서비스"의 공정으로 합성에서 레이아웃 생성까지 다룹니다. 총 8편으로 구성되었습니다.
0. 시작하기 전에...
"내 칩 제작 서비스[바로가기]"의 MPW 경험이 반도체 분야 취업에 도움이 될까?[바로가기]
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-2. 합성 8-3. 합성 후 시뮬레이션 8-4. 표준 셀 배치와 배선 8-5. 사인-오프: '레이아웃' 도면 검사 a. 적층 비아 검사(Stacked Via Check) b. 디자인 룰 검사(Design Rule Check) c. 레이아웃 대 회로도(Layout versus Schematic) 검사 8-6. 칩-탑 8-7. 실습 및 과제
1. 탁구대 벽 그리기 2. 움직이는 공 3. 탁구대와 움직이는 공 4. 탁구채 5. 과제
MyChip-on-MyDesk, "내 칩 제작 서비스" 오픈-소스 디자인 킷 사용자 그룹 --------------------------------------------------------------------------------------------
0. 개요
"남의 칩"으로 탁구 게임기를 제작해본다. 여기서 "남의 칩"은 AVR계열 마이크로 컨트롤러 ATmega328p다. "미니 오실로스코프[링크]"를 만들어 봤던 바로 그 칩이다. 마이크로 컨트롤러는 써넣는 코드(응용 프로그램)에 따라 기능이 바꿀 수 있는 "범용" 칩이다.
마이크로 컨트롤러가 범용이라지만 이 칩 하나로는 아무것도 못한다. 최소한 전원은 넣어 줘야 할 것 이다. USB 를 통하거나 전용 DC-DC 전압 변환기 칩을 통해 배터리로 5V 전원을 안정적으로 공급해 줘야한다. 전원 칩이 없으면 시스템 반도체도 무용지물이다. 전자 정보화 시대가 도래하던 무렵 "도란스 내려!"라고 외치던 패기는 이제 전원 칩 없으면 시스템 반도체(인공지능 반도체) "무쓸모"라는 구호로 옮겨왔다. "전원 칩"이 비메모리 반도체 이기는 하다. (MLCC는?) 이쨌든 범용 마이크로 컨트롤러에 전원과 크리스털 발진 소자(이상한 컨덴서) 그리고 커넥터를 붙여 놓은 "아두이노 프로 미니"보드[그림]를 활용키로 한다. 여기에 비디오 게임기를 만들려고 하는 만큼 시현장치도 있어야 한다[회로도]. 사용할 비디오 시현장치는 가로 128, 세로 64의 그래픽 OLED 모듈이다. 비디오 컨트롤러로는 SSD1306[가술문서]이다. 마이크로 컨트롤러와는 I2C 버스로 연결 되었다.
1. 탁구대 벽 그리기
1인 탁구 게임기의 상대가 되는 벽(wall)을 그려보자. 소스코드는 01_TableDraw.ino [링크]다.
그래픽 장치를 구동하기 위해 이미 만들어 놓은 다양한 라이브러리들을 활용하기로 한다. 각 라이브러리에 속한 함수(API, Application Programing Interface)들을 사용하려면 이들을 정의한 헤더 파일(header file)을 들여온다.
각 라이브러리들의 헤더 파일은 다음과 같다.
- Wire.h: I2C 장치와 통신에 필요한 라이브러리다.
- Adafruits_GFX.h: Adafruit 사에서 개발하여 공개하는 범용 그래픽 라이브러리다. 점찍기, 줄긋기, 사각형 그리기, 원 그리기, 비트맵 문자 표시 등 다양한 함수들을 제공한다. API 문서는 아래링크에서 받을 수 있다.
- DIYables_OLED_SSD1309.h: 특정 OLED 칩의 드라이버 라이브러리다. 수많은 개발자들에 의해 드라이버가 개발되어 공개됐다. 이 드라이버는 SSD1309(2.4"), SSD1315(0.96"), SSD1306(0.96") 등과 호환된다.
- EEPROM.h: 내장된 EEPROM(1K 바이)을 고정 데이터(주변장치 초기 설정 등) 저장공간으로 사용하기 위한 라이브러리다. 프로그램 코드는 플래시 메모리(32K 바이트, 16K x 16Bit)에 저장된다.
다음은 사용할 그래픽 장치의 특성(가로세로 화소크기)과 버스의 주소등을 정의한 후 장치 구동 객체(크래스)를 사례화한다. 앞으로 그래픽 장치로 접근은 모두 이 객체 'oled' 를 통한다.
아듀이노의 개발환경에서 사용하는 코딩 언어는 C++ 다. C/C++ 언어의 시작은 main() 인데 이를 포함하여 각 마이크로 컨트롤러를 장착한 보드(모듈)에 맞게 기본 설정을 미리 해놓고 이를 스타트-업 라이브러리로 제공한다. 굳이 C/C++ 의 기준을 따르면 다음과 같다.
int main(int argc, char** argv)
{
// 보드 특성에 따른 초기화
setup(); // 사용자 초기화
while(true)
loop(); // 사용자 어플리케이션
return 0;
}
무한 반복이 사용된 이유는 아듀이노 개발환경이 별도 운영체제(저장소 및 메모리 관리)가 없는 소규모 컴퓨팅 환경을 목표로 하기 때문이다. main() 이 종료되면 갈곳이 없다!
사용자 초기화는 다음과 같다. 먼저 사용할 그래픽 장치를 초기화 한 후 시작 화면을 꾸미고 탁구대 벽을 그렸다.
고정된 탁구대를 그리고 나면 사용자 어플리케이션이 할일은 없다. 그저 LED만 깜빡인다. 그리고 그려놓은 탁구대를 그래픽 장치로 전송한다.
그래픽 장치는 매우 느리다. 컴퓨터의 시현장치(스크린 모니터)의 갱신율(refresh rate)이 보통 60Hz다. 이는 초당 겨우 60번 화면을 갱신 한다는 뜻이다. 수 기가 헤르츠의 속도로 동작하는 CPU의 논리회로에 비하면 터무니 없다. 전체 시스템의 성능이 가장 느린 장치에 종속되지 않도록 고속의 CPU와 느린 입출력 장치를 직접 붙이지 않고 버스를 통하면 어느정도 입출력 병목(IO device bottleneck)을 해소할 수 있다. 하지만 고속 디지털 회로들 사이의 연결(CPU과 메모리)과 저속 입출력 장치의 연결을 별도의 버스로 분리하는 것 만으로는 충분치 않다.
OLED 시현장치는 마이크로 컨트롤러의 직렬 버스(I2C) 제어기를 통하여 연결되었다. OLED 패널에 점을 찍으려면 CPU는 그래픽 램(GDDRAM)에 값을 써넣는다. 그래픽 컨트롤러(SSD1309의 Display Controller)가 GDDRAM의 값을 그대로 OLED 패널에 뿌린다. 문제는 그래픽 패널의 반응 속도가 매우 느리다는 점이다.
가로 폭 5, 높이 64인 탁구대 벽을 시현하려면 총 320개의 점을 찍어야 한다. OLED 그래픽 컨트롤러의 사양에 따르면 최대 화면 갱신율이 50Hz라고 하는데 소요되는 시간은 20ms 다. 결국 벽을 하나 그리는데 6.4초(~320x20ms)가 걸린다.
점하나 찍을 때마다 그래픽 컨트롤러의 화면을 갱신 시키는 방법은 매우 불합리하다. 그래픽 구동 소프트웨어들은 별도로 그림판 메모리(캔바스, Canvas)를 확보해둔다. CPU는 데이터 램에 확보한 캔바스에 한 화면 분량을 그림을 빠르게 그려 놓고 이를 시현장치의 GDDRAM에 일괄적으로 전송한다. 디스플레이 컨트롤러는 GDDRAM의 내용대로 OLED 패널을 갱신한다. 탁구대 벽을 그리는 API인 fillRect()는 데이터 램에 확보해둔 메모리(캔바스)에 그림 데이터를 채울 뿐이다. 이어 display() 를 호출 하여 시현 장치에 전송하면 OLED 컨트롤러는 화면 갱신을 수행한다.
빠른 데이터 메모리에 그리고 이를 일괄 전송하는 방식은 모든 컴퓨터 그래픽에 적용되는 기법이다. 예를 들어 파이썬의 matplotlib를 보자. 다음은 MNIST 데이터를 시현하는 파이썬 코드 plot_data.py의 일부다. 마지막 줄에 show()를 호출해야 비로서 그림이 화면에 나타난다.
메모리 버퍼(캔바스라고 부르는)에 문자 이미지를 그려놓고 이를 시현하기 위해 display()를 호출하고 있다.
2. 움직이는 공
움직이는 탁구공을 비트맵으로 그리고 움직여보자. 소스 파일은 02_Ball.ino [링크]다.
앞서 벽을 그리기 위해 일일이 점을 찍지 않고 안을 채운 사각형 그리기 API를 활용 했었다. 이번에는 작은 공을 비트맵 이미지로 미리 제작하고 이를 화면에 뿌린다. 이 방법은 화면에 문자 표시하는 방법과 같다. 컴퓨터 게임 그래픽에서 움직이는 캐릭터 이미지를 시현할 때 흔히 사용하는 비트 블릿(BitBlit)기법이다.
공의 비트맵 이미지는 다음과 같다. 공의 이미지는 변경되지 않을 것이므로 프로그램 롬 영역에 넣어둔다. 마이크로 컨트롤러의 제한적인 램 영역을 아낄 수 있다.
비트맵 이미지를 화면의 임의 위치에 그려넣는 API를 활용하여 공을 그린다. 이미지의 움직임을 고려하여 그리거나 지울 수 있도록 하였다.
이제 공을 움직여 보자. 이전에 그렸던 공을 지우고 새 좌표를 계산하여 그린다. 공이 화면 밖으로 나가지 않도록 움직이는 범위를 제한 하였다. 탁구대(화면 영역)에 부딪치면 공은 방향을 바꾼다.
과제: ++yPos와 yPos++의 차이에 대하여 프로그래밍 언어의 순차실행 구문의 관점에서 설명해 보라. 하드웨어 기술 언어(베릴로그)의 병렬 구문 실행과 비교해보자. 아울러 베릴로그 하드웨어 언어에서 단항 연산자 ++, -- 등을 둘 경우 그 위험성(?)을 설명해 보자.
3. 탁구대와 움직이는 공
앞서 움직이는 공은 탁구대의 벽을 감안하지 않았다. 벽을 다시 그리지 않아서 공이 지날 때 벽을 손상 시키는 모습을 볼 수 있다.
공은 벽과 부딪치면 방향을 바꾸므로 움직이는 범위를 재조정 해야 한다. 공이 벽 위를 지날일이 없으므로 매번 벽을 다시 그릴 필요는 없다. 소스 파일은 03_Table_Ball.ino [링크]다.
고정된 탁구대 벽의 크기를 매크로(define macro)로 정의해 놓아 소스 코드의 가독성(readability)과 재사용성(re-usablity)을 높인다.
4. 탁구채
탁구채(paddle)까지 넣어 게임기를 완성해보자. 소스 파일은 04_Table_Ball_Paddle.ino [링크]다. 탁구채는 가로축은 고정된채 버튼의 눌림에 따라 상하로 움직인다. 탁구채가 화면의 밖으로 벗어나지 않도록 세심하계 계산 되었다.
이어 공의 움직임을 묘사한다. 공이 벽에 부딪치거나 탁구채에 맞았을 때 방향을 바꾼다.
게임의 흥미를 돗우기 위해 점수를 메겨본다. 탁구채가 공을 맞추지 못하면 게임이 끝나고 점수를 보여준다.
움직이는 탁구채 그리기는 아래와 같다. 상하로 움직이므로 지우고 다시 그릴 수 있도록 하였다.
5. 과제
탁구 게임기를 "남의 칩" 마이크로 컨트롤러의 소프트웨어로 구현하였다. 아래의 내용을 토론해보자.
- 게임기의 행동을 프로그래밍 언어 C++로 기술하였다. 순차적으로 실행되는 구문만을 가지는 소프트웨어 언어와 병렬 실행이 추가된 하드웨어 언어의 차이를 토론해보자.
- 시현장치(CRT, 디스플레이 패널)를 다루는 설명에 흔히 언급되는 비월 주사(raster scan[링크])에 대하여 알아보라. 화소점을 순차적으로 제어하기 위해 VSYNC, HSYNC 신호의 역활에 대하여 토론해보자.
- 위의 탁구 게임기에서 버그(소프트웨어 오류)를 찾아 수정하라.
- "내 칩"으로 탁구게임기를 설계할 참이다. 소프트웨어로도 충분히 구현 가능함에도 불구하고 굳이 전용 칩(하드웨어)이 필요한 이유에 대하여 토론해 보라.
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에서 제공된 셀로 변경되어야 한다.