지식 공유/SystemVerilog
[SystemVerilog 실무] 6. SystemVerilog OOP: 캡슐화, 상속, 다형성
긍수저
2025. 5. 10. 13:36
반응형
SystemVerilog는 기존 Verilog의 기능을 확장하여 객체지향 프로그래밍(Object-Oriented Programming, OOP) 개념을 지원합니다. 이를 통해 코드의 재사용성, 유지보수성, 모듈화가 한층 향상됩니다. 본 포스트에서는 OOP의 핵심 개념인 캡슐화(Encapsulation), 상속(Inheritance), **다형성(Polymorphism)**에 대해 SystemVerilog 관점에서 설명합니다.
OOP 개요
- OOP는 클래스를 기반으로 한 설계 방식을 제공하여, 코드 구조의 체계화를 돕습니다.
- 디버깅과 유지보수를 용이하게 하며, 기능의 확장성을 제공합니다.
캡슐화 (Encapsulation)
캡슐화는 데이터와 해당 데이터를 조작하는 메서드를 하나의 클래스로 묶는 개념입니다.
- 객체 내부의 데이터는 외부에서 직접 접근할 수 없도록 제한됩니다.
- 접근 제어자를 사용하여 데이터 보호 범위를 설정합니다:
- local: 클래스 내부에서만 접근 가능
- protected: 해당 클래스와 서브클래스에서 접근 가능
const 변수
- 객체 내부에서 수정이 불가능한 변수를 선언할 때 사용
- 초기화 이후 값 변경이 불가능하여 안정적인 코드 작성 가능
- 특징:
- rand 변수와 함께 사용 불가 (랜덤화 불가)
- static const 변수 선언 가능
상속 (Inheritance)
상속은 기존 클래스를 기반으로 새로운 클래스를 정의하는 기능입니다.
- extends 키워드를 사용하여 부모 클래스를 확장합니다.
- 주요 이점:
- 기능 확장: 기존 코드 재사용 + 새로운 기능 추가 가능
- 유지보수성: 중복 코드 최소화
- 다형성 활용 가능
예시 클래스 구조
다형성 (Polymorphism)
다형성은 공통된 인터페이스를 통해 서로 다른 객체를 동일한 방식으로 처리할 수 있도록 하는 기능입니다.
- 런타임 시점에 적절한 메서드가 호출되며, 이를 동적 디스패치라 합니다.
- 부모 클래스는 virtual 메서드를 제공하고, 자식 클래스는 이를 override하여 구현합니다.
Virtual Class & Pure Virtual Function
- virtual class: 직접 인스턴스화할 수 없는 클래스 (추상 클래스)
- pure virtual function: 자식 클래스에서 반드시 구현해야 하는 함수
virtual class MyBaseClass;
pure virtual function int getValue();
endclass
고급 OOP 개념
Parameterized Class
- 클래스의 타입이나 크기를 파라미터화하여 재사용성을 극대화
- #(...) 구문을 통해 다양한 인스턴스를 생성할 수 있음
class FIFO #(parameter WIDTH = 8);
bit [WIDTH-1:0] data;
endclass
Pre-defined Class (Forward Declaration)
- typedef class로 클래스를 미리 선언하면 순환 참조 문제를 해결할 수 있음
- 파라미터화된 클래스에도 typedef를 적용하여 가독성 향상 가능
struct vs class 사용 기준
- struct: 간단한 데이터 묶음, 고정된 크기, 동적 행동 없음
- 예: 레지스터 맵, 고정된 버스 신호 묶음
- class: 복잡한 동작, 상속/다형성/동적 생성 필요 시
- 예: 트랜잭션 객체, 시뮬레이션 모델
특성 | Struct | Class |
용도 | 간단한 데이터 집합을 표현 | 동적 객체 및 복잡한 행동을 정의 |
메모리 할당 | 고정된 크기의 메모리 | 동적 메모리 할당 가능 (힙 영역) |
데이터 전달 | 값 복사 (값을 그대로 전달) | 참조 복사 (참조를 통해 전달) |
상속 및 다형성 | 지원하지 않음 | 상속, 다형성, 캡슐화 등을 지원 |
동작 정의 | 함수나 메소드가 없으며, 데이터만 포함 | 메소드와 함수 포함, 동적 행동 구현 가능 |
크기 | 고정 크기 | 크기와 구조가 유동적이며, 동적으로 변경 가능 |
사용 예시 | 간단한 데이터 묶음, 레지스터 집합, 구조적 데이터 | 객체 지향 프로그래밍, 동적 객체 및 복잡한 모델링 |
Deep Talk: Verilog Compile 지시어 정리
SystemVerilog에서는 코드의 재사용성과 시뮬레이션 설정을 위해 **컴파일 지시어(compiler directive)**를 사용합니다. 이들은 ` (backtick) 기호로 시작하며, 시뮬레이션 환경 구성에 중요한 역할을 합니다.
timescale 지시어
- 형식: `timescale <시간 단위> / <정밀도>
- 목적: 시뮬레이션의 시간 단위와 정밀도를 설정합니다.
- 예: `timescale 1ns / 1ps
- 시간 단위: 1ns (delay 계산 기본 단위)
- 정밀도: 1ps (최소 시간 분해능)
- 예: `timescale 1ns / 1ps
include 지시어
- 형식: `include "filename.sv"
- 목적: 외부 파일을 현재 파일에 포함시킵니다.
- 공통 매크로 정의, 파라미터, 인터페이스 등을 여러 파일에서 공유 가능
- 예: `include "uvm_macros.svh"
define 지시어
- 형식: `define NAME value
- 목적: 매크로를 정의하여 코드 반복을 줄이고, 가독성을 높입니다.
- 사용 예:
`define DATA_WIDTH 32
module my_module;
logic [`DATA_WIDTH-1:0] data;
endmodule
이 지시어들은 단순해 보이지만, 코드 관리, 시뮬레이션 설정, 환경 구성에 있어 핵심적인 역할을 합니다. 특히 large-scale DV 환경에서는 define과 include의 활용도가 매우 높습니다.
반응형