SoC 설계/Verilog, SystemVerilog

SystemVerilog: Testbench

yztech 2023. 2. 23. 16:33
반응형

하드웨어 설계에 대해 시뮬레이션을 진행하려면 테스트벤치라는 환경이 필요하다.

목적

테스트벤치를 사용하면 시뮬레이션을 통해 설계의 동작을 확인할 수 있다. 이는 설계에 대해 다양한 입력 stimulus를 사용해서 구동하는 container이다.

테스트벤치에서는 다음과 같은 과정으로 동작 확인이 이뤄진다.

  1. 다양한 종류의 입력 생성
  2. 생성된 입력으로 설계 구동
  3. 제공된 입력으로 출력 생성
  4. 예상되는 동작으로 출력을 확인해서 기능적 결함 확인
  5. 기능상 결함이 발견되면 설계를 변경해서 결함 수정
  6. 기능적 결함이 모두 제거될 때 까지 위 단계를 반복 수행

구성요소

구성요소 내용
Generator DUT를 구동하는 다양한 입력 생성
Interface 구동하거나 모니터링할 신호들을 포함
Driver 생성된 입력을 구동
Monitor 설계된 입출력 포트를 모니터링하여 동작 상태를 취득
Scoreboard 예상되는 동작으로 설계 출력을 확인
Environment 위 내용들을 모두 포함
Test 변경가능한 다양한 구성 설정 환경을 포함

DUT

DUT는 Desugn Under Test의 약자로, Verilog 혹은 VHDL로 작성된 하드웨어 디자인이다. DUT는 칩이 제조된 후 실리콘 검증에 일반적으로 사용되는 용어이다. Design Under Verification (DUV)라고도 부른다.

module tb_top;

    reg clk;
    wire en;
    wire wr;
    wire data;

    design U1 (
        .clk (clk),
        .en (en),
        . ...
        .rdata (data));

endmodule

테스트벤치 작성 예시

module tb_top;

    reg clk;
    wire en;
    wire wr;
    wire data;

    design U1 (
        .clk (clk),
        .en (en),
        . ...
        .rdata (data));

    initial begin
        clk = 1'b0;
        forever #5 clk = ~clk;
    end

    initial begin
        en = 1'b0;
        wr = 1'b0;
        data = 8'h00;

        // Testcase 1
        #10 en = 1'b1;
        #10 wr = 1'b1;
        #10 data = 8'h01;
        #10 wr = 1'b0;

        // Testcase 2
        #10 en = 1'b1;
        #10 wr = 1'b1;
        #10 data = 8'h02;
        #10 wr = 1'b0;

        // Testcase 3
        #10 en = 1'b1;
        #10 wr = 1'b1;
        #10 data = 8'h03;
        #10 wr = 1'b0;

        // Testcase 4
        #10 en = 1'b1;
        #10 wr = 1'b1;
        #10 data = 8'h04;
        #10 wr = 1'b0;

        // End of test
        #10 $finish;
    end

endmodule

위 예시에서는 4개의 테스트케이스를 포함하고 있습니다. 각 테스트케이스에서는 `en` 신호를 활성화한 후, `data` 신호에 특정 값을 입력하고, `wr` 신호를 통해 데이터를 기록합니다.

이렇게 작성된 테스트벤치를 이용하여 설계의 동작을 확인하고, 문제가 발견되면 수정하는 과정을 거칩니다.

테스트벤치 작성은 설계 개발의 초기 단계에서 수행되어야 하며, 설계의 기능적인 측면을 완벽히 이해하고, 다양한 입력 신호를 생성하고, 출력을 검증할 수 있는 능력이 필요합니다.

Interface

인터페이스는 설계와 테스트벤치가 상호작용할 수 있는 방법을 제공합니다. 인터페이스를 통해 테스트벤치에서는 설계의 모든 input과 output 신호를 접근할 수 있으며, 이를 통해 입력을 생성하고, 출력을 검증할 수 있습니다. 또한, 인터페이스에서는 다양한 종류의 시뮬레이션 시간을 처리할 수 있는 time scale과 같은 시뮬레이션 환경을 설정할 수 있습니다. 이를 통해 테스트벤치에서 생성되는 입력 신호와 설계에서 생성되는 출력 신호를 동기화하고, 동작 시간을 정확하게 측정할 수 있습니다.

인터페이스는 또한 테스트벤치의 다른 구성요소와 연결되어 있습니다. 예를 들어, Driver는 인터페이스를 통해 생성된 입력 신호를 구동하고, Monitor는 인터페이스를 통해 설계의 출력 신호를 모니터링합니다.

테스트벤치에서 인터페이스는 설계와의 상호작용을 관리하고, 입력 신호를 생성하고, 출력 신호를 검증하는 데 필수적입니다. 설계와 테스트벤치 간의 통신을 처리하고, 테스트벤치의 구성요소가 설계와 원활하게 상호작용하도록 인터페이스를 잘 구성하는 것이 중요합니다.

Driver

Driver는 인터페이스를 통해 생성된 입력 신호를 구동합니다. 이는 테스트벤치에서 실제로 입력 신호를 생성하는 구성 요소입니다. Driver는 테스트케이스에서 생성된 입력 신호를 활용하여 설계를 구동하고, 입력 신호를 생성할 때 다양한 패턴을 사용합니다. 이를 통해 설계를 다양한 상황에서 테스트할 수 있습니다.

Generator

Generator는 테스트벤치에서 입력 신호를 생성하는 구성요소 중 하나입니다. 이는 특정한 패턴을 사용하여 입력 신호를 생성하며, 다양한 상황에서 설계를 테스트하는 데 사용됩니다. 일반적으로, Generator는 특정한 입력 값의 범위를 정의하고, 값의 변화율, 시간 간격 등을 지정합니다.

Monitor

Monitor는 인터페이스를 통해 설계의 출력 신호를 모니터링하는 구성요소입니다. 이를 통해 설계의 동작을 검증할 수 있습니다. Monitor는 예상되는 값을 사전에 정해놓고, 출력 신호가 이를 충족하는지 확인합니다. 만약 출력 신호가 예상 값과 다르다면, 문제를 해결하기 위해 디자인을 수정합니다.

Monitor는 처리된 데이터를 선택하여 데이터 개체로 변환하여 Scoreboard로 보낸다.

Scoreboard

Scoreboard는 Monitor와 비슷한 기능을 수행하지만, 좀 더 복잡합니다. Scoreboard는 Monitor와 마찬가지로 출력 신호를 검증하지만, 예상되는 출력값을 생성할 수 있는 능력을 가지고 있습니다. Scoreboard는 디자인이 예상한 동작을 수행하는지 확인합니다. 만약 디자인이 예상한 동작을 수행하지 않는다면, 문제를 해결하기 위해 디자인을 수정합니다.

Environment

Environment는 테스트벤치의 구성요소를 모두 포함하는 container입니다. Environment는 테스트벤치의 다른 구성요소들과 함께 동작하며, 인터페이스와 상호작용합니다. Environment는 테스트케이스를 실행하는 데 필요한 모든 정보를 포함하고 있습니다.

Test

Test는 변경 가능한 다양한 구성 설정 환경을 포함하는 구성요소입니다. Test는 테스트케이스 실행 전에 설정되며, 이를 통해 테스트케이스가 실행될 때 환경을 변경할 수 있습니다. Test는 테스트케이스를 더욱 유연하게 만들어줍니다.

이상으로 SV 테스트벤치의 구성요소와 작성 예시에 대해서 알아보았습니다. 테스트벤치 작성은 설계 개발의 초기 단계에서 수행되어야 하며, 설계의 기능적인 측면을 완벽히 이해하고, 다양한 입력 신호를 생성하고, 출력을 검증할 수 있는 능력이 필요합니다.

Abstraction level

각 구성요소의 Abstraction level은 다르며, 테스트벤치에서는 모든 구성요소를 적용할 필요는 없습니다. 일반적으로, 더 낮은 Abstraction level에서는 더욱 정교한 검증이 가능하며, 더 높은 Abstraction level에서는 더욱 쉬운 구현과 빠른 검증이 가능합니다. 따라서, 테스트벤치의 Abstraction level을 선택하는 것은 설계의 복잡도와 검증 목표에 따라 달라질 수 있습니다.

낮은 수준에서는 개별 신호를 사용하여 설계를 토글할 수 있다.

#5 resetn <= 0;
#20 resetn <= 1;

높은 수준에서는 `apply_reset` 작업을 만들어서, 다시 사용할 수 있는 요소로 만들어 사용함으로써, 테스트 벤치를 개발할 때 세부 사항을 숨기고 간단하게 만들 수 있다.

module tb_top;
    bit resetn;

    task apply_reset();
        #5 resetn <= 0;
        #20 resetn <= 1;
    endtask

    initial begin
        apply_reset();
    end

endmodule

요약

이번 포스트에서는 테스트벤치에 대해 알아보았습니다. 테스트벤치를 이용하면 하드웨어 설계의 동작을 확인할 수 있으며, 이를 위해 다양한 입력 stimulus를 사용해서 설계를 구동하는 container를 제공합니다.

또한, 테스트벤치의 구성요소와 작성 예시에 대해서도 알아보았습니다. 테스트벤치 작성은 설계 개발의 초기 단계에서 수행되어야 하며, 설계의 기능적인 측면을 완벽히 이해하고, 다양한 입력 신호를 생성하고, 출력을 검증할 수 있는 능력이 필요합니다.

반응형

'SoC 설계 > Verilog, SystemVerilog' 카테고리의 다른 글

SystemVerilog: Arrays  (0) 2023.03.10
SystemVerilog: modport  (0) 2023.03.10
SystemVerilog: 소개  (0) 2023.02.22
Verilog: Icarus Verilog, GTKwave  (0) 2021.10.16
Verilog: timescale, delay  (0) 2021.10.16