베릴로그

Verilog 1주차 - Testbench

aude_ 2025. 3. 3. 20:35

내가 만든 시스템을 검증 (이전 글의 y = a & b 같은) 하기 위해 Testbench라는 것을 작성합니다

 

기본틀 :

`timescale 1ns / 1ps

module tb_practice();

endmodule

 

verilog작성과 틀은 비슷합니다.

 

 

 

 

괄호밖에 port를 선언해주어야하는데

testbench작성시 input대신 reg를 output 대신 wire를 선언합니다.

그리고 뒤에 ';'를 붙여주어야 합니다

ex)

`timescale 1ns / 1ps

module tb_practice();

reg c, d;

wire z;

endmodule

 

 

 

 

그 다음 우리가 만든 모듈 (이전 글에 만든)을 불러와야 테스트 할 수 있습니다. 그래서 다음과 같이 불러줍니다.

ex)

`timescale 1ns / 1ps

module tb_practice();

reg c, d;

wire z;

 

practice u_practice(

 

);

endmodule

 

여기서 굵게 표시된  practice가 이전글에 만들었던 module 이름입니다. u_practice는 인스턴스명 입니다.

 

practice라는 module을 여러번 사용할 수 있으니 각자 이름을 여러개 만들어 주어 인스턴스화 하는 것입니다.

 

(u_practice는 practice의 복사본이라 여기면 됩니다.)

 

 

 

 

이렇게 만든 인스턴스안에 우리가 불러온 module(practice)의 port와 복사본으로 만든 u_practice의 포트를 매칭 시켜주어야합니다.

 

ex)

`timescale 1ns / 1ps

module tb_practice();

reg c, d, wire z

practice u_practice(

.a(c),

.b(d),

.y(z)

);

endmodule

 

괄호 밖의 a,b,y가 practice의 port 이름이었고 괄호 안 c,d,z가 새롭게 설정해준 reg와 wire입니다. 그래서 reg와 wire가 어느 port에 매칭되는지 알 수 있습니다.

 

 

 

 

 

그 다음은 c와 d 각각 (input에 해당)에 값을 넣어 결과를 보아야하기 때문에 다음과 같이 작성해줍니다.

 

ex)

`timescale 1ns / 1ps

module tb_practice();

reg c, d, wire z

practice u_practice(

.a(c),

.b(d),

.y(z)

);

initial begin
    #10; c=0; d=0;
    #10; c=0; d=1;
    #10; c=1; d=0;
    #10; c=1; d=1;
    #10;
    $stop;
end

endmodule

 

빨간색 글씨가 직접 테스트하는 내용입니다.

#10은 delay입니다

여기서 delay가 얼마나 되는지는 timescale을 보면 됩니다.

`timescale 1ns / 1ps

여기서 1ns가 단위이고 #10이므로 10ns라고 이해하면 됩니다.

 

10ns뒤 c=0 d=0이 들어가고 10ns뒤 c=0 d=1.... 이런식으로 동작하게됩니다.

 

 

전체 testbench 코드

 

 

 

시뮬레이션 결과

 

 

 

'베릴로그' 카테고리의 다른 글

Verilog - 1bit Half Adder, Full Adder (인스턴스화)  (0) 2025.03.09
Verilog 1주차 - 기본 작성법  (0) 2025.03.03