지노랩 /JinoLab
[SystemVerilog] 2.6 연관 배열 (Associative Arrays) 본문
[SystemVerilog] 2.6 연관 배열 (Associative Arrays)
지노랩/JinoLab 2025. 2. 22. 13:16연관 배열(Associative Array)은 SystemVerilog에서 제공하는 데이터 구조 중 하나로, 큰 메모리 공간을 효율적으로 관리할 수 있도록 설계되었다. 연관 배열은 기존의 동적 배열과 비교했을 때, 대용량 데이터를 저장할 필요 없이 필요한 경우에만 메모리를 할당하는 방식으로 동작한다.
2.6.1 연관 배열의 개념
동적 배열은 실행 중 크기를 변경할 수 있는 유연성을 제공하지만, 시스템에서 실제로 사용할지 여부와 관계없이 특정 크기의 메모리를 미리 할당해야 한다. 그러나, 연관 배열을 사용하면 특정 인덱스에 접근할 때만 메모리가 할당되므로, 수백만 개의 메모리 공간을 가진 모델을 다룰 때도 불필요한 메모리 낭비를 방지할 수 있다.
예를 들어, 프로세서를 모델링하는 경우, 실행 중 특정 메모리 위치만 참조하는 경우가 많다. 연관 배열을 사용하면 미리 모든 주소 공간을 초기화할 필요 없이, 필요한 주소에 접근할 때만 메모리를 동적으로 할당할 수 있다.
2.6.2 연관 배열 선언 및 초기화
연관 배열은 와일드카드 인덱스 [*]를 사용하여 선언된다. 이는 정수형 인덱스를 사용할 수도 있고, 문자열을 키로 사용하는 것도 가능하다.
logic [63:0] assoc[*], idx = 1;
// 널리 퍼진 값들을 초기화
repeat (64) begin
assoc[idx] = idx;
idx = idx << 1;
end
위 코드에서 assoc[*]는 64비트 값을 저장하는 연관 배열을 의미한다. idx 변수를 이용하여 assoc 배열에 값을 저장하고, 인덱스 값을 왼쪽으로 쉬프트하면서 값을 배정한다. 즉, 1, 2, 4, 8, 16과 같이 2의 거듭제곱 형태로 저장되게 된다.
2.6.3 연관 배열 탐색 및 순회
연관 배열의 인덱스는 연속적이지 않기 때문에 foreach 문을 이용하여 배열을 순회해야 한다.
foreach (assoc[i])
$display("assoc[%h] = %h", i, assoc[i]);
또한, first() 및 next() 함수를 활용하면, 연관 배열에서 첫 번째 요소부터 마지막 요소까지 순차적으로 접근할 수도 있다.
if (assoc.first(idx)) begin
do begin
$display("assoc[%h] = %h", idx, assoc[idx]);
end while (assoc.next(idx));
end
위 코드는 first()를 통해 가장 작은 인덱스의 값을 가져오고, next()를 통해 다음 인덱스로 이동하면서 배열의 모든 요소를 출력한다.
2.6.4 연관 배열 요소 삭제
연관 배열의 특정 요소를 삭제하려면 delete() 함수를 사용할 수 있다.
assoc.first(idx);
assoc.delete(idx);
이 코드는 연관 배열에서 첫 번째 요소를 찾아 삭제하는 방식이다. 삭제된 요소는 더 이상 접근할 수 없으며, 메모리가 자동으로 해제된다.
2.6.5 문자열 인덱스를 활용한 연관 배열
연관 배열은 정수뿐만 아니라 문자열을 인덱스로 사용할 수도 있다. 이는 Perl의 해시(Hash) 테이블과 유사한 방식이다. 예를 들어, 파일에서 읽어온 데이터를 연관 배열에 저장하는 방식은 다음과 같다.
int switch[string], min_address, max_address;
initial begin
int i, r, file;
string s;
file = $fopen("switch.txt", "r");
while (! $feof(file)) begin
r = $fscanf(file, "%d %s", i, s);
switch[s] = i;
end
$fclose(file);
// 최소 주소값 가져오기
min_address = switch["min_address"];
// 최대 주소값 가져오기 (기본값: 1000)
if (switch.exists("max_address"))
max_address = switch["max_address"];
else
max_address = 1000;
end
위 코드에서 switch[string] 배열은 문자열을 인덱스로 하여 값을 저장하는 연관 배열이다. 파일에서 값을 읽어오고, "min_address"와 "max_address" 같은 키 값을 이용해 데이터를 검색할 수 있다.
2.6.6 연관 배열의 저장 방식
연관 배열은 시뮬레이터에서 트리 구조로 저장된다. 이는 일반적인 동적 배열보다 추가적인 오버헤드가 발생하지만, 매우 넓은 주소 공간을 다룰 때 상당한 메모리 절약 효과를 제공한다. 예를 들어, 32비트 또는 64비트 주소를 인덱스로 사용하는 경우, 기존의 고정 크기 배열보다 연관 배열이 훨씬 효율적이다.
Chris Spear 저자님의
SystemVerilog For Verification
A Guide to Learning the Testbench Language Features
내용을 기본으로 작성되었습니다.
'SystemVerilog검증 > 2. Data Type' 카테고리의 다른 글
[SystemVerilog] 2.8 배열 연산 메서드 (0) | 2025.02.23 |
---|---|
[SystemVerilog] 2.7 연결 리스트 (Linked Lists) (0) | 2025.02.23 |
[SystemVerilog] 2.5 큐(Queues) - SystemVerilog 검증에서의 활용 (0) | 2025.02.22 |
[SystemVerilog] 2.4 동적 배열 (Dynamic Arrays) - SystemVerilog 검증에서의 활용 (0) | 2025.02.22 |
[SystemVerilog] 2.3 고정 크기 배열 (Fixed-Size Arrays) (0) | 2025.02.22 |