[SystemVerilog 실무] 2. 자료구조와 활용
본문 바로가기
지식 공유/SystemVerilog

[SystemVerilog 실무] 2. 자료구조와 활용

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

SystemVerilog는 단순한 하드웨어 기술 언어를 넘어서 강력한 테스트벤치 언어로 자리잡았습니다. 이 글에서는 Verification에서 자주 사용되는 SystemVerilog의 4가지 주요 배열 타입데이터 조작 기법을 살펴보고, 각 자료구조가 실제 DV 환경에서 어떻게 활용되는지 소개합니다.


1. 배열의 분류와 개념

1-1. Packed vs Unpacked Arrays

  • Packed Array
    • 연속된 비트들로 구성 → 버스나 레지스터 표현에 적합
    • 고정 크기, 비트 단위 연산 가능
    • 예시: bit [2:0][7:0] packed_array; → 3개의 8비트 값

  • Unpacked Array
    • 일반적인 소프트웨어 배열 형태
    • 다양한 타입 포함 가능 (예: 구조체, 클래스)
    • 예시: bit [7:0] unpacked_array [0:2];

 

 

Tip: Packed은 비트 연산 최적화에, Unpacked은 구조화된 데이터 처리에 적합합니다.

 

연산/기능 Packed Array Unpacked Array
$size (크기 확인) 전체 비트 수 반환. 전체 요소의 개수 반환.
ex)$size(packed_array) → Packed 배열의 비트 개수 반환. ex)$size(unpacked_array) → Unpacked 배열의 요소 수 반환.
슬라이싱 (Slicing) 특정 비트 범위를 슬라이싱하여 접근. 특정 인덱스의 요소를 슬라이싱하여 접근.
ex)packed_array[15:8] → 비트 15부터 8까지 추출. ex)unpacked_array[0] → 첫 번째 요소 접근.
값 복사 및 비교 Packed 배열 간 = 연산자로 복사 및 비교 가능. Unpacked 배열 간 = 연산자로 복사 및 비교 가능.
ex)packed_array2 = packed_array1; ex)unpacked_array2 = unpacked_array1;
ex)packed_array1 == packed_array2; (값 비교) ex)unpacked_array1 == unpacked_array2; (값 비교)
'를 이용한 초기화 비트 수준에서 초기화 가능. 전체 배열을 일괄 초기화 가능.
ex)packed_array = '0; → 모든 비트를 0으로 초기화. ex)unpacked_array = '{default: 0}; → 모든 요소를 0으로 초기화.

 

 

Streaming 연산자 활용

 

Packed → Unpacked 변환:

  • << 연산자를 사용하여 Packed 배열을 Unpacked 배열로 분해.
  • 비트 순서를 유지하며 각 요소에 데이터를 나눔.

 

Unpacked → Packed 변환:

  • >> 연산자를 사용하여 Unpacked 배열을 Packed 배열로 병합.
  • Unpacked 배열의 각 요소를 병합하여 Packed 배열 생성.


1-2. Dynamic Arrays

  • 런타임에서 크기 결정, 유연한 메모리 사용
  • 구문: data_type array_name[];
  • 주요 메서드
    • new[size] : 동적 크기 설정
    • size() : 현재 크기 반환
    • delete() : 메모리 해제

활용 예: 테스트 시 다양한 길이의 입력 데이터를 생성할 때 유용합니다.


1-3. Associative Arrays

  • 인덱스로 int, string 등 다양한 타입 사용 가능
  • 구문: data_type array_name[index_type];
  • 주요 메서드
    • exists(index) : 해당 인덱스 존재 여부 확인
    • delete(index) / delete()
    • first(), next(), last() 등 인덱스 순회

실전 활용: 스패어 메모리 검증 등 희소한 주소 접근을 추적할 때 필수입니다.


1-4. Queues

  • FIFO 스타일, 가변 크기
  • 구문: data_type queue_name[$];
  • 주요 메서드
    • push_front(), push_back()
    • pop_front(), pop_back()
    • size()

실전 활용: 모니터링된 트랜잭션을 순차 처리하거나 Scoreboard 비교 대기열로 자주 사용됩니다.


2. 배열 조작 기법: with 구문

다양한 배열에서 요소를 조건에 따라 추출, 정렬, 필터링하는 데 매우 유용한 고급 기능입니다.

  • Find
  • array.find with (item.addr == target_addr);
  • Sort / Min / Max
  • array.sort with (item.timestamp); array.min with (item.data);
  • Unique
  • array.unique with (item.tag);

Tip: Coverage collection이나 예외 상황 분석 시 매우 강력한 도구입니다.


3. 실전 예제: DV 환경에서의 자료구조 활용

Associative Array

  • 시나리오: 메모리 쓰기 트랜잭션을 기록하고, 해당 주소의 읽기 값 비교
  • 장점: 주소값을 키로 사용하여 빠르게 저장/조회 가능
  • 예시
bit [31:0] write_log[int];
write_log[addr] = data;
if (write_log.exists(addr)) begin
  `uvm_info("COMPARE", $sformatf("Read matches Write at %h", addr), UVM_LOW);
end

 

 


Queue

  • 시나리오: Scoreboard에서 입력/출력 트랜잭션 매칭
  • 장점: 순차 처리에 이상적이며, 입력과 출력 타이밍이 불규칙한 경우 유용
  • 예시
transaction q[$];
q.push_back(tr);
transaction expected = q.pop_front();

 

 


마무리: DV에 적합한 자료구조를 선택하라

구조 메모리 관리 사용 시기

Packed Array 고정 버스, 비트 단위 연산
Unpacked Array 고정 복합 구조 저장
Dynamic Array 유동적 다양한 길이 데이터 테스트
Associative Array 유동적 희소 주소 접근 추적
Queue 유동적 트랜잭션 순차 처리

SystemVerilog의 자료구조는 단순히 문법 그 이상입니다. 적절한 구조를 선택하고 활용하는 것이 효율적이고 견고한 검증 환경을 만드는 핵심입니다.

반응형

댓글