반응형
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 변수를 활용
반응형
'지식 공유 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog 실무] 8. Package와 Interface (0) | 2025.05.10 |
---|---|
[SystemVerilog 실무] 7. 랜덤 테스트와 Constraints 기초 (0) | 2025.05.10 |
[SystemVerilog 실무] 6. SystemVerilog OOP: 캡슐화, 상속, 다형성 (0) | 2025.05.10 |
[SystemVerilog 실무] 4. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
[SystemVerilog 실무] 3. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
[SystemVerilog 실무] 2. 자료구조와 활용 (0) | 2025.05.10 |
댓글