내가 만든 시스템을 검증 (이전 글의 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.... 이런식으로 동작하게됩니다.
'베릴로그' 카테고리의 다른 글
Verilog - 1bit Half Adder, Full Adder (인스턴스화) (0) | 2025.03.09 |
---|---|
Verilog 1주차 - 기본 작성법 (0) | 2025.03.03 |