지노랩 /JinoLab

[SystemVerilog] 2.14 문자열(Strings) 본문

SystemVerilog검증/2. Data Type

[SystemVerilog] 2.14 문자열(Strings)

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

SystemVerilog에서는 string 타입을 제공하여 가변 길이 문자열을 저장할 수 있도록 한다.
이는 Verilog에서 reg 변수를 사용하여 문자열을 저장하려던 불편함을 해결해준다.
각 문자열의 개별 문자는 byte 타입이며, 문자열의 인덱스는 0부터 시작하여 N-1까지 번호가 매겨진다.

C 언어와 달리 SystemVerilog 문자열은 널(null) 문자 \0로 끝나지 않는다.
즉, 문자열이 끝날 때 별도의 종료 문자가 포함되지 않으며, \0을 사용해도 무시된다.
또한, 문자열은 동적 메모리 할당(dynamic memory allocation)을 사용하므로 고정된 크기로 선언할 필요가 없으며, 공간이 부족할 걱정 없이 사용할 수 있다.


2.14.1 문자열 처리 함수

SystemVerilog에서는 문자열을 다룰 수 있도록 다양한 내장 함수를 제공한다.
다음은 주요한 문자열 함수들이다.

  1. getc(N)
    • 문자열의 N번째 위치의 문자를 반환한다.
  2. toupper()
    • 대문자로 변환된 문자열을 반환한다.
  3. tolower()
    • 소문자로 변환된 문자열을 반환한다.
  4. {} (중괄호 연산자)
    • 문자열을 연결(Concatenation) 한다.
  5. putc(M, char)
    • 문자열의 M번째 위치에 특정 문자를 기록한다.
  6. 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 주요 코드 설명

  1. 문자 추출 (getc(N))
    • getc(0)을 호출하면 문자열의 첫 번째 문자('S')가 반환된다.
  2. $display(s.getc(0)); // 'S' 반환 (아스키 코드 83)
  3. 대문자 변환 (toupper())
    • toupper()을 호출하면 모든 문자가 대문자로 변환된 문자열이 반환된다.
  4. $display(s.toupper()); // "SYSTEMVERILOG" 반환
  5. 문자열 연결 ({} 사용)
    • {} 연산자를 사용하면 문자열을 이어 붙일 수 있다.
  6. s = {s, "3.1b"}; // 문자열 연결: "SystemVerilog3.1b"
  7. 문자 변경 (putc(M, char))
    • s.len()-1은 문자열의 마지막 인덱스를 의미하며, 이를 "a"로 변경하였다.
  8. s.putc(s.len()-1, "a"); // 마지막 문자를 'a'로 변경
  9. 부분 문자열 추출 (substr(start, end))
    • substr(2, 5)는 문자열의 2번째 위치부터 5번째 위치까지의 부분 문자열을 반환한다.
  10. $display(s.substr(2, 5)); // 출력: "stem"
  11. 임시 문자열 생성 ($psprintf)
    • $psprintf() 함수는 C 언어의 sprintf()와 유사하며, 문자열과 숫자를 조합하여 포맷된 문자열을 생성한다.
    • "SystemVerilog3.1a 42" 형태의 문자열이 my_log() 함수로 전달된다.
  12. 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 문자열의 특징과 활용

  1. 동적 메모리 할당
    • SystemVerilog의 string 타입은 가변 길이 문자열을 지원한다.
    • 문자열 크기를 사전에 정할 필요가 없으며, 동적으로 확장된다.
  2. 널(null) 문자 없음
    • C 언어와 달리 문자열이 널 문자 \0로 종료되지 않는다.
    • 문자열을 다룰 때 별도의 널 문자를 처리할 필요가 없다.
  3. 강력한 문자열 조작 기능
    • getc(), putc(), substr() 등의 문자열 조작 함수가 제공된다.
    • 문자열을 대문자(toupper()), 소문자(tolower())로 변환할 수 있다.
    • {}를 사용하여 문자열을 쉽게 연결할 수 있다.
  4. 포맷팅 함수 지원
    • $psprintf(), $sformatf()를 이용하여 포맷팅된 문자열을 생성할 수 있다.
    • 로그 메시지 출력이나 문자열 조합 시 유용하게 활용된다.

SystemVerilog에서 문자열 처리는 테스트 벤치에서 데이터를 로깅하거나, 파일을 읽고 쓰거나, 문자열을 다룰 때 매우 유용하게 사용될 수 있다.

 

 

 

 

Chris Spear 저자님의

SystemVerilog For Verification

A Guide to Learning the Testbench Language Features

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