지노랩 /JinoLab

[SystemVerilog] 4.16 Public vs. Private 본문

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

[SystemVerilog] 4.16 Public vs. Private

지노랩/JinoLab 2025. 3. 1. 09:25

객체지향 프로그래밍(OOP)의 핵심 개념 중 하나는 데이터와 관련된 루틴을 클래스 내부로 캡슐화(encapsulation)하는 것이다. 일반적으로 데이터는 기본적으로 비공개(private)로 유지되며, 이를 통해 한 클래스가 다른 클래스의 내부 데이터에 직접 접근하는 것을 방지할 수 있다. 대신, 클래스는 데이터에 접근하고 수정할 수 있는 접근자(accessor) 루틴을 제공하여 데이터를 제어할 수 있도록 한다.

이 방식은 클래스의 내부 구현을 변경하더라도 사용자에게 영향을 주지 않게 하는 장점이 있다. 예를 들어, 그래픽 패키지에서 좌표계를 데카르트(Cartesian) 좌표에서 극(polar) 좌표로 변경한다고 해도, 사용자가 동일한 인터페이스를 통해 접근할 수 있도록 하면 프로그램의 기능적인 변화 없이도 내부 구현을 변경할 수 있다.


BusTran 클래스와 데이터 접근

예제로 BusTran 클래스를 생각해보자. 이 클래스에는 페이로드(payload)와 CRC(순환 중복 검사, Cyclic Redundancy Check)가 포함되어 있으며, 하드웨어는 CRC를 통해 오류를 감지할 수 있다.

일반적인 OOP 방식에서는 데이터 무결성을 유지하기 위해 특정 변수를 변경할 때, 다른 관련 변수도 자동으로 업데이트되도록 루틴을 만들어야 한다. 즉, 페이로드 값을 설정할 때 CRC도 함께 설정하도록 설계해야 한다. 이렇게 하면 객체의 데이터가 항상 올바른 값으로 유지될 수 있다.


테스트벤치와 OOP의 차이점

하지만 테스트벤치는 일반적인 소프트웨어 프로그램(예: 웹 브라우저, 워드 프로세서)과는 다르다.
테스트벤치는 오히려 오류를 생성해야 한다. 즉, 하드웨어가 오류에 어떻게 반응하는지 테스트하기 위해 잘못된 CRC 값을 강제로 설정해야 하는 경우가 있다.

이러한 요구 사항 때문에 OOP의 일반적인 원칙(즉, 데이터를 보호하기 위해 변수를 private으로 설정하는 것)이 테스트벤치 설계에서는 적절하지 않을 수도 있다.
따라서 SystemVerilog에서는 데이터의 가시성(visibility)을 조정하는 것이 중요하다.


SystemVerilog에서의 가시성 설정

C++이나 Java와 같은 객체지향 언어에서는 변수와 루틴의 접근 수준을 직접 지정할 수 있다. 기본적으로 모든 변수는 private으로 설정되며, 필요할 경우 public 또는 protected로 변경해야 한다.

그러나 SystemVerilog에서는 기본적으로 모든 것이 public이며, 별도로 private으로 설정하지 않는 이상 자유롭게 접근이 가능하다.
이는 테스트벤치 설계에서 데이터의 직접적인 제어를 가능하게 하기 위해서다.

예를 들어, CRC 값을 public으로 설정하면 하드웨어의 오류 검출 기능을 테스트하기 위해 임의의 잘못된 CRC 값을 쉽게 삽입할 수 있다.
반면, CRC가 private으로 설정되어 있다면, 잘못된 값을 주입하기 위해 우회적인 방법을 사용해야 하고, 이로 인해 더 많은 코드가 필요하며 테스트벤치가 복잡해질 수 있다.


SystemVerilog 테스트벤치 설계의 접근 방식

SystemVerilog에서는 일반적으로 public 접근 방식을 유지하는 것이 좋다.
이렇게 하면 DUT(Device Under Test, 테스트 대상 장치)의 동작을 직접적으로 제어할 수 있으며, 테스트의 유연성이 증가한다.

즉, 테스트 환경에서는 장기적인 소프트웨어 안정성보다 DUT 제어가 더 중요하다.
예를 들어, CRC가 private이라면 테스트벤치에서 오류를 삽입하기 어렵지만, public으로 설정하면 쉽게 조작할 수 있다.
이러한 이유로, SystemVerilog에서는 기본적으로 public 접근 방식을 사용하고, 필요한 경우에만 private을 적용하는 것이 일반적이다.

 

 

 

 

Chris Spear 저자님의

SystemVerilog For Verification

A Guide to Learning the Testbench Language Features

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