본문 바로가기
Language/Verilog & SV

[Verilog & SV] task "automatic" vs "static"

by VIR&US 2025. 6. 9.
반응형

목차

 

SystemVerilog에서 task를 정의할 때 automaticstatic의 차이는 단순한 문법 차이가 아니라, 변수의 저장 방식, 재진입성(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
반응형