반응형

목차
SystemVerilog에서 task
를 정의할 때 automatic
과 static
의 차이는 단순한 문법 차이가 아니라, 변수의 저장 방식, 재진입성(reentrancy), 그리고 병렬 실행의 안정성에 큰 영향을 줍니다.
기본 개념
구분 | static task (기본값) |
automatic task |
---|---|---|
기본 동작 | 지역 변수는 정적으로 저장됨 | 지역 변수는 스택에 저장됨 |
재진입성 | ❌ 불가능 (동시 호출 시 충돌) | ✅ 가능 (병렬 호출 안전) |
메모리 | 한 번만 할당, 공유됨 | 호출마다 새로 할당 |
사용 예시 | 단순 순차 로직 | 병렬 실행, 재귀 호출 등 |
기본값 | static |
명시적으로 automatic 선언 필요 |
예제
static
task 예시
task count_static();
int i = 0;
i++;
$display("static i = %0d", i);
endtask
이 task를 여러 번 호출해도 i
는 같은 메모리 공간을 사용합니다. 병렬 호출 시 값이 꼬일 수 있습니다.
automatic
task 예시
task automatic count_auto();
int i = 0;
i++;
$display("automatic i = %0d", i);
endtask
호출될 때마다 i
는 새로운 스택 프레임에 생성됩니다. 병렬 호출에도 안전합니다.
병렬 실행에서의 차이
fork
count_static();
count_static();
join
static
task는 두 호출이 같은 변수 i를 공유하므로 예기치 않은 결과 발생 가능.
fork
count_auto();
count_auto();
join
automatic
task는 각각 독립된 i를 사용하므로 안전하게 병렬 실행 가능.
재귀 호출에서의 차이
task automatic factorial(int n, output int result);
if (n <= 1) result = 1;
else begin
int temp;
factorial(n - 1, temp);
result = n * temp;
end
endtask
automatic
이 없으면 재귀 호출 시 같은 변수 공간을 공유해서 오류 발생. 재귀 함수는 반드시 automatic
으로 선언해야 합니다.
언제 어떤 걸 써야 할까?
상황 | 추천 방식 |
---|---|
단순한 순차 호출 | static (기본값) |
병렬 실행 (fork...join ) |
automatic |
재귀 호출 | automatic |
지역 변수 간 간섭 방지 필요 | automatic |
요약
static
은 메모리를 한 번만 할당하고 공유하므로 간단한 로직에 적합합니다. automatic
은 호출마다 독립된 메모리를 사용하므로 병렬성, 재귀성이 필요한 경우에 필수입니다. SystemVerilog에서 task
는 기본적으로 static
입니다.
728x90
반응형
'Language > Verilog & SV' 카테고리의 다른 글
[RTL Design] Clock Divider (2) | 2025.07.11 |
---|---|
[System Verilog] package(패키지)? (0) | 2025.06.24 |
[System Verilog] Mailbox? (0) | 2025.04.09 |
[Verilog & SV] 시프트 연산자(Shift Operators) (0) | 2025.04.09 |
[Verilog & SV] 논리 연산자(Logical Operators) (0) | 2025.04.09 |