2023년 8월 17일 목요일

Project_6502 예제의 기능적 Co-Simulation 실시 방법

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

Project_6502 예제의 기능적 Co-Simulation 실시 방법

SystemC/C++로 작성된 검증 환경(테스트 벤치)의 목적은 합성 가능한 RTL의 Verilog 설계물을 검증하기 위한 것이다. 검증 환경의 구축에 C++를 동원한 높은 수준의 컴퓨팅언어를 사용하는 이유는 실제와 동일한 환경을 마련하기 위함이다. 추상성이 낮은 HDL 테스트 벤치로는 검증에 사용할 테스트 입력이 단순화 될 수 밖에 없다.

CPU를 설계하여 그를 검증하기 위한 가장 적절한 환경은 규모가 작더라도 입출력 장치를 갖춘 컴퓨터다. 앞서 구성한 SystemC/C++ 검증 환경은 6502 CPU를 사용하는 컴퓨터다.

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

CPU가 운용하게 될 메모리와 입출력 장치(키보드와 스크린)를 높은 추상화 수준에서 구축하였다.

아울러 CPU가 채택된 소규모 컴퓨터에서 실행 될 펌웨어(모니터 프로그램)을 적용해야 하는데, Apple-1 이 처음 발매 되었을 때 사용되었던 Wozniak[Link]의 모니터 롬 파일을 적재 시켰다. Co-Simulation으로 Apple-1의 모니터 프로그램 사용자 메뉴얼[Link]에 따라 작동 시킴으로써 6502 CPU의 RTL을 검증 하였다.

참고:

1. Steve Wozniak, https://en.wikipedia.org/wiki/Steve_Wozniak
2. Apple-1 Operation Manual, https://archive.org/details/Apple-1_Operation_Manual_1976_Apple_a

목차:

1. QuestaSim
2. 컴파일 스크립트
3. 시뮬레이션 스크립트
4. Co-Simulation 실행

-----------------------------------------------------------------------------------------

1. QuestaSim

가장 믿을 만한 HDL 시뮬레이터로 VHDL, Verilog, SystemVerilog 뿐만 아니라 SystemC 를 지원한다. 이를 위해 GCC/G++ 를 내장하고 있다. 매우 고가의 시뮬레이터 이나 인텔 FPGA 툴과 함께 1년단위 라이센스를 무료로 배포하고 있다. 매우 고마운 일이 아닐 수 없다. QuestaSim의 설치는 아래 링크를 참조하자.

    https://fun-teaching-goodkook.blogspot.com/2023/07/questasimmodelsim.html

최정상 도구인 만큼 다양한 기능을 가지고 있고 사용자 매뉴얼이 2천여 쪽에 달한다. 외국어 공부할 때 사전을 다 외우지 않듯이 필요할 때 마다 찾아보기로 하자. 기능이 많다고 사용법이 어려운 것은 아니다. 매우 쉽다. 사용법을 보고 싶다면 아래 링크의 문서를 참조하라.

    http://www.ednc.com/wp/wp-content/uploads/2015/06/Questa_10.3d_tutorial.pdf

2. 컴파일 스크립트

베릴로그 파일을 시뮬레이션하려면 컴파일해야 한다. 추후 합성 과정을 거치면 컴퓨팅 언어에서 전자회로의 네트리스트로 바뀌기 전까지는 베릴로그도 컴퓨팅 언어이다. 컴퓨팅 언어로 묘사된 전자회로가 작동하는 모습을 관찰하는 것을 시뮬레이션이라고 한다. QuestaSim에서 Verilog의 컴파일 명령은 vlog 다.

    vlog <verilog filename>

수많은 옵션이 따라 붙지만 어쨌든 명령은 한개다. 컴파일 하면서 생성되는 중간 파일과 그 결과 파일은 모두 현재 작업 폴더에서 하위 폴더에 저장 되는데 이 폴더 명은 work 로 지정되어 있다. 따라서 컴파일 하기전에 work 라는 이름의 하위 폴더를 만든다.

    vlib work

앞서 VusialStudio로 SystemC와 C++의 소스 파일을 컴파일 했었다. 그때 생성되었던 실행 파일은 QuestaSim에서 사용 할 수 없다. 다행히도 QuestaSim에 GCC/G++를 내장하고 있어서 테스트 환경으로 사용했던 C++ 소스를 변경 없이 컴파일 할 수 있다. SystemC 컴파일 명령은 sccom 이다.

    sccom <c/cpp filename>

복수의 소스 파일을 컴파일 해야한다. 개발 중에 수없이 많은 컴파일을 반복 수행해야 한다. 그때마다 일일이 명령줄에서 입력하려면 여간 피곤한 일이 아닐 수 없다. QuestaSim 은 Tcl/Tk 스크립트를 쓸 수 있지만 아주 단순한 자체 스크립트 형식을 가지고 있다. 사실 배치 파일 형식이라 커맨드 라인 입력을 나열해 놓은 것에 불과하다. Do 스크립트라고 하는데 파일 확장자가 .do 다. Project_6502 예제의 스크립트는 TB/MTI 폴더에 있다.

그 중 한 스크립트를 보자.

#****************************************************
# filename:  Apple2_Co-Sim\TB\MTI_1_Async\compile.do
# MTI simulation scrips for
#   Arlet's Verilog-6502
# Vendor: GoodKook
# Purpose: SystemC testbench
# Revision History: 23 Jul 2023
#****************************************************************
onbreak {resume}
# create library
if [file exists work] {
    vdel -all
}
vlib work

# Verilog compile
vlog -reportprogress 300 -work work ../../Arlet_Verilog-6502_1_Async/ALU.v
vlog -reportprogress 300 -work work ../../Arlet_Verilog-6502_1_Async/cpu.v +define+SIM

# compile and link SC source files
sccom -reportprogress -g -work work ../sc_mem.cpp -DDEBUG_MESSAGE_REGISTER
sccom -reportprogress -g -work work ../sc_CPU6502.cpp -DCOSIM_VERILOG
sccom -reportprogress -g -work work ../Apple2.cpp  -DCOSIM_VERILOG
sccom -link -lcomdlg32

설명이 필요 없을만큼 단순하다. 합성하기 전의 소스 컴파일에는 별다른 옵션이 필요없다. 옵션이 많이 들어간다면 뭔가 조치가 필요할 만큼 문제가 있다는 뜻이 아닐까?

3. 시뮬레이션 스크립트

컴파일을 마쳤으면 실행 시킬 차례다. 소프트웨어의 실행 파일 .exe는 저장장치에 놓여 있다가 사용자의 명령(GUI 운영체제에서는 실행파일을 더블클릭)에 따라 목표 운영체제에서 메모리에 적재된 후 작동한다. 하드웨어 언어의 문장은 병렬실행(concurrent execution)이다. 따라서 일반적인 소프트웨어 운영체제에서 실행 될 수 없다. QuestaSim의 병렬 시뮬레이션 커널에서 실행 시켜야 한다. 실행 명령은 vsim 이다.

Project_6502 예제의 스크립트는 TB/MTI 폴더에 있다. 그중 한 시뮬레이션 스크립트를 보면 다음과 같다.

#********************************************
# MTI compile scrips
# Vendor: GoodKook
# Associated Filename: simulate.do
# Purpose: SystemC testbench
# Revision History: 24 Jul 2023
#*********************************************
vsim -voptargs=+acc work.sc_main

역시 간단하다. work 폴더에 있는 컴파일 된 모듈 중 sc_main을 최상위 모듈로 삼아 시뮬레이션을 진행하도록 적재(load) 하라는 명령 뿐이다.

입출력 신호들의 파형을 보고 싶다면 시뮬레이션을 실시하기 전에 파형(waveform) 창에 추가 시켜주자.

add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/clk
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/reset
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/AB
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/DI
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/DO
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/WE
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/IRQ
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/NMI
add wave sim:/sc_main/u_sc_CPU6502_Top/u_sc_CPU6502/RDY

4. 실행

QuestaSim을 실행 시켜 작업 폴더로 이동 후 컴파일 스크립트 실행

컴파일이 무사히 완료되면 work 라이브러리들이 표시된다. Verilog 모듈과 SystemC 모듈이 보인다.

시뮬레이션 스크립트를 실행하여 최상위 모듈을 적재한다. 최상위 모듈 sc_main 아래로 SystemC 로 작성된 메모리 모델 sc_mem과 Verilog RTL 모델이 계층적으로 구성되었음을 알 수 있다.

QuestaSim에 적재된 시뮬레이션 모듈들은 CPU와 메모리 뿐이다. 6502 CPU의 입출력 장치는 윈도우즈의 키보드와 화면을 통해 구동하기로 한다.

MSVC의 "Apple2_Screen" 을 먼저 실행 시켜 놓은 후 QuestaSim의 커맨드 창에 실행 명령을 준다. 실행 명령은 run 이다.

QuestaSim에서 실행되는 Verilog의 CPU와 윈도우즈에서 구현된 입출력장치  어플리케이션 'Apple ][ screen'을 구동하는 모습을 보여준다. 이것이 Co-Simulation 이다.

-----------------------------------------------------------------------------

예제 실습: "Verilog RTL에서 GDS 레이아웃 까지"
[이전Project_6502 예제의 SystemC 테스트 환경 빌드 및 실행하기
[다음Project_6502 예제의 합성 후 Co-Simulation 실시 방법


댓글 없음:

댓글 쓰기