High-Level Synthesis (HLS)
High-Level Synthesis (HLS)란?
C++(C/C++/SystemC)로 작성한 코드를 RTL 코드(Verilog 또는 VHDL)로 변환하는 것이 High-Level Synthesis입니다.
HLS 툴은 개발자가 작성한 C++ 코드를 RTL 코드로 바꿔줍니다. 사람이 직접 RTL 코드를 작성하지 않고요. 이러한 개발 방식이 HLS입니다. 이렇게 나온 RTL 코드를 사용하면 됩니다.
한 가지 강조하고 싶은 점은, HLS 역시 하드웨어 디자인입니다. HLS는 하드웨어 엔지니어를 위한 도구입니다. 소프트웨어 엔지니어가 작성한 일반적인 소프트웨어 코드는 RTL 코드로 변환되지 않습니다. 하드웨어가 동작하는 방식대로 C++ 코드를 작성해야지만 올바른 RTL 코드를 얻을 수 있습니다. HLS의 결과물은 RTL 코드이기 때문에, 어떤 하드웨어를 설계할지 명확히 알고 있어야지만 바람직한 결과물을 얻을 수 있습니다.
왜 HLS를 사용하는 걸까요?
더 복잡한 반도체를 더 빠르게 설계하기 위해서 HLS를 사용합니다.
비유하자면, RTL 설계는 어셈블리 프로그래밍, HLS 설계는 C++ 프로그래밍입니다. 프로그램의 퍼포먼스나 효율성을 따지자면 당연히 어셈블리로 프로그래밍 하는 게 낫습니다. 실제로 지금도 퍼포먼스가 중요한 프로그램의 일부 코드는 어셈블리로 작성됩니다. 더 높은 퍼포먼스와 효율성을 보여주기 때문이죠. 그러나 대부분의 프로그램은 C/C++, 더 나아가 Java, Python과 같은 상위 수준의 언어를 사용합니다. 왜 그럴까요? 생산성 때문이죠. 어셈블리로 코딩하는 것보다 상위 수준의 언어를 사용해 개발하는 것이 더 복잡한 프로그램을 더 빨리 만들 수 있습니다.
하드웨어 개발 역시 마찬가지입니다. 반도체는 처음부터 RTL 수준에서 설계하지 않았습니다. 맨 처음에는 직접 회로를 그렸었고, 그다음 Gate Level 설계, 그리고 지금의 RTL(Register Transfer Level) 설계 방식이 나왔습니다. 집적도가 향상되고 더 복잡한 회로를 설계해야 함에 따라 그에 맞는 개발 방식들이 사용된 겁니다. 그리고 더욱더 복잡하고 다양한 반도체를 설계해야 하는 지금의 환경에서 나오게 된 개발 방식이 HLS입니다.
Verilog도 맨 처음에는 회로를 설계하는 목적이 아닌 회로의 동작을 설명하고 시뮬레이션을 위한 도구로서 사용됐습니다 (Verilog는 verification과 logic이 합쳐진 단어입니다). 나중에 Synopsys에서 Design Compiler라는 툴을 출시하여 Verilog 코드를 실제 회로로 합성할 수 있게 되면서 회로 설계를 목적으로 사용되기 시작했습니다. HLS도 지금 유사한 과정에 있다고 보입니다.
1000만 게이트 크기의 반도체를 설계하기 위해서는 대략 50만 줄의 RTL 코드를 작성해야 합니다. 그리고 반도체의 집적도는 계속해서 증가하고 있으며, 이에 필요한 RTL 코드도 계속 늘어나고 있습니다. 그러나 HLS를 사용한다면 코드의 길이를 1/10 정도로 줄일 수 있습니다. 이를 통해 개발 시간의 단축은 물론 디버깅, 유지 보수 측면에서도 큰 비용을 아낄 수 있습니다.
또한 최적화 측면에서도 장점이 있습니다.
- 예를 들어 신호가 긴 wire를 따라 이동해야 하는 경우, 몇 사이클에 걸쳐 이동하게 설계해야 할까요? 또는 FSM의 stage는 몇 단계로 나누어야 할까요? 사람이 한다면 그간의 경험을 토대로 몇 사이클 정도 걸리겠다고 예상하고 코딩합니다. 그 후 만약 타이밍이 예상과 다르다면 디버깅하면서 조정합니다. 또한 나중에 동작 주파수가 변할 경우 이에 맞춰 다시 코드를 수정해야 합니다. 하지만 HLS를 사용한다면 툴이 동작 주파수를 감안하여 최적의 스케줄링을 진행합니다.
- 설계를 할 때, 다양한 옵션들 중 하나를 선택해야 할 경우가 있습니다. 예를 들어, 여러 로직이 하나의 adder를 multiplexer를 통해 공유해서 사용할 수도 있고, 아니면 그냥 각자 하나의 adder를 사용할 수도 있습니다. 이 경우, adder의 area가 클까요 아니면 multiplexer의 area가 더 클까요? 정답은 “플랫폼에 따라 다르다”입니다. FPGA 인지 ASIC 인지, ASIC이라면 어느 파운드리 회사의 몇 나노 공정을 사용하는지에 따라 다른 디자인을 적용해야 합니다. 하지만 HLS를 통해 behavior level에서 설계를 한다면, 이러한 부분들을 툴이 알아서 최적화해 줄 수 있습니다.
물론, 충분한 경력을 가지고 있는 하드웨어 엔지니어는 HLS 툴 필요 없이 모든 최적화를 RTL 수준에서 진행할 수 있습니다. 다만 50만 줄, 100만 줄 정도의 RTL 코드를 다룰 만한 충분한 인력들과 시간이 필요하겠죠.
장단점
프로세서가 할 수 있는 것들을 가속화하기 위한 하드웨어를 설계하는 경우, HLS로 설계하는 게 여러 면에서 유리할 수 있습니다. 반면 clock cycle마다의 컨트롤이 매우 중요한 하드웨어의 경우 HLS보다는 RTL 설계가 더 적절할 수도 있습니다.
사용 사례
비디오/이미지 처리, 자율주행, 5G/통신과 같은 분야에서 사용됩니다. 실제로 구글이나 엔비디아는 HLS를 사용해서 반도체를 설계하고 있습니다.
Conclusion
HLS의 미래가 밝은 이유는, 반도체 설계에 대한 수요가 컴퓨팅 가속화에 많기 때문입니다. AWS, Meta, Google 등 빅테크 기업들이 반도체 설계를 시작하는 이유 역시 높은 컴퓨팅 리소스가 필요한 애플리케이션을 가속화하는 전용 반도체를 설계하여 컴퓨팅 비용을 낮추겠다는 목적이죠. 또한 SoC 역시 마찬가지입니다. 프로세서가 할 수 있는 일들을 가속화하는 전용 반도체 IP를 설계하고, 이것들을 하나의 칩으로 만들어 효율적인 저전력 칩을 만드는 게 큰 추세이고요. 이러한 관점에서 봤을 때 앞으로 HLS 설계의 필요성은 더 높아질 것이라고 생각됩니다.
Leave a comment