C계열 언어로 하드웨어 합성의 두 큰 난관
다양한 C 계열 언어를 이용한 디지털 하드웨어 합성 기법이 제안되어 왔지만, 레지스터‑전달‑레벨 설계에 있어 Verilog나 VHDL만큼 성공을 거둔 사례는 아직 없다. 본 논문에서는 그 근본적인 두 가지 과제, 즉 동시성 모델링과 타이밍 제어에 초점을 맞추어 분석한다.
초록
다양한 C 계열 언어를 이용한 디지털 하드웨어 합성 기법이 제안되어 왔지만, 레지스터‑전달‑레벨 설계에 있어 Verilog나 VHDL만큼 성공을 거둔 사례는 아직 없다. 본 논문에서는 그 근본적인 두 가지 과제, 즉 동시성 모델링과 타이밍 제어에 초점을 맞추어 분석한다.
상세 요약
C‑like 언어는 전통적으로 순차적인 명령 흐름을 전제로 설계되었다. 프로세서 수준의 소프트웨어 개발에서는 하나의 제어 흐름이 순차적으로 실행되는 것이 자연스러우며, 병렬성을 표현하기 위해서는 스레드나 라이브러리 수준의 API를 별도로 호출해야 한다. 반면 하드웨어 설계에서는 수많은 레지스터와 연산 유닛이 클럭 사이클 단위로 동시에 동작한다는 전제가 기본이다. 이러한 근본적인 모델 차이가 C‑like 언어를 RTL 수준으로 직접 매핑하는 데 큰 장애물로 작용한다.
첫 번째 난관인 동시성은 두 가지 측면에서 문제를 만든다. 하나는 언어 자체가 병렬 실행을 명시적으로 표현할 구문을 제공하지 않는다는 점이다. 개발자는 for‑loop, if‑else 등 순차적 제어 구조만을 사용하게 되며, 합성 도구는 이를 정적 분석을 통해 가능한 한 많은 연산을 같은 클럭에 배치하려 시도한다. 그러나 정밀한 의존 관계 분석이 어려워 과도한 파이프라인 삽입이나 불필요한 레지스터 삽입이 발생한다. 두 번째는 타이밍 제어이다. HDL에서는 always @(posedge clk)와 같은 구문으로 클럭 엣지를 명시하고, 신호 간의 지연을 직접 지정할 수 있다. 반면 C‑like 언어는 연산 순서만을 정의하고, 클럭 사이클이나 전파 지연을 암시적으로 추정한다. 합성 도구는 연산 복잡도와 자원 사용량을 기반으로 클럭 주기를 추정하지만, 설계자가 의도한 정확한 타이밍을 보장하기는 어렵다. 결과적으로 타이밍 검증 단계에서 클럭 위반이나 메타스테이빌리티 문제가 빈번히 발생한다.
또한, 자원 공유와 스케줄링 문제도 동시성·타이밍과 얽혀 있다. C‑like 코드에서는 같은 변수에 대한 여러 쓰기/읽기가 순차적으로 일어나지만, 하드웨어에서는 같은 연산 유닛을 여러 연산이 공유할 경우 스케줄링 충돌이 발생한다. 합성 도구는 이러한 충돌을 해결하기 위해 파이프라인을 늘리거나 복제 회로를 삽입하는데, 이는 면적과 전력 소모를 급격히 증가시킨다. 설계자는 이러한 자동 최적화가 의도와 다를 경우, 코드 레벨에서 인위적인 파이프라인 스테이지를 삽입하거나 pragma‑like 지시자를 사용해야 하는데, 이는 C 언어의 단순함을 훼손한다.
마지막으로, 검증 및 디버깅 측면에서도 차이가 크다. HDL은 시뮬레이션 파형을 통해 신호 레벨에서 직접 검증이 가능하지만, C‑like 합성 결과물은 고수준 변수와 레지스터 매핑 사이의 관계가 불명확해 디버깅이 어려워진다. 이러한 복합적인 이유들 때문에 현재까지 C‑like 언어 기반 합성은 특정 도메인(예: DSP 코어, 고수준 프로토타이핑)에서 제한적으로 활용될 뿐, 범용 RTL 설계 도구로 자리매김하지 못하고 있다.
📜 논문 원문 (영문)
🚀 1TB 저장소에서 고화질 레이아웃을 불러오는 중입니다...