지노랩 /JinoLab

[SystemVerilog] 4.4 클래스 정의 위치: 프로그램, 모듈, 패키지 활용법 본문

SystemVerilog검증/4. 객체지향 OOP 기초

[SystemVerilog] 4.4 클래스 정의 위치: 프로그램, 모듈, 패키지 활용법

지노랩/JinoLab 2025. 2. 25. 11:04

4.4 클래스 정의 위치 (Where to Define a Class)

SystemVerilog에서 클래스(Class)는 다양한 컨텍스트에서 정의할 수 있다.
주로 다음과 같은 위치에서 정의할 수 있다.

  • 프로그램(program)
  • 모듈(module)
  • 패키지(package)
  • 독립적인 파일 (Standalone Class File)

각각의 방식은 특정한 용도에 맞게 사용되며, 테스트벤치 설계에서 중요한 역할을 한다.


1. 프로그램 블록(Program Block)에서 클래스 정의

이 책에서는 프로그램 블록(program block) 내에서 클래스를 정의하는 방식을 다룬다.
프로그램 블록은 테스트 코드(Test Code)를 포함하는 모듈(Module)과 유사한 개념으로,
다음과 같은 역할을 수행한다.

  • 단일 테스트(Test)를 실행하는 역할
  • 테스트벤치(Testbench)를 구성하는 객체(Object)들을 포함
  • 초기화 및 실행을 위한 initial 블록을 포함

Chapter 5에서는 프로그램 블록을 보다 자세히 다룰 예정이다.
현재는 프로그램 블록을 테스트 코드를 포함하는 모듈로 이해하면 된다.


2. 패키지(Package)를 활용한 클래스 관리

많은 검증 팀(Verification Team)은 단일 클래스를 독립적으로 정의하거나,
관련된 여러 클래스를 하나의 파일로 묶어 관리
한다.

이때, SystemVerilog에서는 패키지(Package)를 사용하여 클래스들을 효과적으로 관리할 수 있다.

패키지를 활용한 클래스 그룹화

예를 들어, SCSI 또는 ATA 트랜잭션을 처리하는 여러 클래스를 하나의 패키지로 묶을 수 있다.

package scsi_ata_pkg;
    class SCSI_Transaction;
        // SCSI 트랜잭션 관련 코드
    endclass

    class ATA_Transaction;
        // ATA 트랜잭션 관련 코드
    endclass
endpackage

위와 같이 패키지를 사용하면, 테스트 코드와 패키지를 분리하여 독립적으로 컴파일할 수 있다.

패키지 활용의 장점

  1. 코드의 모듈화(Modularization)
    • 관련된 클래스를 패키지로 묶어 재사용성과 유지보수성을 향상시킬 수 있다.
  2. 독립적인 컴파일(Separate Compilation)
    • 패키지를 독립적으로 컴파일할 수 있어 테스트 코드와의 종속성을 줄일 수 있다.
  3. 파일 및 코드 관리 용이성
    • 서로 관련 없는 클래스(예: 트랜잭션, 스코어보드, 프로토콜 클래스 등)는 별도의 패키지 및 파일로 관리하는 것이 바람직하다.

3. 모듈(Module) 내에서 클래스 정의 가능

SystemVerilog에서는 클래스가 모듈 내에서도 정의될 수 있다.
그러나 일반적으로 클래스는 프로그램 블록이나 패키지에서 정의하는 것이 권장된다.

모듈 내부에서 클래스를 정의하는 경우,
모듈의 인스턴스화(Instantiation)와 관련된 제약이 발생할 수 있으며,
재사용성이 제한될 수 있다.


4. 독립적인 파일에서 클래스 정의 (Standalone Class File)

대규모 프로젝트에서는 클래스를 개별 파일로 정의하고, 필요한 곳에서 import하여 사용하는 방식이 일반적이다.

예를 들어, transaction.sv 파일에서 트랜잭션 클래스를 정의하고,
다른 파일에서 이를 import하여 사용하는 방식이다.

// transaction.sv
class Transaction;
    // 트랜잭션 관련 코드
endclass
// testbench.sv
import transaction::*;

module testbench;
    Transaction t;
    initial begin
        t = new();
        // 테스트 코드 실행
    end
endmodule

이 방식은 코드의 재사용성을 극대화하고 유지보수성을 향상시키는 데 도움이 된다.


5. SystemVerilog LRM 참고

SystemVerilog LRM(Language Reference Manual)에서는 패키지 및 클래스 정의에 대한 추가적인 세부 사항을 제공한다.
패키지를 활용하면, 클래스뿐만 아니라 함수, 변수, 타입 정의 등을 함께 관리할 수 있어 더욱 효과적이다.


결론

SystemVerilog에서 클래스를 어디에 정의할지 결정하는 것은 코드의 유지보수성과 테스트벤치 구조에 큰 영향을 미친다.
적절한 위치에 클래스를 정의하면 코드를 더욱 모듈화하고 재사용성을 극대화할 수 있다.

  • 프로그램 블록(program block): 테스트 코드와 함께 클래스를 포함
  • 패키지(package): 관련된 클래스를 그룹화하여 독립적인 컴파일 가능
  • 모듈(module): 가능하지만 일반적으로 권장되지 않음
  • 독립적인 파일(Standalone Class File): 코드 재사용성을 극대화할 때 유용

SystemVerilog LRM을 참고하여 프로젝트에 적합한 클래스를 정의하는 것이 중요하다.

 

 

 

 

 

Chris Spear 저자님의

SystemVerilog For Verification

A Guide to Learning the Testbench Language Features

내용을 기본으로 작성되었습니다.