추상적입니다
대략 아래와 같은 그림처럼 나뉘어져 있고, 각 단계별로 implementation 즉, 구현한다 라고 설명할 수 있다.
스펙을 잡는 과정은 항상 괴롭지만, 가장 오래 걸리는 작업이다. (항상 이론과 현실은 다르지만..) 고객과의 의사소통도 매우 중요하다.
위 그림에서는 system level이 조금 다른 의미로 사용된 것이라고 생각하면 되고, 실제로 스펙을 잡는 것이야말로 시스템 전체를 구현하는 일이라고 봐도 된다.
예를 들자면, 휴대폰 전체에 들어갈 IP들을 선정하고 (어느 회사 제품은 스펙이 어떻고 또 가격은 어떻고 등등) 각 IP의 성능에 맞게 어떤 프로토콜을 이용해서 통신할 것인지, 어떤 CPU를 사용할지, IP들의 입출력 등 핀들은 어떻게 구성되어 있는지, 그 모든 것을 꾸미는 일이 시스템 설계에 해당한다고 보면 된다. 최신 스펙은 아니더라도 혹시 관련 업무를 해보고 싶다면, 얼마든지 스펙북들은 찾아서 볼 수 있고, 공부할 수 있다.
알고리즘 레벨은 말 그대로 알고리즘으로 회로의 기능을 구현하는 작업이다. 덧셈기 하나를 만들고자 한다면, c = a + b 이런 코드 한 줄로 구현해보는 것이라고 보면 이해하기 쉬울 것 같다.
시스템 레벨은 본격적인 하드웨어 개발이 시작되는 시작점이다. 스펙을 결정하는 것과 유사하게 어느 부분을 HW로 구현할지 혹은 SW(FW)로 구현할지 다시 구분해야 하며, SW 개발자들이 활용할 수 있도록 HW 모델을 만들어서 제공해야 한다.
이 레벨에서는 CPU를 몇개나 사용할 것인지, SRAM의 크기 등 시스템의 전체 스루풋(throughput)을 최적화하고 결정하는 단계가 된다. 성능이 중요하지만 항상 비용이 그만큼 적게 드는 것도 고려 대상임을 잊으면 안된다.
시스템 레벨 구현을 위해서는 System C, System Verilog 등의 언어가 사용된다. HLS (High-Level Synthesis)로 RTL을 구현할 수 있다. HLS도 많은 발전을 거듭해서 실 제품에 사용되는 사례들이 많아지는 추세다. 10년 정도 되었으니 무르익어가는 기술이라고 보면 될 것 같다.
RTL(Resistor Transfer Level)은 아주 고전적이고 오래된 역사를 지닌 레벨이다. 회로 설계에 가장 중요하다고 볼 수 있는 레지스터, 즉, 데이터의 흐름을 중심으로 개발하는 방법이다. 레지스터가 무엇인가? 레지스터는 하나의 CPU(RISC 머신이라면 무엇이든지)에서 처리할 수 있는 정보의 단위이다. 32-bit, 64-bit 등이 이 레지스터의 크기라고 보면 될 것 같다.
주로 Verilog로 개발된다. Verilog는 70년대 초, 상용 합성 툴이 나오기 시작했을 때, 급속한 발전을 이루었고 아직까지도 많이 사용되고 있는 언어이다.
이 RTL 회로가 Design Compiler와 같은 합성 툴을 거쳐서 나오면 Gate-level이 된다. Gate-level은 이미 만들어져 있는 library set에서 필요한 primitive gate들을 골라서 combinational logic이 구성되어 있는 상태라고 보면된다. RTL에서 넘어온 레지스터 영역은 그대로 library에서 DFF과 같은 gate를 가져다가 사용하게 된다.
그렇다면, 합성툴이 만들어지기 전, 컴퓨팅 파워가 매우 부족하던 시절에는 어떻게 회로 설계를 했을까? 먼저는 모양자가 필요했고, 연필과 지우개로 모눈 종이에 그림을 그렸다. 각자 맡은 부분을 그리고나서 종이를 합쳐 보았다. 사무실에 컴퓨터가 하나도 없던 시절이었고, 우리 나라에서도 각자 컴퓨터 잡고 일하게 된 것은 90년대 후반정도이다. (Windows95, 98의 등장이 큰 역할을 했다.)
그리고 앞서 말한 primitive gate 들은 각자 가치를 가지고 있었기 때문에 빵판에 꽂아서 사용할 수 있도록 판매도 되었다. 사설이지만, 이렇게 휴대폰을 들고다니고 인터넷이 폭발적으로 발전하게 된 것은 20년 남짓이란 얘기다.
이런 고전적인 게이트 레벨이 왜 존재하는 건지는 알아야 할 것이 아닌가!
이 레벨부터는 타이밍에 대해 검증할 수 있게 된다.
할 얘기가 길어져서 다음에 이어서 이야기를 해보려고 한다.