UVM

[UVM] super란? | 상위 클래스 메소드 호출, 상위 클래스의 생성자 호출

wolleyneerg 2024. 10. 26. 15:45
반응형

 

UVM에서 super란?

super는 UVM 및 SystemVerilog에서 상위 클래스의 메서드 생성자를 호출하기 위해 사용되는 키워드입니다. 상속 구조에서 상위 클래스의 동작을 그대로 유지하면서 추가적인 기능을 구현하는 데 유용합니다. 이를 통해 테스트벤치의 유연성을 확보하고, 코드 재사용성을 높일 수 있습니다.

1. super의 역할

super는 하위 클래스에서 상위 클래스의 메서드를 호출하여, 상위 클래스의 기본 동작을 유지하면서 확장된 기능을 구현하도록 돕습니다. 이 기능을 활용하면 테스트 환경을 유연하게 설정할 수 있어, 재사용 가능한 코드를 작성하는 데 유리합니다.

2. super가 실행되는 방식

a) 상위 클래스의 메서드 호출 
super는 상속받은 클래스에서 상위 클래스의 메서드를 호출할 때 사용됩니다. 만약 하위 클래스에서 상위 클래스의 메서드를 오버라이드했더라도, super를 사용하여 상위 클래스의 오리지널 메서드를 실행할 수 있습니다.

 

class base;
  function void initialize();
    $display("Base class initialization");
  endfunction
endclass

class derived extends base;
  function void initialize();
    super.initialize(); // 상위 클래스의 기본 초기화 작업 유지
    $display("Derived class additional initialization");
  endfunction
endclass

위 코드에서 super.display()는 상위 클래스인 base의 display() 함수를 호출합니다.
따라서, 실행 결과는 Base class display와 Derived class display가 출력됩니다.

b) 상위 클래스의 생성자 호출
생성자에서 super를 사용하면 상위 클래스의 생성자를 명시적으로 호출할 수 있습니다. 하위 클래스에서 추가적인 초기화를 진행하면서, 상위 클래스의 초기화도 유지하는 경우 유용합니다.

class base;
  int base_val;
  function new();
    base_val = 10; // 상위 클래스의 초기화 작업
    $display("Base class constructor");
  endfunction
endclass

class derived extends base;
  function new();
    super.new(); // 상위 클래스의 초기화 작업을 포함
    $display("Derived class constructor");
  endfunction
endclass

 

위 예제에서 super.new()는 상위 클래스 base의 생성자를 호출하고, 그 후 하위 클래스 derived의 생성자가 실행됩니다.
따라서 생성자 호출 순서는 Base class constructor  Derived class constructor입니다.

두 가지 사용법의 차이와 요약

  • 상위 클래스의 메서드 호출: 특정 기능(예: 함수)을 상속받아 추가적인 기능을 덧붙이고 싶을 때 사용.
  • 상위 클래스의 생성자 호출: 객체 생성 시 상위 클래스의 초기화 작업이 필요할 때 사용하며, 상속 관계를 유지하기 위한 필수적 호출.

따라서, 기능을 확장하고 싶다면 메서드 호출에서 super를 사용하고, 객체 초기화가 필요하다면 생성자 호출에서 super를 사용하는 것이 적합합니다.

 

3. super를 사용할 때 주의할 점

  • 상위 클래스의 동작을 유지하고자 할 때만 super를 사용합니다. 만약 상위 클래스의 동작을 완전히 대체하고자 한다면 super를 호출할 필요가 없습니다.
  • 다중 상속이 불가능한 SystemVerilog 특성 super는 가장 가까운 상위 클래스의 메서드만 참조합니다.
  • 상속 구조에 대한 이해가 중요합니다. 잘못된 클래스에서 super를 호출하면 원하지 않는 상위 클래스의 메서드가 실행될 수 있습니다.

 

4. super 사용의 장점

  • 코드 재사용성: 상위 클래스에서 구현된 동작을 유지하면서도 확장할 수 있어 코드 중복을 줄입니다.
  • 객체 일관성: 상위 클래스에서의 초기화 및 설정을 그대로 가져가므로 상속받은 객체의 일관성을 유지할 수 있습니다.
  • 테스트벤치의 유연성: 상위 클래스의 기능을 유지하며 하위 클래스에서 다양한 추가 동작을 구현할 수 있어, 복잡한 테스트 환경에서도 쉽게 수정 및 확장이 가능합니다.

결론

super는 상속 구조에서 상위 클래스의 동작을 재사용하거나 확장하는 데 중요한 역할을 합니다. 코드의 유연성과 재사용성을 높여 주기 때문에, 복잡한 테스트 환경을 구축하거나 기존 코드의 동작을 유지하면서 새로운 기능을 추가하고자 할 때 유용합니다. SystemVerilog에서 상속 관계를 잘 활용하여 효과적으로 super를 사용하는 것이 중요합니다.

반응형