Study/FPGA

[FPGA] 07 - 파이프라인 Pipeline 개념과 예제

도엔 2025. 3. 8. 16:16
728x90

1. Pipeline이란?

  1. 기본 개념
    • 데이터의 출력이 다음 단계의 입력으로 연결되는 연속적인 연산 구조를 의미한다.
    • 각 단계(stage) 사이에는 데이터를 저장하는 버퍼(Register, Flip-Flop)가 사용될 수 있음
    • 하드웨어에서 데이터는 클록(Cycle)과 동기화되어 흐름을 유지함
  2. 파이프라인의 필요성
    • 성능 향상: 연산을 병렬적으로 수행하여 처리 속도를 증가시킴
    • Throughput 증가: 각 Cycle마다 새로운 입력을 받아 처리할 수 있음
    • 클럭 동기화: Timing Violation을 방지하고, 안정적인 연산을 수행하기 위해 레지스터 활용


==========𝔼𝔼𝟚𝟚==========

 

2. 주요 용어 개념

  1. Latency
    • 입력값을 넣은 후 결과가 출력될 때까지 걸리는 시간(=Cycle 수)
    • 예제) 3단계 연산(3개의 Register)을 포함한 경우, Latency = 3 Cycles
  2. Throughput
    • 단위 시간(Clock Cycle)당 처리할 수 있는 데이터의 양
    • Throughput = 1 Cycle당 처리 가능한 데이터 개수
    • 파이프라인을 적용하면 매 Cycle마다 새로운 데이터 처리 가능 → Throughput이 증가
  3. 동기화Timing
    • 클럭(Cycle) 내에서 데이터를 정확히 처리하기 위해 Timing 설계가 중요함
    • 비동기식 연산(Asynchronous)에서는 Timing Violation이 발생할 수 있음
    • Pipeline Stages를 추가하여 Timing을 맞추고 처리 속도를 일정하게 유지할 수 있음


==========𝔼𝔼𝟚𝟚==========

 

3. 파이프라인 예제 (Verilog 설계)

3.1 목표

# 8승(Exponentiation by 8)을 계산하는 파이프라인 구조

  • 입력값(Input)을 받아서 곱셈(Multiplication) 후 저장(Register)
  • 3개의 Pipeline Stages를 거쳐 최종 출력(Output)
  • 각 Stage마다 Flip-Flop을 사용하여 데이터 보관

_

3.2 파이프라인을 적용하지 않은 경우 (순차적 연산)

  1. 코드 예제
module no_pipeline (
    input logic clk,
    input logic reset,
    input logic [15:0] in,
    output logic [63:0] out
);
    always_ff @(posedge clk or posedge reset) begin
        if (reset)
            out <= 0;
        else
            out <= in * in * in * in * in * in * in * in; // 8승 계산 (Sequential)
    end
endmodule
  1. 문제점
    • 입력을 받으면 모든 연산을 한 Cycle 내에서 수행해야 함
    • 연산량이 많아지면 Timing Violation 발생 가능성이 커짐
    • 결과가 나오기 전까지 새로운 입력을 받을 수 없음 (Throughput 낮음)

_

3.3 파이프라인 적용 (3단계 구조)

  1. 예제 코드 : 연산을 나누어 수행
module pipeline (
    input logic clk,
    input logic reset,
    input logic [15:0] in,
    output logic [63:0] out
);
    logic [31:0] stage1; // 1단계: 제곱
    logic [47:0] stage2; // 2단계: 4승
    logic [63:0] stage3; // 3단계: 8승

    always_ff @(posedge clk or posedge reset) begin
        if (reset) begin
            stage1 <= 0;
            stage2 <= 0;
            stage3 <= 0;
        end else begin
            stage1 <= in * in;       // 제곱
            stage2 <= stage1 * stage1; // 4승
            stage3 <= stage2 * stage2; // 8승
        end
    end

    assign out = stage3; // 최종 출력
endmodule
  1. 개선된 점
    • Latency: 3 Cycles (입력 후 3 Cycle 뒤에 출력이 나옴)
    • Throughput: 1 Cycle (매 Cycle마다 새로운 입력을 받아 연산 가능)
    • 병렬 처리: 각 Stage에서 다른 데이터를 연산하므로 CPU보다 빠른 연산 가능


==========𝔼𝔼𝟚𝟚==========

 

4. H/W vs S/W 성능 비교

4.1 소프트웨어 연산

  • CPU 기반 루프 연산은 순차적(Sequential)으로 동작
  • 클럭이 3GHz이고, 3 Cycle마다 결과가 나온다고 가정하면 300 Cycles 필요
for (int i = 0; i < 100; i++) {
    output[i] = input[i] * input[i] * input[i] * input[i] * 
                input[i] * input[i] * input[i] * input[i]; // 8승
}
  • 문제점)
    • 연산이 많아질수록 CPU 부하 증가
    • 병렬 연산 불가능 → 처리 속도 낮음

_

4.2 하드웨어 연산 (FPGA)

  • FPGA에서 파이프라인 구조를 적용하면 매 Cycle마다 결과를 출력 가능
  • 클럭이 1GHz인 경우, 102 Cycle 내 연산 종료 (Latency 포함)
  • 연산이 많아질수록 하드웨어의 병렬 처리 능력이 더욱 유리함


==========𝔼𝔼𝟚𝟚==========

 

5. 정리

  • 파이프라인(Pipeline) : 연산을 병렬적으로 수행하여 성능을 향상시키는 기법
  • Latency : 입력 후 결과가 나올 때까지 걸리는 시간 (Cycle 수)
  • Throughput : 단위 시간(Clock Cycle)당 처리할 수 있는 데이터 양
  • 하드웨어는 소프트웨어보다 병렬 연산에 최적화되어 있으며, AI와 같은 대량 연산에 유리함.
  • 파이프라인을 활용하면 매 Cycle마다 데이터를 처리할 수 있어 성능이 향상됨
728x90
반응형