반도체 설계 언어
'반도체 설계 언어'라는 말속에 어떤의미를 담고 있는지 생각해 보자. 단 세개의 단어를 조합한 이 말에 현대 디지털 혁명을 일으킨 원동력을 모두 담고 있다.
"반도체"는 특이한 성질을 가진 물질을 이르는 말인데 이를 이용하여 만든 전자부품을 통상적으로 칭하게 되었다. 디지털 전자회로를 꾸밀때 사용된 트랜지스터라는 부품이 '반도체'라고 부르는 물질로 만들어 졌기 때문이다. 엄밀히 말하자면 "트랜지스터로 꾸민 전자회로"라고 해야 옳을 것이다.
"설계"를 백과사전에서 찾아보면 "목적물을 만들거나 변경, 해체하는 일에 대한 계획을 세우는 일을 통틀어서 설계라고 부른다." [바로가기] 라고 정의한다. 설계는 도면으로 그릴 수도 있고 말로 표현 할 수도 있다. 계획을 듣는 대상이 누군가에 따라 설계의 표현 방법과 구체성이 달라진다. 척하면 알아듣길 바란다면 상대가 나와 비슷한 수준의 지능을 가졌을 뿐만 아니라 구체적 실행능력 도한 갖췄어야 한다.
마지막에 붙은 "언어"에는 정말 많은 의미를 담고 있다. 반도체 부품을 만들기 위한 계획서를 작성하는데 언어를 사용한다는 뜻이다. 전자회로를 만들 목적으로 그린 도면을 '회로도'라고 흔히 부른다. 그런데 그림 대신 언어를 쓰겠다는 뜻이다. 계통을 그림으로 그린 계통도를 보면 전체를 일목요연하게 파악하기 좋다. 사람끼리 자신의 계획을 설명 할 용도로 적절할 수 있다. 설명의 용도가 아닌 만들 목적이라면 계통도가 아닌 '설계도'를 그려야 한다. 제작을 수행할 작업수순이 아주 세밀하게 묘사되어야 한다. 작업을 수행할 주체가 사람이 아니라 기계라면 기계가 알아들을 수 있어야 하지 않을까?
사람의 생각을 문서로 표현해 놓으면 컴파일러라는 자동화 도구가 기계의 언어로 바꿔준다. 문서를 작성하는 문법이 단순명료해야 함은 물론이다. 요즘은 계통도로도 전자회로 설계를 하는 방법이 꾸준히 발표되고 있지만 유연성이 떨어진다. 만들고자하는 내용을 기계에게 설명 하려면 매우 구체적이어야 한다. 그 계획을 설명할 문서에 사용된 언어는 제한된 단어를 채용한 문법체계를 갖는다. 인간이 쓰고 자동화 도구가 읽는다. 컴파일러는 소프트웨어를 만들어주는 소프트웨어다.
전자 설계 자동화 EDA(Electronic Design Automation) 도구는 만들고자 하는 전자회로를 표현해 놓은 문서를 읽어서 반도체 제작도면을 대신 그려준다. 마치 프로그래밍 언어로 알고리즘을 기술하면 컴파일러가 기계언어로 변환해 주는 것과 같다. 다만 기계어가 아닌 반도체 제조용 도면이다. 반도체 부품 제조 역시 알고리즘을 기술한 문서에서 반도체 도면까지 이르는 과정이 자동화 되어 있다. 자동화 하려면 다뤄야 할 객체의 표현에 애매함이 없어야 한다. 제아무리 인공지능이라 하더라도 최고의 추상화 수준을 갖는 사람의 사고체계를 기계(또는 반도체 부품)로 구현하기까지 완전히 자동화 되지 못한다. 따라서 반도체 부품 제조의 전과정이 자동화 되지 못한다. 알고리즘으로 정립하고 이를 기계가 알아들을 수 있는 언어로 표현된 이후 비로서 디지털 반도체 부품설계의 자동화가 가능하다. "반도체 설계 언어"라는 말을 좀더 구체적으로 표현하면, "디지털 반도체 부품 제조용 계획서를 작성하기 위한 전자회로 도면 작성 자동화용 문법체계"라고 할 수 있다.
하드웨어 기술용 언어
소프트웨어를 제작용 프로그래밍 언어[Programing Language]는 인간이 작성하고 보기 좋게 만들어졌다. 모든 구문은 순차실행이다. 모든 변수는 저장장치를 의미했다. 하지만 하드웨어를 표현하려면 객체는 전선과 저장소를 구분 해야 했고 구문은 순차실행과 병렬실행으로 나눠야 했다. 디지털 회로에 조합회로와 순차회로가 다르다. 이에 더하여 사건(클럭의 엣지)을 표현하고 이에 반응하는 동작을 기술 할 수 있어야 했다. 다행히 운영체제를 바탕으로 응용 프로그램 생산기술이 눈부신 발달을 이룬 덕에 사건 구동 프로그래밍과 병렬실행을 모사한 소프트웨어 제작 기법이 표준화 됐다. 이 기법들은 모두 하드웨어 언어에 녹아들었다. 하드웨어 기술 언어로 묘사된 설계를 실제 하드웨어가 제작되기 전에 모의 실행 해볼 수있는 시뮬레이터와 함께 컴파일러에 해당하는 합성기라는 자동화 도구들이 등장하여 반도체 설계를 주도하게 됐다. 물론 도면을 자동 생성하는 도구들도 함께했다. 사실 반도체 도면 그리기나 프린트 기판 그리기나 별반 다르지 않으니 말이다.
단일 반도체 칩에 더많은 회로를 넣으려는 욕구가 폭발하자 하드웨어 기술 언어에 대한 불만이 터져 나왔다. 수학과 물리학을 배경으로 개발된 각종 알고리즘들이 이미 C/C++ 위시한 다양한 컴퓨터 언어로 작성되고 응용되고 있었다. 보다 정교한 알고리즘을 실시간으로 처리하려고 컴퓨터의 CPU의 동작 속도를 향상해 왔으나 한계가 있었고 계산만 해주는 전용 하드웨어를 필요로 했다. 컴퓨터에서 작동하던 알고리즘을 하드웨어로 만들려면 전용 언어로 변환 해야 했지만 소프트웨어 언어와 너무나 달라서 차라리 다시 작성하는 편이 낳았다. 그간 쌓아놓은 소프트웨어 자원들은 쓸모가 없어질 판이다. 하드웨어 언어로 변환 하는 도구를 만들기 보다 소프트웨어 언어를 하드웨어 설계용으로 쓰면 어떨까?
설계 언어와 검증 언어
1980년대 중반 하드웨어 기술 언어가 표준화 되자마자 반도체 설계 방법론을 평정 했다. 인간의 언어에 가까운 높은 추상화 수준에서 전자회로를 설계할 수 있게되자 설계 범위가 급격히 확대됐다. 단입 칩상에 올려놓은 회로의 규모가 커진 만큼 오류의 위험 또한 증가한다. 고집적 반도체는 제조기간이 길고 수리는 불가능하다. 제조된 반도체 부품에 오류가 발견 되었을 때 이를 바로잡을 방법은 없다. 규모가 커질 수록 위험은 커진다. 이런 위험에 대처 할 방안은 인간의 실수가 끼어들 요소를 최소화 하고 끊임없는 검증 뿐이다. 반도체 제조도면 생산의 자동화는 눈부시게 발달 하였지만 목표하던 동작과 일치하게 될지 보장할 검증은 쉽지 않다. 수학과 물리학 법칙으로 증명된 원리가 알고리즘으로 디지털 화 하면서 일으킬 계산 오류를 찾아내야 한다. 여러 알고리즘이 복합적으로 집약될 경우 오류를 일으킨 원인을 찾기란 쉽지 않다. 정해진 수순에 따라 계산을 수행 하면서 발생하는 오류 찾기는 실세상에서 작동될 때 예기치 못할 오류에 비하면 아무것도 아니다. 컴퓨터 알고리즘은 입력에 범위와 조건을 두지만 실세상에서 그런 제한은 없다.
실물이 만들어지기 전의 검증은 시뮬레이션이라고 하는 모의 실험을 통해 이뤄진다. 모의 실험을 하려면 해당 부품이 사용될 환경('시스템'이라고 하자)을 모형화 해야한다. 다행히 소프트웨어 제작기술이 발달하여 실제에 근접한 환경을 구축하는데 한계가 없는 듯 보인다('게임'을 보라!). 하드웨어 언어로 기술한 설계물을 실세계의 모형에서 작동 시켜볼 수 있을 것이라는 기대는 당연하다. 언어 자체의 문법과 고유어는 소프트웨어 언어든 또는 하드웨어 언어든 모든 컴퓨터 언어는 대동소이하다. 하지만 구문이 담고있는 의미(추상성)는 천지차이다. 그에 덧붙여 각종 부속 함수들과 그보다 높은 수준의 운용체제 관련 응용 프로그래밍 인터페이스(API, Application Programing Interface)에 이르면 그 차이는 더욱 넓어진다.
하드웨어 기술 언어(HDL)는 설계를 목적으로 만들어졌다. 합성을 통한 디지털 전자회로로 바꿀 용도에 특화된 언어다. 하드웨어 언어로 작성된 설계물을 검증하기 위해 지향하는 추상화 방향이 정 반대인 소프트웨어 언어로 작성된 모형으로 끌어들이기 위한 노력이 지속적으로 연구되어왔다. 그 결과로 시스템 모형화 도구 SystemC 가 발표되었다. SystemC는 언어가 아니다. 하드웨어를 모형화 하기 위한 C++의 크래스 라이브러리 모음이다. 이에 더하여 사건 기반의 병렬 시뮬레이션 엔진을 제공한다. 오늘날의 모든 컴퓨팅 환경이 C/C++ 언어에 기초하는 만큼 SystemC의 등장은 하드웨어 언어로 작성된 설계물의 검증에 '추상성'이라는 장벽이 무너졌다고 할 만 하다. 하드웨어 기술 언어 스스로 검증을 위해 높은 추상화 수준의 환경 묘사 방안을 갖추도록 발전(SystemVerilog)해 왔으나 한계는 분명 하다. 하드웨어 설계자에게 C++ 언어가 난해 할 수 있다. 하지만 HDL의 최신 기법을 익히느니 C++ 프로그래밍 언어를 이해하는 편이 훨씬 높은 학습효율을 거둘 수 있다.
고위 합성(High-Level Synthesis)
인간의 사고를 체계적으로 정리한 알고리즘을 기계에서 빠르게 실행 시키는 방법으로 컴퓨터 프로그래밍이 활용되었다. 컴퓨팅 기술은 더 빠른 실행 속도를 추구하며 다양한 방향(특히 병렬 컴퓨팅, Parallel Computing; Vector Processor)으로 발전되어왔다. 급기야 범용 컴퓨터의 한계(성능 대비 전력소모)를 깨닳자 특수 목적 컴퓨팅을 지향하게 되었다. 대부분 C/C++ 언어를 기반으로 축적된 다양한 알고리즘들을 전용 구조의 하드웨어에서 낮은 클럭율로 실행 시킬 수 있다. 재구성 가능 FPGA를 동원하면 특수목적 반도체 부품을 제작하지 않고도 고성능 컴퓨팅이 가능하다. 축적된 C/C++ 언어 자원들을 FPGA로 구현하기 위해 하드웨어 언어로 변환 되어야 한다. 고위합성(HLS, High-Level Synthesis)높은 추상화 수준의 C/C++ 언어에서 그보다 낮은 합성 가능한 하드웨어 언어로 변환 하는 기술이다. 지난 세기말 수많은 연구와 개발이 이어졌고 급기야 활용 가능한 수준의 도구가 상용화되기에 이르럿다. 이제 반도체 설계는 하드웨어 전용의 언어 뿐만 아니라 알고리즘 기술 언어로 확장 되었다.
----------------------------
참고
[1] Hardware Description Language, https://en.wikipedia.org/wiki/Hardware_description_language
[2] Programing Language, https://en.wikipedia.org/wiki/Programming_language
[1] Parkin, Writing Successful RTL Descriptions in Verilog, https://course.ece.cmu.edu/~ece447/s15/lib/exe/fetch.php?media=goodrtl-parkin.pdf
[2] Comprehensive SystemVerilog-SystemC-VHDL Mixed Language Design Methodology, comprehensive-systemverilog-systemc-vhdl-mixed-language-design-methodology.pdf
[3] Verilog Quick Reference, https://web.stanford.edu/class/ee183/handouts_win2003/VerilogQuickRef.pdf
[4] Synthesizing SystemVerilog Busting the Myth that SystemVerilog is only for Verification, https://sutherland-hdl.com/papers/2013-SNUG-SV_Synthesizable-SystemVerilog_paper.pdf
[5] SystemC Quick Reference card, http://www.eis.cs.tu-bs.de/klingauf/systemc/systemc_quickreference.pdf
[6] Comparison of VHDL, Verilog and SystemVerilog, https://doc.inmys.ru/open?path=_books%5Chdl%5CComparison%20of%20VHDL%20Verilog%20and%20SystemVerilog-201471223958883.pdf
[7] The rise of FPGA technology in High-Performance Computing, https://www.design-reuse.com/articles/54573/fpga-high-performance-computing.html
[8] FINN: A Framework for Fast, Scalable Binarized Neural Network Inference, https://arxiv.org/abs/1612.07119
[9] Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1, https://arxiv.org/abs/1602.02830
[10] 반도체 설계자, C++ 얼마나 알아야 하나? (2023-07-12), https://fun-teaching-goodkook.blogspot.com/2023/07/c-2023-07-12.html
[11] 반도체 설계자가 알아야 할 컴퓨팅 언어 (2023-07-05), https://fun-teaching-goodkook.blogspot.com/2023/07/2023-07-05.html
[12] SystemC기초: 디지털 반도체 설계자가 알아야할 C++ 언어, https://fun-teaching-goodkook.blogspot.com/2023/06/systemc-c.html
[13] Technical Documents, https://course.ece.cmu.edu/~ece447/s15/doku.php?id=techdocs
댓글 없음:
댓글 쓰기