[SystemVerilog 실무] 5. SystemVerilog 클래스 기초 완전정복
본문 바로가기
지식 공유/SystemVerilog

[SystemVerilog 실무] 5. SystemVerilog 클래스 기초 완전정복

by 긍수저 2025. 5. 10.
반응형

SystemVerilog는 객체 지향 개념을 지원하여 복잡한 테스트벤치 구조를 효율적으로 구현할 수 있습니다. 이 글에서는 클래스의 정의부터 상속, 생성자, 정적 변수, 캐스팅까지 SystemVerilog 클래스의 핵심을 정리해보겠습니다.

클래스란 무엇인가?

  • 클래스는 데이터와 메서드를 캡슐화하여 재사용성과 모듈성을 높이는 구조입니다.
  • SystemVerilog는 OOP(Object Oriented Programming)를 지원합니다.
  • 주요 특징:
    • new()를 통한 동적 객체 생성
    • extends를 통한 상속 및 추상화 지원
    • 포인터처럼 동작하는 객체 핸들(Handle) 기반 설계
class Packet;
  int address;
  bit [63:0] data;
endclass

클래스 선언 방식

  • class와 endclass 키워드로 선언
  • 클래스는 두 가지 구성요소를 가집니다:
    • 속성(Properties): 변수
    • 메서드(Methods): 함수 또는 태스크
  • 접근제어자는 protected만 지원되어, 상속받은 클래스까지만 접근 허용

클래스 상속 (Inheritance)

  • extends를 사용해 부모 클래스의 기능을 재사용 가능
  • 상속을 통해 코드 재사용성과 유지보수성 향상
  • 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 사용하거나 확장 가능
class Packet;
  protected int address;
  function void set_address(int addr); address = addr; endfunction
endclass

class ExtendedPacket extends Packet;
  function void update_address(int addr); address = addr + 1; endfunction
endclass

클래스 생성자와 객체 생성

  • new 키워드를 사용해 메모리를 동적으로 할당
  • 핸들을 선언하고, new로 객체를 실제 생성해야 사용 가능
Packet p1;       // 핸들 선언만 함
p1 = new;        // 실제 객체 생성
p1.address = 10; // 멤버 접근

생성자 상속 시 주의사항

  • 부모 클래스에 입력 인자를 요구하는 생성자가 있을 경우,
  • 자식 클래스에서 super.new()를 명시적으로 호출해야 함
class Packet;
  function new(int addr); address = addr; endfunction
endclass

class ExtendedPacket extends Packet;
  function new(int addr); super.new(addr); endfunction
endclass

 

  • ExtendedPacket에는 new()없으므로 기본 생성자가 사용됨
     
  • 기본 생성자는 부모 클래스의 new()자동 호출하는데, Packet에는 new(int addr)존재하여 호출할없음컴파일 에러 발생!
     
  • 해결 방법: 자식 클래스에서 new(int addr)정의하고, super.new(addr) 호출

this 포인터

  • this는 현재 객체 자신을 참조
  • 동일 클래스 내 다른 변수나 메서드 접근에 유용
function void set_address(int addr);
  this.address = addr;
endfunction

Static 속성과 메서드

  • static을 사용하면 클래스 레벨에서 공유되는 변수 및 메서드 정의 가능
  • 객체 없이도 클래스 이름으로 직접 접근 가능
class Counter;
  static int count = 0;
  static function void inc(); count++; endfunction
endclass

Counter::inc(); // 객체 생성 없이 static 메서드 호출

클래스 핸들의 캐스팅

Up-casting

  • 하위 클래스 객체 → 상위 클래스 핸들로 변환
  • 자동으로, 안전하게 수행됨

Down-casting

  • 상위 클래스 핸들 → 하위 클래스 객체로 변환
  • 명시적 캐스팅 필요 (Child'(p) 또는 $cast())

Parent p_handle;
Child  c_handle;

p_handle = c_handle;            // Up-casting
$cast(c_handle, p_handle);      // Down-casting 안전하게 수행
  • $cast()를 사용하면 런타임 타입 체크를 통해 안정성을 높일 수 있음

클래스 멤버 접근 제어 요약

  • SystemVerilog는 private, public 키워드가 없음
  • protected: 클래스 본인 및 하위 클래스만 접근 가능
  • 접근제어자 생략 시 외부에서도 접근 가능 (사실상 public)
  • private 같은 기능을 원하면 local 변수를 활용

 

반응형

댓글