VHDL 테스트벤치 시뮬레이션 우아하게 종료하기
VHDL 테스트벤치가 의도한 실행 끝에 도달하면 시뮬레이터가 깔끔하게 정지하고, 가능하다면 호출 스크립트로 제어권을 반환하길 원합니다. 이 글은 주요 VHDL 시뮬레이터 전반에서 시뮬레이션을 멈추는 가장 일반적이고 신뢰할 수 있는 기법들을 ModelSim, Vivado, Tcl 스크립트용 코드 예제와 함께 리뷰합니다.
1. finish 프로시저 사용 (VHDL-2008)
std.env 패키지의 finish 루틴은 에러 없이 완료된 테스트벤치를 끝내는 가장 직관적인 방법. 테스트벤치만 VHDL-2008로 컴파일하면 되며 RTL은 이전 표준 유지 가능.
use std.env.finish; ... SEQUENCER_PROC : process begin -- Insert testbench logic here wait until stop_condition; report "Calling 'finish'"; finish; end process;
기본적으로 finish는 GUI에서 종료 확인 프롬프트 표시. 배치 모드 등에서 자동 종료 원하면 vsim에 -onfinish stop 스위치 추가:
vsim -onfinish stop work.using_finish_tb
배치 모드(vsim -c) 실행 시 시뮬레이터가 깔끔하게 종료하고 셸로 제어권 반환, 회귀 스크립트에 이상적:
jonas@ubuntu:~/stop_tb$ vsim -c -do 'vsim work.using_finish_tb; run -all' # … # ** Note: Calling 'finish' # Time: 1 ms Iteration: 0 Instance: /using_finish_tb # End time: 22:58:31 on Jun 21,2020, Elapsed time: 0:00:00 # Errors: 0, Warnings: 8 jonas@ubuntu:~/stop_tb$
두 오버로드 존재: procedure FINISH;와 procedure FINISH (STATUS : INTEGER);. 상태 값은 시뮬레이터 의존적이므로 종료 코드로 의존 권장 안 함. ModelSim에선 Tcl 스크립트에서 exit -code 로 셸 종료 코드 명시적 설정 가능.
2. stop 프로시저 사용 (VHDL-2008)
stop 루틴은 시뮬레이션 일시 정지 - 수동 검사나 나중에 재개할 때 유용. 브레이크포인트처럼 동작.
use std.env.stop; ... SEQUENCER_PROC : process begin wait until stop_condition; report "Calling 'stop'"; stop; end process;
스크립트 주도 워크플로에서 stop은 Tcl 셸로 떨어뜨려 exit 수동 발행 전까지 스크립트 중단. 그래서 자동화 실행엔 finish가 일반적으로 선호.
3. 어설션 실패 활용
일부 설계자는 의도적으로 어설션 실패 유발로 테스트벤치 종료. 이 방법은 모든 VHDL 버전에서 작동, 추가 임포트 불필요:
SEQUENCER_PROC : process begin wait until stop_condition; assert false report "Test: OK" severity failure; end process;
시뮬레이터 종료 보장되지만 콘솔에 테스트 성공인데도 failure 리포트되어, 실패를 에러로 간주하는 자동 회귀 도구에선 오해 소지.
4. Tcl 콜백으로 종료 제어
신호 검사나 정리 작업 등 더 유연한 제어 필요 시 VHDL 신호를 Tcl 콜백에 연결. VHDL 테스트벤치가 모든 테스트 케이스 완료 시 불리언 stop_condition 신호로 알림.
signal stop_condition : boolean; begin -- Example: toggle after 1 ms stop_condition <= not stop_condition after 1 ms; SEQUENCER_PROC : process begin -- testbench logic wait; -- keep the process dormant end process;
ModelSim
when {stop_condition} { stop echo "Test: OK" } run -all
stop_condition이 참 되면 콜백 실행, 메시지 출력, 시뮬레이션 일시 정지. stop을 exit로 바꾸면 시뮬레이터 즉시 종료.
Vivado
set sim_fileset sim_1 launch_simulation -simset [get_filesets $sim_fileset] add_condition -notrace stop_condition { stop puts "Test: OK" } run all
-notrace 플래그로 명령 에코 억제, 콘솔 출력 깔끔.
최종 권장사항
주요 시뮬레이터 전반에서 VHDL-2008 finish 프로시저가 가장 이식성 좋고 스크립트 친화적. GUI와 배치 환경 모두에서 잔여 대화형 프롬프트 없이 시뮬레이션 깔끔히 종료.
하지만 디버깅 시 시뮬레이션 일시 정지하고 신호 검사·조작 필요하면 Tcl 콜백이 강력한 기능 제공.
예제 프로젝트 다운로드
ModelSim 사용자는 아래 이메일 제출로 네 가지 예시 테스트벤치 담긴 zip 아카이브 수신 가능. (Vivado 사용자는 최소 노력으로 예제 재현 가능.)