지노랩 /JinoLab

[SystemVerilog] 4.6 객체 생성하기 (Creating New Objects in SystemVerilog) 본문

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

[SystemVerilog] 4.6 객체 생성하기 (Creating New Objects in SystemVerilog)

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

4.6 객체 생성 (Creating New Objects)

Verilog와 객체 지향 프로그래밍(OOP) 모두 인스턴스화(Instantiation) 개념을 사용하지만,
그 세부적인 구현 방식에는 차이가 있다.

Verilog에서는 **모듈(Module)**을 인스턴스화할 때, 정적으로(Statically) 선언되며,
네트리스트(Netlist)가 컴파일될 때 인스턴스가 생성된다.

반면, SystemVerilog 클래스(Class)는 런타임(Runtime)에서 필요할 때 동적으로(Dynamically) 생성된다.
즉, 테스트벤치가 실행될 때 클래스 인스턴스를 생성하고 필요에 따라 제거할 수 있다.

Verilog와 SystemVerilog 클래스 인스턴스 차이점

  1. Verilog 인스턴스는 정적(Static), SystemVerilog 인스턴스는 동적(Dynamic)
    • Verilog에서는 하드웨어 구조가 고정되며, 시뮬레이션 중에 변경되지 않는다.
    • SystemVerilog에서는 객체를 계속 생성하고 삭제할 수 있어 더욱 유연한 검증 환경을 제공한다.
  2. Verilog 모듈 인스턴스는 단일 객체만 참조 가능, SystemVerilog 핸들(Handle)은 여러 객체를 참조 가능
    • Verilog에서 인스턴스 이름은 오직 하나의 모듈을 참조한다.
    • SystemVerilog에서는 핸들(Handle)을 이용하여 여러 객체를 동적으로 할당 및 관리할 수 있다.

4.6.1 핸들(Handle)과 new를 이용한 객체 생성

SystemVerilog에서 클래스의 객체를 생성하려면 핸들(Handle)을 선언하고 new를 사용하여 메모리를 할당해야 한다.

예제 4-2: 핸들 선언 및 객체 생성

BusTran b;   // 핸들 선언
b = new;     // BusTran 객체 할당
  • b는 BusTran 객체를 가리키는 **핸들(Handle)**이다.
  • new를 호출하면 메모리가 할당되며, 객체가 초기화된다.
  • 핸들은 기본적으로 null로 초기화되며, new를 호출하지 않으면 사용할 수 없다.

4.6.2 사용자 정의 생성자(Custom Constructor)

객체를 생성할 때, new 함수는 단순히 메모리를 할당하는 역할만 하는 것이 아니라
변수를 초기화하는 기능도 수행한다.

SystemVerilog의 new 동작 방식

  • new를 호출하면 객체를 위한 메모리를 동적으로 할당한다.
  • 클래스 내의 변수를 기본값(Default Value)으로 초기화한다.
    • 2-상태(2-state) 변수: 0
    • 4-상태(4-state) 변수: X
  • 필요하다면 new를 사용자 정의하여 원하는 초기값을 설정할 수 있다.

예제 4-3: 기본 new 함수 사용

class BusTran;
    logic [31:0] addr, crc, data[8];

    function new;
        addr = 3;
        foreach (data[i])
            data[i] = 5;
    endfunction
endclass
  • new 함수에서 addr을 3으로 설정하고, data 배열을 5로 초기화하였다.
  • 하지만 crc 변수는 초기화되지 않으므로 기본값 X가 할당된다.

매개변수를 이용한 유연한 생성자

new 함수에 인자를 추가하면 보다 유연한 객체 생성이 가능하다.

예제 4-4: 매개변수를 활용한 new 함수

class BusTran;
    logic [31:0] addr, crc, data[8];

    function new(logic [31:0] addr=3, d=5);
        this.addr = addr;
        foreach (data[i])
            data[i] = d;
    endfunction
endclass

initial begin
    BusTran b;
    b = new(10);  // addr은 10, data는 기본값 5
end
  • new 함수에서 addr과 data 값을 매개변수(Parameter)로 설정하였다.
  • 객체 생성 시 new(10)을 호출하면 addr=10, data=5로 설정된다.

4.6.3 여러 클래스에서 new 함수 호출하기

클래스가 다른 클래스를 포함하는 경우,
SystemVerilog는 핸들이 가리키는 객체의 타입을 기반으로 올바른 new 함수를 호출한다.

예제 4-5: 올바른 new 함수 호출

class BusTran;
...
endclass : BusTran

class Driver;
    BusTran bt;

    function new();  // Driver의 new 함수
        bt = new();  // BusTran의 new 함수 호출
    endfunction
endclass : Driver
  • Driver 클래스에서 BusTran 객체를 동적으로 생성하였다.
  • bt = new();를 호출할 때, SystemVerilog는 bt가 BusTran 타입임을 인식하고 BusTran의 new 함수를 실행한다.
  • 즉, SystemVerilog는 new 호출 시 핸들의 타입을 기준으로 적절한 생성자를 실행한다.

SystemVerilog에서 new와 객체 생성을 활용하는 방법

  1. 클래스 핸들 선언
    • 핸들은 기본적으로 null로 초기화된다.
  2. new를 사용하여 객체 생성
    • new를 호출해야 객체가 생성되며, 메모리가 할당된다.
  3. 사용자 정의 new 함수 활용
    • new 함수에서 변수 초기화 가능
    • 매개변수를 사용하여 보다 유연한 객체 생성 가능
  4. 클래스 간 객체 생성 관리
    • 한 클래스에서 다른 클래스의 객체를 포함할 경우,
      SystemVerilog는 핸들의 타입을 기준으로 올바른 new 함수를 자동 호출한다.

정리

SystemVerilog에서 객체를 생성하는 과정은 **동적 메모리 할당(Dynamic Memory Allocation)과 객체 초기화(Object Initialization)**로 이루어진다.
이를 통해 유연한 테스트벤치 설계가 가능하며, new 함수를 적절히 활용하면 객체 생성 방식을 더욱 효율적으로 조절할 수 있다.

 

 

 

 

Chris Spear 저자님의

SystemVerilog For Verification

A Guide to Learning the Testbench Language Features

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