반응형
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의 자료구조는 단순히 문법 그 이상입니다. 적절한 구조를 선택하고 활용하는 것이 효율적이고 견고한 검증 환경을 만드는 핵심입니다.
반응형
'지식 공유 > SystemVerilog' 카테고리의 다른 글
[SystemVerilog 실무] 7. 랜덤 테스트와 Constraints 기초 (0) | 2025.05.10 |
---|---|
[SystemVerilog 실무] 6. SystemVerilog OOP: 캡슐화, 상속, 다형성 (0) | 2025.05.10 |
[SystemVerilog 실무] 5. SystemVerilog 클래스 기초 완전정복 (0) | 2025.05.10 |
[SystemVerilog 실무] 4. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
[SystemVerilog 실무] 3. 절차적 블록과 제어 구조 이해하기 (0) | 2025.05.10 |
[SystemVerilog 실무] 1. 데이터 타입과 연산자 완전 정복 (0) | 2025.05.05 |
댓글