테스트벤치 (Testbench)
테스트벤치란 우리가 베릴로그로 구현한 HDL 모델이 올바르게 동작하는지 검증하기 위한 시물레이터이다.
구현한 모듈에 입력 신호를 넣고 출력 신호를 wire로 연결하면 입력 신호의 변화에 따른 출력 신호를 확인할 수 있다.
보통은 시험하는 모듈의 이름 앞에 tb를 붙인다. ex) tb_adder
테스트벤치에는 입출력 포트가 없으며 initial block을 이용하여 SW처럼 순서대로 시간에 따른 동작을 구현하게 된다.
initial 구문
일반적으로 베릴로그로 작성된 코드를 시뮬레이션하게 되면 코드가 동시에 동작하지만
initial block 내부에 있는 코드는 시간 순서에 따라서 위에서 아래로 진행된다.
이러한 특징으로 initial block은 절자적인(procedural) block이라고 한다.
이 구문은 전체 시뮬레이션에서 한번만 실행되는 내용으로 초기화나 신호 값을 보기위해 사용된다.
주의할 점은 실제 하드웨어는 멈추지 않고 계속 동작하므로 initial 구문은 오직 테스트용으로만 사용해야 한다.
initial 구문은 begin - end로 묶어서 사용한다.
initial begin
~~~~~~~
~~~~~~~
end
~~~ 부분에 변수를 초기화하거나 시간에 따라 값을 변경해서 신호를 모니터링하면 된다.
위 코드에 대한 시뮬레이션 결과이다.
초기에 모든 신호는 0으로 초기화 되었고 10ns단위로 A, SEL, B 신호가 1로 값이 바뀌었다.
always 구문
initial block이 한번만 실행되는 구문이라면 always block은 계속 반복하여 내용을 실행하는 구문이다.
initial block에서 초기화시킨 변수를 일정 시간마다 바뀌어줄 때 사용한다. ex) clock
reg 타입의 clock변수를 initial block에서 0으로 만들어주고 always block을 이용하여 5ns마다 토글되도록 하였다.
테스트벤치 결과 분석 명령어
$monitor: 신호 값이 바뀔 때 신호 값을 스크린에 출력한다.
$monitor (SEL, A, B, F); 이렇게 사용한다.
$time: 시간을 확인할 때 사용하는 명령어이다. $time을 변수처럼 사용하면 된다.
$display: 변수, 문자열 등의 값을 표시한다.
C언어의 printf처럼 %d, %b, %h, %o, %s, %m, %f를 반환자로 사용하여 변수 값을 받아서 출력할 수 있다.
$monitoton: monitor를 실행한다.
$monitotoff: monitor를 종료한다.
$stop: 시뮬레이션을 중지한다.
$finish: 시뮬레이션을 끝낸다.
stop은 잠시 종료하는 것이고, finish는 시뮬레이션을 완전히 종료된다.
디버깅에는 $monitor나 $display가 주로 사용된다.
Time Scale
시뮬레이션에서는 특정한 시간단위로 동작할 것인지 설정할 수 있는데, 대게 맨 첫줄에
`timescale time_unit / time_precision 이러한 형태로 존재한다.
time_unit은 측정단위이고, time_precision는 반올림을 어디서 할 것인지를 결정하는 요소이다.
예를 들어 10ns / 1ns로 되어있으면 #단위당 10ns로 측정하는 것으로
#2.56라고 하면 2.56 x 10ns = 25.6ns가 되고 1ns단위로 반올림을 하므로 26ns가 된다.
#2.53라고 하면 2.53 x 10ns = 25.3ns가 되고 1ns단위로 반올림을 하므로 25ns가 된다.
'Hardware > FPGA' 카테고리의 다른 글
[Verilog] #3-1 Structural Modeling (Gate level Modeling) (0) | 2020.12.09 |
---|---|
[Verilog] #1 모듈 (Module) (0) | 2020.12.07 |
[Verilog] #0 베릴로그(Verilog)란? / 데이터 타입(Data Types) (0) | 2020.12.07 |