7-4. FSM 설계 고급: 파이프라인 기법

1. 파이프라인 기법의 이해와 배경

유한 상태 기계(FSM)는 하드웨어 설계에서 널리 사용되는 중요한 개념입니다. FSM은 상태, 입력, 출력 및 상태 전이 함수로 구성되며, 특정 입력에 따라 상태를 변경하고 출력을 생성합니다. 이러한 특성 때문에 FSM은 디지털 시스템의 제어 로직, 통신 프로토콜, 그리고 데이터 처리 파이프라인의 핵심 요소로 활용됩니다.

그러나 FSM의 성능은 설계에 따라 크게 달라질 수 있습니다. 특히, FSM의 클럭 주기는 시스템의 성능을 결정하는 핵심 요소 중 하나입니다. 클럭 주기가 짧을수록, 즉 FSM이 더 빠르게 상태를 전이할 수 있도록 설계될수록 시스템의 처리량(throughput)은 증가합니다. 그렇다면, FSM의 성능을 향상시키기 위한 효과적인 방법은 무엇일까요?

파이프라인 기법은 FSM의 성능을 향상시키는 강력한 기술 중 하나입니다. 파이프라인은 작업을 여러 단계로 나누어 각 단계를 병렬적으로 처리함으로써 전체적인 처리 시간을 줄이는 방법입니다. 이 기법은 데이터 처리 시스템뿐만 아니라 FSM 설계에도 적용될 수 있습니다.

파이프라인의 핵심 아이디어는 작업을 여러 작은 단계로 분할하고, 각 단계가 동시에 실행될 수 있도록 하는 것입니다. 이러한 병렬 처리를 통해, 전체 작업의 완료 시간을 줄이고 시스템의 처리량을 향상시킬 수 있습니다. FSM 설계에서 파이프라인은 상태 전이와 출력 계산을 여러 단계로 나누어, 각 단계가 독립적으로 작동하도록 설계하는 것을 의미합니다.

파이프라인 개념 설명 뒤, 3-스테이지 파이프라인 구조 다이어그램

2. 파이프라인 기법의 원리

1) 기본 원리

파이프라인 기법은 FSM의 상태 전이 및 출력 계산 과정을 여러 단계로 나누어 각 단계가 독립적으로 실행되도록 하는 방식으로 작동합니다. 각 단계는 클럭 사이클 내에서 완료되도록 설계되며, 이전 단계의 출력을 입력으로 받아 다음 단계에서 처리합니다.

파이프라인의 핵심은 각 단계의 작업이 병렬적으로 수행되도록 설계하는 것입니다. 이는 전체 FSM의 처리량을 향상시키는 데 기여합니다. 예를 들어, 3단계 파이프라인 FSM이 있다고 가정해 보겠습니다. 각 단계는 T 시간 안에 완료될 수 있습니다. 파이프라인을 사용하지 않는 FSM은 전체 작업을 완료하는 데 3T 시간이 걸립니다. 그러나 파이프라인 FSM에서는 각 단계가 동시에 실행되므로, 새로운 작업을 처리하는 데 T 시간만 소요됩니다. 첫 번째 작업이 완료된 후에는 매 클럭 사이클마다 새로운 작업이 완료될 수 있습니다.

2) 파이프라인 단계 분할

파이프라인 설계의 중요한 부분은 FSM의 기능을 적절한 수의 단계로 분할하는 것입니다. 단계의 수는 성능 향상에 직접적인 영향을 미치며, 다음과 같은 요소들을 고려하여 결정합니다.

  • 복잡도: 각 단계의 복잡도는 균형을 이루어야 합니다. 한 단계가 너무 복잡하면, 해당 단계의 클럭 주기가 길어져 전체 성능을 저하시킬 수 있습니다.
  • 레이턴시: 파이프라인은 각 단계에서 지연(latency)을 발생시킵니다. 단계가 많아질수록 레이턴시도 증가하므로, 레이턴시와 처리량 사이의 균형을 유지해야 합니다.
  • 데이터 의존성: 각 단계는 이전 단계의 출력에 의존해야 합니다. 데이터 의존성이 복잡할수록 파이프라인 설계가 어려워집니다.

3) 레지스터 삽입

파이프라인 설계에서 각 단계 사이에는 레지스터를 삽입해야 합니다. 이 레지스터는 각 단계의 출력을 저장하고, 다음 클럭 사이클에 다음 단계로 전달하는 역할을 합니다. 이러한 레지스터를 통해, 각 단계가 독립적으로 작동하고 병렬 처리가 가능해집니다.

레지스터는 또한 각 단계의 타이밍을 동기화하는 역할을 합니다. 각 단계는 클럭 신호에 의해 제어되므로, 레지스터는 각 단계의 출력이 정확한 시간에 다음 단계로 전달되도록 보장합니다.

4) 파이프라인의 장점

파이프라인 기법은 다음과 같은 장점을 제공합니다.

  • 처리량 증가: 파이프라인은 여러 작업을 동시에 처리할 수 있으므로, 시스템의 처리량을 향상시킵니다.
  • 클럭 주파수 향상: 각 단계의 복잡도를 줄여 클럭 주파수를 높일 수 있습니다.
  • 모듈성 향상: 파이프라인은 각 단계를 독립적으로 설계하고 테스트할 수 있도록 하여 모듈성을 향상시킵니다.

3. 파이프라인 FSM 설계 예제

다음은 간단한 3-비트 시퀀스 감지기를 파이프라인 기법을 사용하여 설계하는 예제입니다. 이 시퀀스 감지기는 입력 데이터 스트림에서 "101" 시퀀스를 감지합니다.

1) FSM 설계 (비파이프라인)

파이프라인을 사용하지 않는 기본적인 FSM 설계를 먼저 살펴보겠습니다.

  • 상태: S0 (초기 상태), S1 (1 감지), S2 (10 감지), S3 (101 감지)
  • 입력: data_in (1비트)
  • 출력: match (1비트, 시퀀스 감지 시 1)
module sequence_detector_non_pipeline (
  input  logic clk,
  input  logic rst,
  input  logic data_in,
  output logic match
);

  typedef enum {S0, S1, S2, S3} state_t;
  state_t state, next_state;

  always_ff @(posedge clk) begin
    if (rst)
      state <= S0;
    else
      state <= next_state;
  end

  always_comb begin
    next_state = state;
    match = 0;
    case (state)
      S0: if (data_in) next_state = S1;
      S1: if (data_in) next_state <mark class="highlight"><strong><u> S1; else next_state </u></strong></mark> S2;
      S2: if (data_in) begin next_state <mark class="highlight"><strong><u> S3; match </u></strong></mark> 1; end else next_state = S0;
      S3: begin next_state <mark class="highlight"><strong><u> S1; match </u></strong></mark> 1; end
    endcase
  end

endmodule

이 코드는 data_in 입력을 받아서 현재 상태에 따라 next_state를 결정하고, "101" 시퀀스가 감지되면 match 출력을 1로 설정합니다. 이 FSM은 각 클럭 사이클마다 하나의 상태 전이와 출력 계산을 수행합니다.

2) 파이프라인 FSM 설계

이제 이 시퀀스 감지기를 파이프라인 기법을 사용하여 설계해 보겠습니다. 이 예제에서는 2-단계 파이프라인을 사용합니다.

  • 단계 1: 입력 데이터 수신 및 첫 번째 비트 확인
  • 단계 2: 두 번째 및 세 번째 비트 확인, 매칭 여부 결정
module sequence_detector_pipeline (
  input  logic clk,
  input  logic rst,
  input  logic data_in,
  output logic match
);

  // 단계 1 레지스터
  logic        data_in_reg;
  logic        s1_valid;   // 첫 번째 1 감지 여부
  logic [1:0]  state_reg;

  // 단계 2 레지스터
  logic        s2_valid;   // 10 감지 여부
  logic        match_reg;

  // 상태 정의
  typedef enum {S0, S1, S2, S3} state_t;

  // 1단계: 입력 데이터 수신 및 첫 번째 비트 확인
  always_ff @(posedge clk) begin
    if (rst) begin
      data_in_reg <= 0;
      s1_valid   <= 0;
      state_reg  <= S0;
    end else begin
      data_in_reg <= data_in;
      case(state_reg)
        S0: if (data_in) begin
              state_reg <= S1;
              s1_valid  <= 1;
            end
        S1: if (!data_in) begin
              state_reg <= S2;
            end
        S2: if (data_in) begin
              state_reg <= S3;
            end
        S3: begin
          state_reg <= S1;
        end
        default: state_reg <= S0;
      endcase
    end
  end

  // 2단계: 두 번째 및 세 번째 비트 확인, 매칭 여부 결정
  always_ff @(posedge clk) begin
    if (rst) begin
      s2_valid  <= 0;
      match_reg <= 0;
    end else begin
      case(state_reg)
        S2: if(s1_valid) begin
              s2_valid <= 1;
            end
        S3: begin
          match_reg <= 1;
        end
      endcase
    end
  end

  assign match = match_reg;

endmodule

위 코드에서, data_in_reg, s1_valid, s2_valid, match_reg는 파이프라인 레지스터입니다. state_reg을 사용하여 상태를 저장하고, 각 클럭 사이클마다 다음 상태로 전이합니다. match_reg은 "101" 시퀀스가 감지되었는지를 나타내며, 최종 match 출력으로 사용됩니다.

이 파이프라인 설계는 두 개의 클럭 사이클에 걸쳐 작업을 분산시킵니다. 첫 번째 클럭 사이클에서 data_in을 수신하고 첫 번째 비트를 확인합니다. 두 번째 클럭 사이클에서는 나머지 비트를 확인하고 match 출력을 계산합니다.

파이프라인 FSM 설계 과정 시각화

3) 성능 비교

파이프라인을 사용하지 않는 FSM과 파이프라인 FSM의 성능을 비교해 보겠습니다.

  • 비파이프라인 FSM: 각 클럭 사이클마다 하나의 상태 전이와 출력 계산을 수행합니다. 클럭 주파수는 FSM의 복잡도에 따라 제한됩니다.
  • 파이프라인 FSM: 두 개의 클럭 사이클에 걸쳐 작업을 분산시킵니다. 클럭 주파수는 각 단계의 복잡도에 따라 결정되므로, 일반적으로 비파이프라인 FSM보다 높일 수 있습니다. 또한, 파이프라인 FSM은 매 클럭 사이클마다 새로운 시퀀스를 처리할 수 있으므로, 처리량이 향상됩니다.

이 예제에서는 파이프라인을 사용하여 클럭 주파수를 높이고, 시퀀스 감지기의 처리량을 향상시킬 수 있습니다.

4. State Encoding 기법 비교

FSM의 성능은 상태 코딩(state encoding) 기법에 따라 달라질 수 있습니다. 상태 코딩은 FSM의 각 상태를 이진 코드로 표현하는 방법입니다. 다양한 상태 코딩 기법이 있으며, 각 기법은 하드웨어 리소스 사용량과 성능에 영향을 미칩니다.

1) 이진 코딩 (Binary Encoding)

이진 코딩은 가장 기본적인 상태 코딩 방법으로, 각 상태를 고유한 이진 코드로 표현합니다. 상태의 개수가 n개일 때, ⌈log₂n⌉비트가 필요합니다.

  • 장점: 간단하고 구현하기 쉽습니다.
  • 단점: 그레이 코딩이나 원-핫 인코딩에 비해 글리치 발생 가능성이 높고, 하드웨어 리소스 사용량이 많을 수 있습니다.

2) 그레이 코딩 (Gray Encoding)

그레이 코딩은 인접한 상태 간에 단 하나의 비트만 다른 코딩 방법입니다.

  • 장점: 글리치 발생을 줄여 안정성을 높일 수 있습니다.
  • 단점: 이진 코딩에 비해 상태 전이 로직이 복잡해질 수 있습니다.

3) 원-핫 인코딩 (One-Hot Encoding)

원-핫 인코딩은 각 상태를 하나의 비트만 1로 설정하고, 나머지 비트는 0으로 설정하는 방법입니다. 상태의 개수가 n개일 때, n비트가 필요합니다.

  • 장점: 상태 전이 로직이 간단하고, 디코딩이 필요 없어 빠릅니다.
  • 단점: 하드웨어 리소스 사용량이 가장 많습니다.
특징 이진 코딩 그레이 코딩 원-핫 인코딩
코딩 방법 각 상태를 고유한 이진 코드로 표현 인접한 상태 간에 단 하나의 비트만 다름 각 상태를 하나의 1과 나머지 0으로 표현
비트 수 ⌈log₂n⌉ ⌈log₂n⌉ n
글리치 발생 가능성 높음 발생 가능성 낮음 발생 가능성 낮음
로직 복잡도 낮음 중간 높음
하드웨어 사용량 적음 중간 많음
속도 빠름 빠름 가장 빠름

파이프라인 설계에서는 일반적으로 원-핫 인코딩이 선호될 수 있습니다. 원-핫 인코딩은 각 상태 전이 로직이 간단하여 클럭 주파수를 높이는 데 유리하기 때문입니다. 하지만 하드웨어 리소스 사용량 증가를 고려하여 적절한 상태 코딩 기법을 선택해야 합니다.

5. 주의사항과 트러블슈팅

파이프라인 기법을 사용할 때 몇 가지 주의해야 할 사항이 있습니다.

  • 레이턴시 증가: 파이프라인은 각 단계에서 지연을 발생시키므로, 전체 시스템의 레이턴시가 증가할 수 있습니다.
  • 버블: 파이프라인의 각 단계가 모든 클럭 사이클마다 유효한 데이터를 처리하지 못할 수 있습니다. 이를 "버블"이라고 하며, 성능 저하의 원인이 될 수 있습니다. 버블은 조건 분기, 데이터 의존성 등으로 인해 발생할 수 있습니다.
  • 설계 복잡도: 파이프라인 설계는 비파이프라인 설계보다 복잡할 수 있습니다. 각 단계의 작업, 데이터 의존성, 레지스터 삽입 등을 고려해야 합니다.

트러블슈팅 시에는 다음과 같은 점을 확인해야 합니다.

  • 클럭 주파수: 각 단계의 클럭 주파수를 확인하고, 병목 현상이 발생하는 단계를 파악합니다.
  • 데이터 의존성: 데이터 의존성으로 인해 버블이 발생하는지 확인하고, 이를 해결하기 위한 방법을 모색합니다.
  • 시뮬레이션: 파이프라인 설계를 시뮬레이션하여 정확하게 작동하는지 확인합니다.
  • 하드웨어 사용량: 파이프라인 설계가 하드웨어 리소스를 효율적으로 사용하는지 확인합니다.

6. 결론

파이프라인 기법은 FSM 설계에서 성능을 향상시키는 효과적인 방법입니다. 파이프라인은 작업을 여러 단계로 나누어 각 단계를 병렬적으로 처리함으로써, 시스템의 처리량을 증가시키고 클럭 주파수를 높일 수 있습니다. 파이프라인 설계 시에는 단계 분할, 레지스터 삽입, 상태 코딩 기법 등을 고려해야 하며, 레이턴시 증가, 버블 발생 등의 주의사항을 염두에 두어야 합니다.

파이프라인 FSM 설계는 하드웨어 설계의 중요한 기술이며, 이를 통해 보다 빠르고 효율적인 디지털 시스템을 구현할 수 있습니다.

비슷한 글 추천

Comments (0)

No comments yet. Be the first to comment!