지식 공유/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 (최소 시간 분해능)


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의 활용도가 매우 높습니다.

반응형