[SystemVerilog 실무] 1. 데이터 타입과 연산자 완전 정복
본문 바로가기
지식 공유/SystemVerilog

[SystemVerilog 실무] 1. 데이터 타입과 연산자 완전 정복

by 긍수저 2025. 5. 5.
반응형

데이터 타입과 연산자

SystemVerilog는 하드웨어 설계 및 검증을 위한 대표적인 HDL(Hardware Description Language)입니다. 이 시리즈에서는 RTL 설계자와 Design Verification 엔지니어가 반드시 숙지해야 할 SystemVerilog의 핵심 문법과 실무 활용 사례를 다룹니다.
이번 글에서는 데이터 타입과 연산자에 대해 살펴보겠습니다.


1. 데이터 타입 (Data Types)

하드웨어 동작을 정확하게 표현하기 위해 SystemVerilog는 다양한 데이터 타입을 제공합니다.

1.1 정수형 (Integer Types)

SystemVerilog의 정수형 타입은 상태 표현(state), 크기, 부호(signed/unsigned)에 따라 구분됩니다.

타입 상태 표현 크기 기본 부호

bit 2-state 사용자 정의 unsigned
logic 4-state 사용자 정의 unsigned
int 2-state 32-bit signed signed
longint 2-state 64-bit signed signed
shortint 2-state 16-bit signed signed
byte 2-state 8-bit signed signed

참고: 2-state 타입(bit, int 등)을 사용하면 시뮬레이션 성능이 향상됩니다.

Verilog

SystemVerilog

1.2 실수형 및 Void

  • real: C 언어의 double과 유사 (고정밀 실수형)
  • shortreal: C 언어의 float과 유사
  • void: 반환값이 없는 함수에서 사용

SystemVerilog

1.3 문자열 (String)

SystemVerilog의 문자열은 동적으로 크기가 조정되며, 다양한 내장 메서드를 지원합니다.

  • 예: .len(), .toupper(), .tolower()
string s = "SystemVerilog";
$display("%0d", s.len());  // 13 출력

 

Verilog

SystemVerilog

1.4 사용자 정의 타입

복잡한 데이터 구조를 단순화하고 코드 가독성을 향상하기 위해 다양한 사용자 정의 타입을 제공합니다.

  • typedef: 복잡한 타입에 별칭 부여
  • enum: 의미 있는 이름의 상수 집합 정의
  • struct: 여러 필드를 하나의 변수로 묶음

Verilog

SystemVerilog

 


2. 연산자 (Operators)

2.1 대입 연산자

산술, 시프트, 비트 연산을 결합한 다양한 대입 연산자를 지원합니다.

  • 산술: =, +=, -=, *=, /=, %=
  • 시프트: <<=, >>=
  • 비트: &=, |=, ^=

SystemVerilog

 

2.2 결합 및 스트리밍 연산자

  • 결합(concatenation): {a, b}
  • 스트리밍(streaming): {<<{a, b}}

2.3 조건 연산자

result = (sel == 1) ? val1 : val2;

SystemVerilog

2.4 포함 여부 연산자 (Set Membership)

if (a inside {1, 2, 3})
  • 범위 사용 가능: a inside {[10:20]}

SystemVerilog

2.5 연산자 우선순위

괄호( ), 배열 인덱스([])가 가장 높은 우선순위를 가지며, 조건부 연산자(?:)는 왼쪽에서 오른쪽으로 평가됩니다.

SystemVerilog


3. 형 변환 (Casting)

3.1 정적 캐스팅 (Static Casting)

byte'(my_var);
  • 컴파일 시 타입 변환, 런타임 검사 수행하지 않음

3.2 동적 캐스팅 (Dynamic Casting)

if (!$cast(new_obj, old_obj)) 
    $display("변환 실패");
  • 런타임에 타입 변환의 유효성을 검사

3.3 Static Casting vs Dynamic Casting

구분 변환 시점 유효성 검사

Static Casting 컴파일 시점 수행하지 않음
Dynamic Casting 런타임 수행함

 

SystemVerilog

 

 

특징 정적 캐스팅 (Static Casting) 동적 캐스팅 (Dynamic Casting)
사용 시점 호환 가능한 타입 간 컴파일 시 강제 변환. 런타임에서 타입 호환성을 검증.
에러 검출 에러 검사가 없으며, 변환이 올바르다고 가정. 런타임에서 타입 호환성을 확인하여 검증.
성능 컴파일 시 평가되므로 더 빠름. 런타임 검사를 수행하므로 더 느림.
유연성 유연성이 낮으며, 런타임에서 결정할 수 없음. 더 유연하며, 런타임 안전성을 보장.
사용 예시 정수 타입 간 변환. 열거형(enum) 값의 유효성을 확인.

4. 실무 예제

다음은 inside 연산자를 사용하여 값을 범위 내로 랜덤화하는 예제입니다.

assert(std::randomize(a) with {a inside {[10:20]};});

테스트벤치 랜덤화 조건에서 자주 사용됩니다.

반응형

댓글