[SystemVerilog 실무] 3. 절차적 블록과 제어 구조 이해하기
본문 바로가기
지식 공유/SystemVerilog

[SystemVerilog 실무] 3. 절차적 블록과 제어 구조 이해하기

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

SystemVerilog 설계 및 검증 흐름에서 가장 기본이자 중요한 개념 중 하나는 **절차적 블록(Procedural Blocks)**과 **제어 구조(Control Structures)**입니다. 본 포스트에서는 이를 중심으로 실무에 바로 활용 가능한 문법과 구조를 정리합니다.


절차적 블록 (Procedural Blocks)

SystemVerilog의 절차적 블록은 하드웨어의 **동작(behavioral)**을 기술하는 핵심 구조입니다.

  • initial
    • 시뮬레이션 시작 시 단 한 번만 실행
    • testbench setup 등 초기화 용도에 자주 사용
  • final
    • 시뮬레이션 종료 직전에 한 번 실행
    • 로그 출력이나 리소스 정리에 사용
  • always
    • 조건 없이 무한히 반복 실행
    • 순차 논리 설계의 기본 구조

SystemVerilog는 다음과 같이 설계 목적에 맞게 세분화된 always 블록을 제공합니다:

  • always_comb: 조합 논리 (combinational logic) 전용
  • always_latch: 래치 생성을 위한 블록
  • always_ff: 동기식 플립플롭(FF) 생성용


태스크(Task)와 함수(Function)

코드의 재사용성과 모듈화를 위한 구조입니다.

  • task
    • 타이밍 제어(예: @posedge clk, #5) 가능
    • 여러 개의 출력 인자 지원
    • 반환값 없음 → 프로시저 용도에 적합
  • function
    • 반드시 하나의 값을 반환해야 함
    • 타이밍 제어 불가
    • 빠른 연산이나 조합 논리 표현에 적합

✔︎ 인자 전달 방식

  • Call by Value: 인자의 복사본을 전달 (원본 불변)
  • Call by Reference: 참조(주소)를 전달하여 원본 변경 가능
    const 키워드로 원본 보호 가능
function int add(int a, int b);
    return a + b;
endfunction

task modify(ref int a);
    a = a + 10;
endtask

 


선택 제어문 (Selection Statements)

  • if-else
    • 단일/복합 조건 분기 처리에 유용
  • case
    • 다중 조건 분기 시 가독성 좋음
if (a > b)
    do_something();
else
    do_something_else();

case (sel)
    2'b00: out = x;
    2'b01: out = y;
    default: out = z;
endcase

 

구문 비트 값 처리 x와 ? 처리 주요 특징
case 정확한 일치만 허용 x?는 일치하지 않는 값으로 취급 모든 값이 정확히 일치해야 함.
casex x?모든 값과 일치 (와일드카드) x?어떤 값에도 일치 (와일드카드) x?를 와일드카드로 처리하여 유연한 매칭
casez z0 또는 1로 취급, x?는 와일드카드 z0 또는 1로 취급, ?모든 값과 일치 z 0과 1로 처리되고, ?모든 값에 일치

 


반복 제어문 (Loop Statements)

SystemVerilog는 다양한 반복 구조를 지원합니다.

  • for / while / do...while : 일반적인 루프 제어
  • repeat(n) : 명확한 반복 횟수 지정
  • foreach : 배열, 구조체 등 컬렉션에 대해 순회
foreach (array[i])
    $display("array[%0d] = %0d", i, array[i]);

 


블로킹 vs 넌블로킹 할당

  • = (Blocking)
    • 실행 순서를 보장
  • <= (Non-blocking)
    • 병렬적인 시뮬레이션 동작 반영

조합 논리에서는 블로킹을, 순차 논리(FF 기반 설계)에서는 넌블로킹 할당을 사용하는 것이 일반적인 베스트 프랙티스입니다.

 


타이밍 제어

  • 지연 제어 (#): 고정 시간 지연
    #5 a = b;
  • 이벤트 제어 (@): 특정 조건에서 대기
    @(posedge clk)
  • wait: 조건 만족 시까지 대기
    wait (ready == 1);


Named Block과 disable

begin : my_block
    // 내용
end

disable my_block;
  • 블록에 이름을 부여하고, 특정 블록을 비동기적으로 종료 가능


Event & Sequence

  • event 변수
    • ->ev;로 트리거, @ev로 대기

  • sequence
    • 여러 이벤트를 시퀀스화 하여 Assertion 등에 활용
sequence my_seq;
    @(posedge clk) a ##1 b ##1 c;
endsequence

 

 


FSM (Finite State Machine) 코딩 스타일

  • FSM (Finite State Machine, 유한 상태 기계)란?
    • FSM(유한 상태 기계)은 정해진 유한한 개수의 상태를 가지며, 입력에 따라 상태가 변하고 특정 동작을 수행하는 디지털 논리 설계 개념
  • FSM의 주요 구성 요소
    1. 상태(State): 시스템이 특정 시점에서 가지고 있는 상태
    2. 입력(Input): 외부에서 주어지는 신호 또는 이벤트
    3. 전이(Transition): 입력에 따라 상태가 변하는 과정

 

유형 출력 결정 방식 장점 단점

Moore 현재 상태만 안정성, 단순 반응 속도 느림
Mealy 상태 + 입력 빠른 반응 글리치 발생 가능성

 

 

 

 

SystemVerilog는 enum을 활용한 상태 표현으로 FSM 설계를 간결하게 할 수 있습니다.

 

 

 

반응형

댓글