Post

Tapeout이란?

Tapeout의 개념과 그 설명

Tapeout이란?

Intro

컴퓨터구조론 수업을 들었거나 Verilog와 같은 언어로 하드웨어를 작성해본 경험이 있는 사람이라면,

“도대체 내가 짠 이 코드가 어떻게 칩이 되는지” 의문을 가져본 적이 있을 것이다.

그저 C언어로 짜던 것을 Verilog로 짰을 뿐인데 이게 어떻게 칩이란 말일까?

Verilog

물론 Verilog를 제대로 공부한 사람이라면, 우리가 Verilog에서는 변수 대신 레지스터 혹은 와이어로 선언한다는 점에서 이게 어떻게 칩이 될지 어느 정도 머리에 그려졌을지도 모르겠다.

CPU를 포함한 모든 칩은, 디지털논리 시간에 배운 적이 있는 바로 그 and, or 등의 gate와 flip-flop으로 구성된다. 여기서 gate는 and, nand, or 등등의 논리 게이트를 말한다. 전공생이라면 아마 수업 시간에 직접 gate와 flip-flop을 이용해서 덧셈기를 비롯한 무언가를 설계해본 경험이 있을 것이다.

여기서 조금만 생각을 확장시켜 본다면, 그렇게 작은 계산을 오직 gate들과 flip-flop들만으로 설계할 수 있다면, 근본적으로 당신이 지금 사용하고 있는 CPU도 그런 방식으로 설계할 수 있다.

엥? 그거랑 그거랑 다르지 않냐고? 아니다. 그냥 무엇을 구현했는지가 다를 뿐이다. 이론상 지금 당장 당신은 펜과 종이만으로도 gate와 flip-flop들만으로 당신이 지금 쓰고있는 그 CPU도 직접 설계할 수 있다. 이론상, 그렇다.

자, 이번에는 반대로 접근해보자. Verilog로 덧셈기나 카운터를 만들 수 있을까? 정답은 당연히 yes이다!

1
2
3
4
5
always @(posedge clk) begin
	// ...
	cnt <= cnt + 1;
	// ...
end

자 어떤가? 방금 덧셈기와 카운터를 완성했다.

…그렇다. 이게 끝이다.

그리고 이게 바로 우리가 펜과 종이를 들고 gate들을 직접 그리며 덧셈기와 카운터를 만드는 대신 컴퓨터를 켜고 Verilog로 코딩하는 이유가 될 것이다.

Synthesis

Verilog의 힘은 여기서 나온다. 우리가 Verilog를 쓰는 첫 번째 이유는 단순하다. 바로 ‘합성 가능하기’ 때문이다. 물론 모든 Verilog 코드가 합성 가능하지는 않지만, 근본적으로는 그렇다는 말이다. 합성 가능하다라는 말은 곧, +를 adder로, 그리고 결국 cnt <= cnt + 1을 카운터로 만들어준다는 것이다. 하지만 어떻게?

이번에는 다른 얘기를 좀 해보겠다. 당신이 소프트웨어 코드를 작성했다고 해보자. 우리는 그 코드가 컴파일 명령어를 통해 최종적으로 0과 1로 이루어진 기계어로 번역된다는 걸 안다. 하지만 어떻게? 눈치챘겠지만 이 둘의 답은 같다. 바로 툴을 이용해서이다.

소프트웨어는 컴파일러라는 툴을 이용한다면, 하드웨어는 Synthesis Tool (합성 툴) 을 이용한다. 컴파일러에 C언어에도 Clang과 GCC처럼 하는 일은 같지만 종류가 다를 수 있듯, EDA Tool에도 여러 가지 종류가 있다. EDA Tool을 제공하는 Vender마다 툴에 따라 쓰는 법도 문법도 방식도 다르다. 하지만 결국 모두 합성을 하는 툴이기 때문에, 공유하는 기본적인 개념들은 있으므로 너무 겁먹을 필요는 없다.

이렇게 툴을 이용해서 Verilog로 만든 아키텍쳐를 성공적으로 gate와 flip-flop들로 만들었다고 해보자. 우리는 이 결과물을 gate-level netlist라고 부른다.

이 gate-level netlist는 어셈블리어 파일과 비슷하다고 생각하면 된다. 어셈블리어와 마찬가지로, gate-level netlist는 그저 우리가 쓴 high level 상의 코드들을 gate와 flip-flop으로 쪼개놓은 또 하나의 Verilog 코드이다.

다시 말해서, 만약 우리가 수기로 gate-level netlist를 짠다면 당연히 짤 수 있고, 합성 툴의 도움도 필요 없을 것이다. 우리가 어셈블리어로 바로 코딩할 수 있듯이. 하지만 아무도 그렇게 안 한다

PnR

그렇다면 이걸로 뭘 해야할까? 몰랐을지도 모르겠지만, C언어를 ‘컴파일’할 때도, 컴파일만 하면 어셈블리어만 나온다. 이 어셈블리어를 어셈블러를 통해서 0과 1로 이루어진 기계어 파일인 오브젝트 파일로 만드는 것이다. 하드웨어도 마찬가지이다. Place & Route Tool을 이용해서, 실제 공정사에 보낼 수 있는 최종 설계도인 GDSII를 만들 수 있다.

Tapeout 관점에서 보자면, 합성 툴은 gate-level netlist를 만들기 위함이고, PnR (Place & Route) 툴은 직전에 만든 gate-level netlist를 보고 그 안에 있는 gate들과 flip-flop들, 그리고 사용자가 추가한 io pad나 memory cell들을 설계도면에 배치하는 툴이다. 우리가 ‘하드웨어 설계도’를 상상했을 떄 떠오르는 바로 그 그림을 만들어주는 툴인 것이다!

여기까지 했다면 Tapeout의 가장 핵심인 GDSII를 완료한 것이므로, 거의 끝냈다고 할 수 있다.

Outro

이 Tapeout과 소프트웨어 코딩 및 실행과의 가장 큰 차이점은 바로 무결성 검증에 있을 것이다.

소프트웨어의 경우, 보안적 허점 외에 조금 비효율적인 코드가 있더라도 웬만하면 아무튼 돌아가기만 하면 된다! 그래서 그 과정이 비교적 간단하고 쉽다. 좋은 코드를 쓴다면 좋겠지만, 나쁜 코드도 돌아가므로 초심자가 입문하기 쉬우며, 특히 요즘의 대AI시대에 딱 맞게 AI에게 ‘이런 앱을 만들어줘’하면 뚝딱 해치울 수도 있는 그런 일인 것이다.

그러나 하드웨어는 다르다. 물리적으로 구현해야 하기에 제약 조건도 많고(심지어 본인이 선택한 공정에도 dependency가 있다), 실제로 찍어내고 나면 바꿀 수 없기에 좀 더 빡센 검증이 필요한 것이다. 그래서 하드웨어의 Tapeout과정은 아키텍쳐 설계와 별개로 다뤄진다. 소프트웨어가 코딩만 하면 알아서 툴이 짠! 결과물을 내주는 것과 다르게, 하드웨어 엔지니어들은 그 툴과 1:1로 앉아 많은 소통을 해야할 것이다.

이 글을 읽고 있는 입문자가 있다면, 건투를 빈다. 우리 포기하지 말자!

This post is licensed under CC BY 4.0 by the author.