인터랙티브 테스트벤치는 시뮬레이터 설정 중 하나로, 실행 중에 연산자가 DUT(시험 대상 장치)에 입력을 제공하는 방식입니다. 주로 시뮬레이터 콘솔에 명령어를 입력해 DUT에 자극을 주는 형태입니다.
항상 자가 검증 테스트벤치를 만들어야 하지만, 인터랙티브 테스트벤치는 좋은 보조 수단이 됩니다. 자가 검증 테스트벤치 코드를 수정하는 것보다 인터랙티브 테스트벤치로 애드혹(ad-hoc) 테스트를 수행하기가 더 쉽습니다.
랩에서 발견한 문제를 테스트벤치에서 재현해보고 싶을 때가 많습니다. 인터랙티브 테스트벤치가 있으면 시뮬레이터에서 관찰된 입력 시퀀스를 타이핑하는 것만으로 원치 않는 동작을 재현할 수 있습니다.
Tcl과 VHDL의 상호작용
대부분의 VHDL 시뮬레이터는 콘솔 언어로 Tcl을 사용합니다. 시뮬레이터마다 벤더별 명령어가 있지만, 좋은 소식은 이를 일반 Tcl 명령어처럼 다룰 수 있다는 점입니다. Tcl로 VHDL 테스트벤치 관리 및 지원을 위한 복잡하고 대부분 이식 가능한 스크립트를 만들 수 있습니다.
Tcl에서 VHDL 시그널 변경하기
VHDL과 상호작용하려면 시그널 값을 변경하는 명령어를 찾아야 합니다. ModelSim에서는 force 명령어입니다. 명령어 레퍼런스 문서에 명시된 시놉시스는 다음과 같습니다:
사용할 스위치는 -deposit 플래그입니다. 이 플래그는 VHDL 시그널 값을 즉시 변경하지만, 나중에 다른 VHDL 또는 Tcl 드라이버가 다른 값으로 변경할 수 있게 합니다.
우리가 쓰지 않는 옵션을 무시하면 단순화된 시놉시스는 다음과 같습니다:
force -deposit <signal_name> <value>
VHDL 트리거
이제 Tcl에서 VHDL 시그널을 제어하는 법을 알았으니, VHDL 테스트벤치에 어떤 수신자 프로세스를 만들어야 합니다. 아래 코드는 그러한 테스트벤치의 최소 예시입니다.
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity interactive is end interactive; architecture sim of interactive is -- Controlled by Tcl signal trigger : std_logic := '0'; begin process is begin wait until trigger = '1'; report "Triggered!"; end process; end architecture;
이 프로세스는 trigger 시그널이 무언가에서 '1'로 변경될 때 깨어납니다. 콘솔에 "Triggered!"를 출력해 Tcl에서 VHDL 프로세스 제어 개념을 테스트할 수 있게 합니다.
ModelSim 콘솔에서 이를 실행했습니다. 발행된 명령어와 출력은 아래 트랜스크립트에서 볼 수 있습니다.
VSIM 1> run 10 ns; VSIM 2> force -deposit /trigger '1' VSIM 3> run 0 ns; # ** Note: Triggered! # Time: 10 ns Iteration: 0 Instance: /interactive VSIM 4> force -deposit /trigger '0' VSIM 5> run 10 ns;
시뮬레이션 시작 후 10나노초 동안 테스트벤치를 실행했습니다.
그런 다음 trigger 시그널을 '1'로 강제했습니다. 다음 줄에서 0나노초 대기했습니다. 이는 델타 사이클을 만들기 위함입니다. 프로세스가 트리거되길 원하지만 시뮬레이션 시간이 지나가길 원치 않기 때문입니다.
마지막으로 테스트벤치를 계속하기 전에 trigger 시그널을 '0'으로 되돌렸습니다.
"run 0 ns" 줄 이후 VHDL 프로세스가 깨어나 "Triggered!"를 콘솔에 출력했음을 볼 수 있습니다.
Tcl에서 VHDL 시그널 값 읽기
ModelSim에서 시그널 값을 읽으려면 examine 명령어를 쓸 수 있습니다. 예를 들어 trigger 시그널 값을 읽으려면 ModelSim 콘솔에서 이 명령어를 사용합니다:
VSIM 6> examine /trigger # 0
스크립트에서 examine을 쓸 때는 값을 Tcl 변수에 할당하고 싶을 겁니다. ModelSim 콘솔에서 시도해 봅시다:
DUT가 반응할 만큼 충분히 테스트를 실행하는 가장 쉬운 방법은 시뮬레이터를 고정 시간 동안 실행하는 것입니다. 예를 들어 DUT가 두 클록 사이클 후 반응하고 클록 주기가 10나노초라면 Tcl 스크립트에서 run 20 ns 명령어를 쓰면 됩니다.
DUT의 반응 시간이 고정되지 않았다면 VHDL 어서션(assertion)으로 시뮬레이션을 멈추고 Tcl 콜백 함수에 제어를 넘길 수 있습니다. ModelSim에서는 Tcl 스크립트에서 when 명령어로 브레이크포인트를 설정합니다:
when [[-fast] [-id <id#>] [-label <label>] {<when_condition_expression>} {<command>}]
브레이크포인트 적중 시 실행될 onBreak 콜백 함수도 Tcl에서 정의해야 합니다. onBreak 함수는 ModelSim 명령어 레퍼런스에 명시되어 있습니다.
Tcl 주도 테스트의 단점
Tcl 스크립트에 크게 의존하는 테스트벤치에는 단점이 있습니다. 가장 두드러진 건 속도와 이식성 문제입니다.
Tcl 주도 테스트벤치는 시뮬레이터를 여러 번 시작/정지하며 VHDL 코드와 상호작용합니다. 시뮬레이션을 멈추고 Tcl 함수를 실행한 뒤 다시 시작하는 건 VHDL 테스트벤치를 연속 실행하는 것보다 시간이 더 걸립니다. Tcl은 인터프리터 언어인 반면 VHDL은 시뮬레이터에서 컴파일되어 훨씬 빠르게 실행됩니다.
Tcl 자체는 다른 시뮬레이터로 이식 가능하지만, 반드시 써야 하는 시뮬레이터별 명령어들은 이식되지 않습니다. 다른 시뮬레이터에서 동등한 명령어를 찾아도 동작이 다를 수 있습니다. 시뮬레이터 벤더들이 지원 명령어에 대한 자체 규칙을 만들기 때문입니다. 따라서 Tcl 주도 테스트벤치는 순수 VHDL 테스트벤치보다 이식성이 낮다고 봐야 합니다.
새 VHDL 및 FPGA 강의
* 테스트벤치를 심도 있게 다루는 새로운 VHDL 및 FPGA 강의를 제작 중입니다. FPGA 설계를 처음부터 만드는 법을 배우고, 강의 완료 후 자가 검증 테스트벤치 작성법과 그 코드를 재사용해 인터랙티브 테스트벤치를 만드는 법을 알게 됩니다.
* 2020년 10월 12일 업데이트: 강의를 완료했습니다. 아래 이미지를 클릭해 자세히 알아보세요.
만들 제품은 도트 매트릭스 LED 컨트롤러 모듈입니다. $49짜리 Lattice iCEstick 개발 보드를 사용합니다. 마지막에는 브레드보드에 설계를 구현합니다. 컴퓨터 키보드로 타이핑하면 FPGA가 제어하는 도트 매트릭스 LED 화면에 문자가 나타납니다.