지노랩 /JinoLab
[SystemVerilog] 2.14 문자열(Strings) 본문
SystemVerilog에서는 string 타입을 제공하여 가변 길이 문자열을 저장할 수 있도록 한다.
이는 Verilog에서 reg 변수를 사용하여 문자열을 저장하려던 불편함을 해결해준다.
각 문자열의 개별 문자는 byte 타입이며, 문자열의 인덱스는 0부터 시작하여 N-1까지 번호가 매겨진다.
C 언어와 달리 SystemVerilog 문자열은 널(null) 문자 \0로 끝나지 않는다.
즉, 문자열이 끝날 때 별도의 종료 문자가 포함되지 않으며, \0을 사용해도 무시된다.
또한, 문자열은 동적 메모리 할당(dynamic memory allocation)을 사용하므로 고정된 크기로 선언할 필요가 없으며, 공간이 부족할 걱정 없이 사용할 수 있다.
2.14.1 문자열 처리 함수
SystemVerilog에서는 문자열을 다룰 수 있도록 다양한 내장 함수를 제공한다.
다음은 주요한 문자열 함수들이다.
- getc(N)
- 문자열의 N번째 위치의 문자를 반환한다.
- toupper()
- 대문자로 변환된 문자열을 반환한다.
- tolower()
- 소문자로 변환된 문자열을 반환한다.
- {} (중괄호 연산자)
- 문자열을 연결(Concatenation) 한다.
- putc(M, char)
- 문자열의 M번째 위치에 특정 문자를 기록한다.
- substr(start, end)
- 문자열의 start 위치부터 end 위치까지의 부분 문자열을 반환한다.
2.14.2 문자열 함수 사용 예제
예제 2-39: 문자열 메서드 사용 예시
string s;
initial begin
s = "SystemVerilog";
$display(s.getc(0)); // 출력: 83 ('S')
$display(s.toupper()); // 출력: SYSTEMVERILOG
s = {s, "3.1b"}; // "SystemVerilog3.1b"
s.putc(s.len()-1, "a"); // 마지막 문자 'b' → 'a' 변경
$display(s.substr(2, 5)); // 출력: stem
// 임시 문자열 생성 및 포맷 지정
my_log($psprintf("%s %5d", s, 42));
end
task my_log(string message);
// 로그 메시지 출력
$display("@%0d: %s", $time, message);
endtask
2.14.3 주요 코드 설명
- 문자 추출 (getc(N))
- getc(0)을 호출하면 문자열의 첫 번째 문자('S')가 반환된다.
- $display(s.getc(0)); // 'S' 반환 (아스키 코드 83)
- 대문자 변환 (toupper())
- toupper()을 호출하면 모든 문자가 대문자로 변환된 문자열이 반환된다.
- $display(s.toupper()); // "SYSTEMVERILOG" 반환
- 문자열 연결 ({} 사용)
- {} 연산자를 사용하면 문자열을 이어 붙일 수 있다.
- s = {s, "3.1b"}; // 문자열 연결: "SystemVerilog3.1b"
- 문자 변경 (putc(M, char))
- s.len()-1은 문자열의 마지막 인덱스를 의미하며, 이를 "a"로 변경하였다.
- s.putc(s.len()-1, "a"); // 마지막 문자를 'a'로 변경
- 부분 문자열 추출 (substr(start, end))
- substr(2, 5)는 문자열의 2번째 위치부터 5번째 위치까지의 부분 문자열을 반환한다.
- $display(s.substr(2, 5)); // 출력: "stem"
- 임시 문자열 생성 ($psprintf)
- $psprintf() 함수는 C 언어의 sprintf()와 유사하며, 문자열과 숫자를 조합하여 포맷된 문자열을 생성한다.
- "SystemVerilog3.1a 42" 형태의 문자열이 my_log() 함수로 전달된다.
- my_log($psprintf("%s %5d", s, 42));
2.14.4 $psprintf와 $sformatf 차이점
C 언어에서는 문자열을 다룰 때 임시 문자열을 만들어 결과를 저장해야 하지만,
SystemVerilog에서는 $psprintf()를 활용하면 임시 문자열을 선언하지 않고도 문자열을 동적으로 생성할 수 있다.
- $psprintf()
- 임시 문자열을 생성하여 반환한다.
- 다른 함수에 즉시 전달할 수 있다.
- 예제에서 "SystemVerilog3.1a 42" 문자열을 my_log()에 전달한 방식이 대표적이다.
- $sformatf()
- Verilog-2001에서 도입된 포맷팅 문자열 함수이다.
- $sformatf()는 $sformat() 함수와 달리 임시 문자열을 반환할 수 있다.
2.14.5 SystemVerilog 문자열의 특징과 활용
- 동적 메모리 할당
- SystemVerilog의 string 타입은 가변 길이 문자열을 지원한다.
- 문자열 크기를 사전에 정할 필요가 없으며, 동적으로 확장된다.
- 널(null) 문자 없음
- C 언어와 달리 문자열이 널 문자 \0로 종료되지 않는다.
- 문자열을 다룰 때 별도의 널 문자를 처리할 필요가 없다.
- 강력한 문자열 조작 기능
- getc(), putc(), substr() 등의 문자열 조작 함수가 제공된다.
- 문자열을 대문자(toupper()), 소문자(tolower())로 변환할 수 있다.
- {}를 사용하여 문자열을 쉽게 연결할 수 있다.
- 포맷팅 함수 지원
- $psprintf(), $sformatf()를 이용하여 포맷팅된 문자열을 생성할 수 있다.
- 로그 메시지 출력이나 문자열 조합 시 유용하게 활용된다.
SystemVerilog에서 문자열 처리는 테스트 벤치에서 데이터를 로깅하거나, 파일을 읽고 쓰거나, 문자열을 다룰 때 매우 유용하게 사용될 수 있다.
Chris Spear 저자님의
SystemVerilog For Verification
A Guide to Learning the Testbench Language Features
내용을 기본으로 작성되었습니다.
'SystemVerilog검증 > 2. Data Type' 카테고리의 다른 글
[SystemVerilog] 2.16 Net Types (네트 유형) (0) | 2025.02.23 |
---|---|
[SystemVerilog] 2.15 표현식의 비트 너비(Expression Width) (0) | 2025.02.23 |
[SystemVerilog] 2.13 상수(Constants) (0) | 2025.02.23 |
[SystemVerilog] 2.12 열거형(Enum) 타입 (0) | 2025.02.23 |
[SystemVerilog] 2.11 사용자 정의 구조체 (User-Defined Structures) (0) | 2025.02.23 |