2장. 추가: SystemC Co-Simulation Testbench
SystemC를 자세히 논하진 않겠다. 다만 IEEE1666-2011 표준으로 등재된 시스템 반도체 설계 언어다. 사실 새로운 언어는 아니고 C++ 를 하드웨어 설계및 검증용 라이브러리를 확장 한 것이다. 하드웨어 언어의 클럭(clock), 채널(channel)의 개념과 병렬 시뮬레이션 커널을 포함한다. 개발 툴은 표준 C++ 컴파일러(GCC, MS Visual Studio C++)면 충분하다. 기존의 HDL을 이해 한다면 접근하기 어렵지 않을 것이다. 혼합 언어를 지원하는 HDL 시뮬레이터라면 별도의 인터페이스(PLI/VPI, FLI, VHPI, DPI 등등) 절차 없이 HDL과 통합 실행 시킬 수있다. SystemC의 모듈이 Verilog, SystemVerilog의 module 이나 VHDL 의 entity-architecture 와 동등하게 취급된다. 일예로 ModelSim은 HDL 모듈을 SystemC로 불러올 수 있고 그 반대도 가능하다. (단, 서브모듈 추적에는 제약이 있음)
-----------------------------------------------------------------------
[참고서]
[1] System Design using SystemC [link]/번역서 'SystemC를 이용한 시스템 설계'[link]
2002년 SystemC 버젼 1.1이 나왔던 초창기에 쓰여진 책이다. 너무 오래되서 현재 버전과 다른 점이 많지만 SystemC의 기본개념을 잘 설명하고 있다.
[2] SystemC: From the Ground-Up, 2nd [link]/번역서 '원리부터 배우는 SystemC'[link]
SystemC 버젼 2.1 을 기준으로 쓰여졌다. TLM 을 포함한다. 2010년에 2판이 나왔고 번역서는 1판으로 쓰였다.
인터넷에 SystemC로 검색하면 많은 문서들이 나온다. 최신 문서를 보는 편이 좋다. 굳이 위의 책을 구입할 필요는 없다. 혹시 도서관에서 번역서가 보이면 읽어봐 주면 고맙겠다.
-----------------------------------------------------------------------
SystemC로 감싼 C 디자인과 HDL을 단일 테스트 벤치로 통합 실행하는 검증 환경을 구성하는 방법을 소개한다. 먼저 소스 코드와 컴퓨팅 환경은 다음과 같다.
- DUT의 소스는 자일링스 HLS 튜토리얼 에서 가져온 fir.c 와 RTL로 합성한 Verilog 다.
- SystemC 는 2.3 버젼을 사용한다. 소스코드는 https://accellera.org/ 에서 무료로 받을 수 있다.
- C++ 컴파일러로 마이크로소프트의 비주얼스튜디오 2019 커뮤니티 버젼이다. 조건부 무료다.
- HDL 시뮬레이터로 멘토그픽스 모델심(ModelSim) 10.1 버젼이다. 무료 아니다. 인텔 알테라 버젼을 무료로 쓸 수 있긴 하나 SystemC를 지원하지 않는다.
- 전 과정은 PC의 Windows 10 에서 실시되었다.
- 여기에 설명하는 소스 파일들은 다음 링크에서 다운 받을 수 있다. [다운로드]
1. 개요
개별적으로 실행하여 테스트 벡터 파일을 주고 받기 보다 제대로된 Co-Simulation을 해본다. 이렇게......
제대로 된 Co-Simulation 이라면 이래야 하지 않을까?
- 설계물의 C 코드에 변경 없을 것
- 한 테스트 벤치에 C, SystemC, HDL들이 실행형 바이너리로 결합될 것(Executable specification)
- 시뮬레이션 실행 중 실시간으로 입출력 검증이 이뤄질 것
이미 HDL과 C++를 동일한 환경에서 실행이 가능한 도구(C-HDL Mixed simulation)가 준비되어 있다. HDL에서 C 언어 인터페이스를 위해 Verilog의 PLI와 VPI, VHDL의 FLI와 VHPI, SystemVerilog 의 DPI 등이 표준화 되어있다. 하지만 이런 인테페이스 기준은 지나치게 복잡해서 학습 접근을 막고(반도체 하드웨어 설계자에겐 C++는 여전히 높은 벽인가?) 때로는 설계물의 C 코드를 변경을 요구하기도 한다. 게다가 HDL 전용 시뮬레이터가 아니면 실행 시킬 수 없다. 다행히 SystemC가 IEEE 1066-2011으로 표준 제정되다. SystemC는 C++를 라이브러리 수준에서 확장한 것이므로 GCC 나 비주얼 C++ 같은 표준 C++ 컴파일러 라면 실행 파일 생성이 가능하다.
2. C 디자인 검증(C Validation)
C 디자인 fir()를 SystemC 환경에서 검증한다. 먼저 표준 C 로 작성된 검증용 프로그램과 비교해 보자.
main() 함수 내에 테스트 용 입력(test input vectors)을 생성하고 DUT 인 fir()을 반복적으로 호출한다. DUT의 출력을 파일에 취합해 두었다가 테스트를 마치고 참조 벡터 파일과 비교한다. 두 파일이 일치하면 검증이 성공한 것으로 한다. 테스트 입력의 생성, 함수 호출 그리고 결과 값의 수집이 차례로 수행된다. C 설계물의 검증이라면 비록 단순하긴 해도 충분하다.
HLS에서는 C 의 함수 fir()이 RTL로 합성될 것이다. 클럭의 개념이 없는 C의 함수와 RTL을 혼합 검증 해야 한다. 이때 다음과 같은 의문이 생긴다.
- RTL로 합성된 하드웨어 모듈 fir 은 어느 순간에 작동될까?
- 언재 유효한 입력이 있다고 판단할까?
- 몇 개의 클럭 만에(letency 와 interval) 유효한 출력을 낼까?
C 프로그래밍 언어의 실행 절차는 순차적으로 고정되었다. 하지만 하드웨어를 기술한 언어 HDL을 실행시키려면 시간의 흐름을 관리하는 시뮬레이션 커널이 필요하다. 시간을 멈추고 다수의 모듈을 작동시켜서 병렬실행을 모사(simulate parallel execution)한다. 시간을 진행하며 어느 채널에 변화(사건, event)가 발생했는지 탐지하고 이에 반응하도록 연결된 모듈을 호출한다. 이렇게 실행방식이 전혀 다른 두 C와 HDL 모델을 혼합하여 검증할 수 있는 시험환경이 필요하다. SystemC 가 그것을 가능케 해준다.
SystemC로 구성한 C 함수 fir()의 시험 환경은 다음과 같다.
2-1. C 설계에 SystemC 싸개(wrapper) 씌우기 (sc_fir.h)
무시간(un-timed, 클럭 개념이 없는) C 함수 fir()을 SystemC 환경으로 끌어들이기 위해 싸개(wrapper)를 씌웠다. 시그널 채널 x_rdy의 상승 엣지(posedge) 감응된 메쏘드(C++의 멤버 함수로 콜-백 call-back 함수와 같다.) sc_fir_method() 에서 fir()이 호출된다. 외부로 부터 유효한 x 가 준비 되었다는 표시로 x_rdy 가 주어진다. x_rdy가 상승 엣지가 될 때 까지 기다렸다가 입력 x 를 읽어 함수 fir()을 호출 한다. 무시간 함수 fir()은 출력값 y 와 함께 즉시 되돌려 진다. y를 출력 하면서 외부에 y_rdy 로 준비 되었다는 표시를 해준다.
지금은 fir()이 무시간 C의 함수지만 향후 RTL로 합성되었을 경우 x_rdy 와 y_rdy 사이에 인터벌 클럭 만큼 간격이 벌어질 것이다.
2-2. 테스트 입력 벡터 생성(sc_stim.h)
테스트 데이터 x 는 외부에서 생성 요청이 있을 때(x_req.posedge()) 마다 새 값을 생성한다. 새 값이 준비되었다는 표시를 x_rdy 에 실어 외부에 알린다.
2-3. 검증용 모니터링(sc_mon.h)
DUT에서 출력을 내면 이를 감지하여(y_rdy.posedge()) 표준 벡터 파일에서 값을 읽어 비교한다. 시뮬레이션이 진행 되는 동안 실시간 비교가 이루어 진다.
2-4. 통합
위의 세가지 모듈을 한데 통합한다. HDL 에서 시그널로 각 모듈의 입출력을 바인딩 하는 것과 같다. 모듈이 아니므로 컨스트럭터에 감응과 메쏘드는 없다.
2-4. C++ main()
SystemC는 C++다. main() 이 필요하다. 그리고 위의 모듈들은 모두 헤더에 선언된 C++ Class에 불과 하다. 따라서 탑 모듈인 sc_fir_test 를 전언하고 객체를 구성해 줘야 한다. 이어서 sc_start()로 시뮬레이션 커널을 호출하여 시뮬레이션을 진행한다.
2-5. 무시간 시뮬레이션 (un-timed simulation)
SystemC는 디버깅을 위해 VCD 파형을 만들수 있다. VCD 파형을 gtkwave 유틸리티로 볼 수 있다.
3. C-RTL-SystemC Co-Simulation
HLS로 RTL을 얻었다면 이제 C-RTL-SystemC를 함께 묶어 시뮬레이션 해보자. 구성은 다음과 같다.
Verilog RTL을 SystemC 로 불러들이기 위해 싸개(wrapper)를 만든다. 크래스 속성에 sc_foreign_module로 지정된 것은 ModelSim의 규격이다. C++의 크래스에 Verilog 모듈의 이름과 입출력 포트들을 선언해 준것 뿐이다.
그외 SystemC 파일들은 C 설계 검증에서 사용했던 것과 같다. C-RTL-SC 를 모두 통합한 Co-Simulation 결과는 다음과 같다. 입력 x 의 생성과 y의 출력 사이에 RTL에서 소요된 인터벌(RTL interval)이 있다.
4. 결론
HLS 도구들이 C 를 변환하여 HDL을 생성하는 만큼 테스드 벤치도 자동 생성하는데 큰 노력을 기울이고 있다. 설계 전과정에서 검증이 차지하는 비중이 워낙 큰 만큼 테스트 벤치 자동화의 중요성에 토를 달 생각은 없다. 다만 자동 변환 과정이 너무나 복잡한데다 그로 인해 생성된 HDL 도 읽어볼 수는 있을 지언정 알아보기 어렵다. 더구나 HDL이 표준 입출력이 가능 하다고 해도 C/C++ 만큼에 비할 바가 못된다. 그리고 C/C++는 수학 함수들을 비롯해 수많은 검증 라이브러리를 갖추고 있다. 어렵게 C 테스트벤치를 HDL 로 바꿀 것이 아니라 SystemC로 검증 환경을 구현하는 편이 훨씬 생산적이라는 데 이의는 없을 것이다.
C/C++ 기반의 테스트 벤치의 또다른 장점으로 FPGA를 활용 Co-Emulation 구성도 가능하다는 점이다. FPGA 대신 비트코인 채굴에 쓰인다는 GPU, 컴퓨팅 가속기(Accelerator HW), 네트워크에 연결된 다른 컴퓨터(심지어 클라우드 컴퓨팅, Cloud Computing)들을 연결 할 수도 있다. 대규모 프로젝트에서 이미 그렇게들 하고 있다고 한다.
[전체 소스 보기]
---------------------------------------------------------------------------------
댓글 없음:
댓글 쓰기