지노랩 /JinoLab

[SystemVerilog] 2.10 typedef를 사용한 새로운 데이터 타입 생성 본문

SystemVerilog검증/2. Data Type

[SystemVerilog] 2.10 typedef를 사용한 새로운 데이터 타입 생성

지노랩/JinoLab 2025. 2. 23. 09:33

SystemVerilog에서는 typedef 문을 사용하여 새로운 데이터 타입을 정의할 수 있다.
예를 들어, ALU(Arithmetic Logic Unit)가 8비트, 16비트, 24비트, 32비트와 같이 여러 크기의 피연산자를 지원해야 한다면, Verilog에서는 매크로를 사용하여 각 피연산자 크기를 정의해야 했다.

2.10.1 Verilog에서 매크로를 사용한 사용자 정의 타입

기존 Verilog 스타일에서는 다음과 같이 매크로를 정의하여 데이터를 처리했다.

// Old Verilog style
`define OPSIZE 8
`define OPREG reg [`OPSIZE-1:0]

`OPREG op_a, op_b;

이 방법은 실제로 새로운 타입을 생성하는 것이 아니라 **텍스트 치환(text substitution)**을 수행하는 방식이다. 따라서 코드 유지보수성과 가독성이 떨어질 수 있다.

2.10.2 SystemVerilog에서 typedef를 사용한 사용자 정의 타입

SystemVerilog에서는 typedef 문을 활용하여 보다 직관적인 방식으로 새로운 데이터 타입을 정의할 수 있다.

// New SystemVerilog style
parameter OPSIZE = 8;
typedef reg [OPSIZE-1:0] opreg_t;

opreg_t op_a, op_b;

위 코드에서 typedef를 사용하면 opreg_t라는 새로운 데이터 타입이 정의되며, 이후 변수를 선언할 때 opreg_t를 사용하여 일관성을 유지할 수 있다.

2.10.3 typedef와 parameter의 활용

SystemVerilog에서는 기본적인 데이터 타입 간의 복사가 가능하며, 크기가 맞지 않을 경우 자동으로 확장 또는 잘림(truncation)이 발생한다.
또한, parameter 및 typedef 문을 $root에 정의하여 글로벌(global) 변수로 설정하면, 시뮬레이션 전체에서 사용할 수 있다.

2.10.4 uint 타입 정의

SystemVerilog에서 가장 유용한 타입 중 하나는 부호 없는(unsigned), 2-상태(2-state), 32비트 정수이다.
테스트벤치에서 필드 길이(field length)나 트랜잭션(transaction) 수를 다룰 때 주로 사용된다.

typedef bit [31:0] uint;     // 32비트 부호 없는 2-상태 정수
typedef int unsigned uint;    // 동등한 정의

이와 같이 typedef를 사용하면 보다 직관적인 타입 정의가 가능하며, 향후 유지보수성을 높일 수 있다.

 

 

 

Chris Spear 저자님의

SystemVerilog For Verification

A Guide to Learning the Testbench Language Features

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