본문 바로가기
개발 Tools/Verilog HDL

Verilog HDL DUT, Test Bench ( 8bit adder, 8비트 덧셈기, vivado )

by 전컴반 2022. 2. 11.
반응형

 

DUT는 실제로 구현되어 사용할 회로이다. 그런데 우리가 짠 코드가 잘 동작하는지는 확인할 수 없다.

그래서 test bench라는 모듈을 이용하여 잘 작동하는지 확인해야 한다.

 

그렇다면 test bench에서 잘 작동할 수 있게 DUT를 잘 합성해야 한다. 그렇게 때문에 합성 가능한 구문으로 만들어야 한다. 대표적으로 assign, always 구문을 이용하여 설계해야 한다는 말이다.

 

느낌이 오지 않는다면 적절한 예시 일진 모르겠지만, 우리가 살았나 죽었나 확인할 땐, 보통 쿡쿡 찔러보고 움직이면, 살아있다고 판단하고 움직이지 않다면 죽었다고 판단한다.

이처럼 DUT가 잘 동작하는지 에러가 있는지를 확인해보기 위해, test bench에서 어떤 입력을 가해서 그에 따른 반응을 확인해야 한다.

 

가하는 입력의 형태은 정해져 있다. 바로 reg로 선언되어야 하고 그 입력 신호는 always나 initial을 사용하여 발생시킨다.

출력 또한 정해져 있는데. wire로 선언돼야 한다. 이게 굉장히 중요하다, 뭣도 모르고 reg로 출력을 선언했다가 계속 에러 떠서 애먹었다. 선언만 하고 꼭 사용하진 않아도 된다.

 

 

DUT와 test bench에 대한 개념을 대충 알았으니 8bit adder로 예시를 들어보자

 

 

위와 같은 회로를 우린 DUT 형태로 설계할 수 있다. add이름을 가진 module을 만들고, 그 위해 top 모듈을 만들어 연결한다. ( 모듈의 합성 방법은 따로 포스팅하겠다. 지금은 DUT와 test bench 동작에 대해 알아보자 )

 

DUT를 설계하면 아래와 같다. 

module add를 만들고 top module에는 add와 F/F을 연결한다.

add 모듈은 u0라는 인스턴스 이름을 사용하여 named mapping 방식으로 불러왔다.

 

module add (a, b, sum);
    input [7:0] a, b;
    output [7:0] sum;
    
    assign sum = a + b;
endmodule


module top (clk, reset, a, b, out);
    input clk, reset;
    input [7:0] a, b;
    output [7:0] out;
    
    reg [7:0] out;
    wire [7:0] sum;
    
    add u0(.a(a), .b(b), .sum(sum));
    
    always@ (posedge clk or posedge reset) begin
        if(reset) out <=8'b0;
        else out <= sum;
    end
endmodule

 

위처럼 DUT 파일을 만들면 이제 test bench에 집어넣어 잘 동작하는지 알아봐야 한다. 확인하기 위해 test bench 모듈에서의 입력을 넣는다. 대게는 initial구문이나 always 구문을 사용한다. 

 

테스트 벤치 코드는 아래와 같다.

 

module tb_top;
    reg clk, reset;
    reg [7:0] a, b;
    wire [7:0] out; 
    
    top u1(clk, reset, a, b, out);
    
    initial clk = 0;
    always #20 clk = ~clk;  //40ns clock (25MHz)
    
    initial
    begin
        a = 0; b = 0;
        reset = 1;
        #30
        reset = 0; a = 34; b = 61;  // test input
        #100
        $stop;
    end
endmodule

 

DUT를 u1으로 불러왔고 initial과 always를 이용하여 25 MHz 클럭을 만들었다. #20은 주기가 40ns이니까 1초로 환산하면 약 25 MHz정도 된다.

 

시뮬레이션을 돌려보면 아래와 같은 파형이 완성된다. 처음에 계속 16진수로 출력되길래 한참을 헤맸는데, 저 value에 오른쪽 마우스 누른다은 Redix 누르고 10진수로 바꾸면 된다.

 

 

파형을 보면, clk이 들어와도 reset이 계속 1이라 동작하지 않는다. reset이 0이 되면 모듈 add에 a와 b값이 들어간다. 하지만 clk이 뛰지 않아 대기하다가 다음 clk이 들어오면 더하게 된다. 

 

쉽지 않다. 쉽지 않아..

반응형

댓글