2023년 8월 17일 목요일

Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"[2/4]

Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기

Verilog HDL과 SystemC 테스트 벤치의 Co-Simulation 예제 중 SystemC/C++ 테스트 환경을 빌드하고 실행 하는 방법을 설명한다.

목차:

1. 사전 준비
2. 예제 내려받기
3. SystemC 테스트 환경 "Apple2" 빌드
4. 입출력 드라이버 "Apple2_Screen" 빌드
5. 실행
6. 요망사항
--------------------------------------------------------------------------

1. 사전 준비

예제를 수행하기 위해 다음과 같은 시뮬레이션 도구와 사전 라이브러리가 구축되어야 한다.

- VisualStudio 2022 Community Edition
- SystemC 2.3.3
- SDL2

사전준비는 아래의 링크에 따라 설치한다.

https://fun-teaching-goodkook.blogspot.com/2023/08/systemc-sdl2.html

2. 예제 내려받기

아래 링크에서 예제를 내려받아 압축을 푼다.

https://drive.google.com/file/d/152hO9EkAhfQ6mv0biaNVylZcI79n-4Sa/view?usp=drive_link

압축을 푼 후 폴더 구조에 유의하자.

- Verilog RTL 소스를 넣어 두는 폴더
- 테스트 환경 구축용 C++ 소스 파일 폴더
- VisualStudio 프로젝트 작업 폴더
- QuestaSim 작업 폴더

3. SystemC 테스트 환경 "Apple2" 빌드

예제를 푼 폴더에서 MSVC 폴더를 찾아 들어가면 Apple2.sln 이 있다.

이 프로젝트를 더블-클릭하여 VisualStudio 를 실행시킨다. "Apple2"를 빌드 해보자.

헤더 파일 systemc.h 를 찾을 수 없다는 메시지.

SystemC 는 MSVC C++의 기본 라이브러리가 아니기 때문이다. 앞서 구축한 SystemC 의 소스 폴더를 인클루드 검색 폴더에 추가 시켜야 한다.

컴파일 옵션을 확인하자. 헤더파일 systemc.h 는 앞서 systemc-2.3.3의 압축을 풀었던 폴더안에 있다.

프로젝트 옵션 중  Additional Include Directories 에 추가 시키자.

그외 SystemC 라이브러리를 구축할 때 사용했던 옵션들과 일치하는지 확인해 두자.



그리고 드러나지 않은 옵션이 하나 더있다. MSVC++가 표준 C++를 완벽히 지원하지 않아서 생긴 것이라고 한다. 사실 표준으로 제정된 C++ 가 워낙 방대해서 이를 모두 준수하는 컴파일러는 없다고 한다.

다시 "Apple2"를 빌드하면 컴파일은 순조롭게 진행 되지만 링크(Link)에서 수많은 오류가 난다. 대부분 un-resolved external 들이다. 우리가 사용하려는 SystemC 가 기본 라이브러리가 아니었기에 앞서 만들어 두었던 SystemC.lib를 추가 시켜야 한다.

앞서 구축한 SystemC.lib가 저장된 곳을 찾아보자.

이 라이브러리 파일을 프로젝트의 링커 옵션에 추가 시킨다.

이제 다시 빌드하면 기분좋게 실행 파일이 만들어진다.


4. 입출력 드라이버 "Apple2_Screen" 빌드

앞서 컴파일한 "Apple2"는 6502 CPU의 HDL을 검증하기 위한 Co-Simulation 테스트 벤치였다. "Apple2_Screen"은 6502 CPU를 채택한 컴퓨터를 구성하려고 한다. 기본 입출력 장치로 화면과 키보드를 SDL2 라이브러리를 활용하여 컴파일 한다.

예제의 ...\Project_6502\Apple2_Co-Sim\TB\MSVC\Apple2_Screen 에 MSVC 프로젝트 파일이 있다. 더블 클릭하여 빌드하면 헤더파일 SDL.h을 찾지 못한다는 오류 메시지를 보게된다. SDL2 의 압축을 풀었던 폴더에서 include 에 SDL.h 가 있다. 컴파일러 Additional Include Directories 에 추가시키자. 이 프로젝트는 SystemC 를 사용하지 않으므로 다른 옵션을 수정할 필요는 없다.

링크 시 un-resolved externals 라는 에러가 나올텐데 이 역시 SDL2.lib 를 추가시키지 않았기 때문이다. 찾아서 Linker:Input의 Additional dependencies 에 추가시키자.

다시 빌드하면 무난히 컴파일이 끝난다.

5. 실행

아직 Verilog 를 포함하지 않은 단계이지만 SystemC 만으로 만들어 놓은 테스트 환경만 실행시켜보자. 두개의 MSVC 어플리케이션을 만들어 놓았다. 두 어플리케이션 사에에 통신은 Windows IPC 중 PIPE 를 통해 데이터를 주고 받는다.

Apple2 테스트 벤치는 여러가지 시험을 할 수 있도록 작성되었다. sc_CPU6502.h 에 어떤 테스트를 할지 결정하는 define 매크로가 있다.

// Type of Test
#define TEST_MEMORY
//#define TEST_APPLE2_SCREEN
//#define TEST_APPLE1_SCREEN
//#define TEST_KEYBOARD
//#define TEST_BINARY_LOADER

매트로 정의 #define 앞에 붙은 코멘트를 제거함으로써 테스트할 항목을 지정할 수 있다. 키보드 입출력을 테스트 하려면 아래와 같이 코멘트를 지우고 Re-Build 한다.

//#define TEST_MEMORY

#define TEST_KEYBOARD

"Apple2_Screen" 프로젝트를 활성화 한 후 F5 키를 눌러 실행 시킨다. 이어 "Apple2" 프로젝트에서 F5를 눌러 실행 시행킨다. MSVC에서 F5 키는 디버그 실행을 의미한다. 그외, F9는 브레이크 설정, F10, F11은 소스코드 trace-in/out이다. MSVC의 다양한 디버깅 기법을 스스로 익혀보기 바란다.

"Apple2_Screen" 을 실행시켜 화면에 띄워진 "Apple ][ screen" 에 타이핑을 하면 입출력되는 모습을 보게 될 것이다.

* Verilog로 작성된 RTL의 CPU가 사용할 메모리를 SystemC 로 모델링 하였다. 이 메모리 모델이 추후 적용할 CPU에서 읽기 및 쓰기 동작에 부합 하는지 테스트 하기 위해 sc_CPU6502 라는 SystemC 모듈이 작성 되었다. 이 모듈은 실제로 6502 CPU의 기능을 수행 하지 않고 단지 메모리 접근 타이밍 만을 모델링 한 것이다. 이런 모델을 BFM (Bus Functional Model) 이라 한다. 

6. 요망사항

아직 Co-Simulation 단계에 들어가지 않았고 SystemC/C++ 로 Verilog HDL을 검증하기 위한 환경을 구축하였다. 예제의 C++와 SystemC를 모두 이해하려면 다소 시간이 필요하다. 앞으로 수차례에 걸쳐 살펴볼 것이다. 너무 어렵게 생각하지 않길 바라며 현재 위치에서 소스를 훑어보고 전체적인 구조와 흐름을 파악해 보자. 추후 강의 시간에 질문할 꺼리가 생기길 바란다.

[읽어보기]
디지털 반도체 설계자가 알아야할 C++ 언어

-----------------------------------------------------------------------
[이전SystemC 및 SDL2 라이브러리 빌드 하는 방법
[다음Project_6502 예제의 기능적 Co-Simulation 실시 방법

댓글 없음:

댓글 쓰기