본문 바로가기
관심사/AI, IOT

AI 칩은 이렇게 만들어진다|NPU 설계와 MAC 연산 구조 쉽게 이해하기

by H.Sol 2025. 11. 13.
반응형

AI 칩 설계

본 글은 NPU(Neural Processing Unit) 설계의 핵심 개념을 한 번에 정리합니다. CPU·GPU와의 차이, MAC 연산의 의미, HDL과 무료 툴체인, 단계별 학습 로드맵까지 노트북으로도 시작 가능한 흐름에 맞춰 설명하고, 각 섹션 끝에는 바로 실행해볼 수 있는 간단한 Verilog HDL 예제를 넣었습니다.

1) AI 칩의 핵심, NPU란 무엇인가?

NPU(Neural Processing Unit)는 인공지능 연산을 고속·저전력으로 처리하기 위해 설계된 전용 반도체입니다. 신경망의 대량 행렬 연산을 병렬로 수행하며, 동일 전력 대비 처리량(Throughput)을 극대화합니다.

// (의사코드) 간단한 NPU 데이터 경로
// 입력 버퍼 → MAC 어레이 → 활성화 → 출력 버퍼
for (tile in input_tiles) {
  load_to_input_buffer(tile);
  for (step in compute_steps) {
    mac_array.multiply_accumulate(weights[step], input_buffer);
  }
  apply_activation(ReLU);
  store_to_output_buffer();
}

↑ 목차로 이동

2) CPU·GPU와 NPU의 구조적 차이

구분 CPU GPU NPU
주 용도 범용 연산 그래픽·벡터 병렬 AI 행렬 연산 최적화
연산 단위 ALU ALU + 벡터유닛 MAC 어레이
데이터 흐름 캐시 중심 스레드 중심 데이터플로우 중심(재사용↑)
// Verilog: 4비트 덧셈기 (CPU의 ALU 일부 예시)
module adder4(
  input  [3:0] a, b,
  output [4:0] sum
);
  assign sum = a + b;
endmodule

↑ 목차로 이동

3) 연산이 칩 설계의 본질인 이유

모든 칩은 입력 → 연산 → 출력의 과정을 수행합니다. 차이는 어떤 연산을, 얼마나 동시에, 얼마나 적은 전력으로 처리하느냐입니다. AI 칩에서는 전체 연산의 대다수를 곱셈·덧셈(MAC)이 차지합니다.

  • 연산 유닛(컴퓨트)만큼이나 데이터 이동·저장 구조가 중요
  • 메모리 계층(레지스터/버퍼/캐시/DRAM)과 데이터 재사용 최적화가 성능을 좌우
// Verilog: 2-stage 파이프라인 덧셈기 (지연을 클록으로 분할)
module adder_pipe(
  input         clk,
  input  [15:0] a, b,
  output [16:0] sum
);
  reg [16:0] r0;
  reg [16:0] r1;
  always @(posedge clk) begin
    r0 <= a + b;   // 1단계
    r1 <= r0;      // 2단계 (레지스터로 지연)
  end
  assign sum = r1;
endmodule

↑ 목차로 이동

4) MAC(Multiply–Accumulate) 연산의 역할과 구조

MAC은 두 입력을 곱한 뒤 결과를 누적(accumulate)하는 연산입니다. 수식으로는 acc = acc + (a × b). 신경망의 층(layer) 계산은 사실상 대량의 MAC 반복으로 표현됩니다.

  • 역할: 가중치-입력 곱과 누적합 계산(CNN, Transformer 공통)
  • 구조: 수천~수십만 개의 MAC이 systolic array로 격자 배치되어 병렬 수행
// Verilog: 8비트 signed MAC (Multiply-Accumulate)
module mac_signed #(
  parameter W = 8
)(
  input               clk,
  input               en,       // 연산 활성화
  input  signed [W-1:0] a, b,   // 입력
  input  signed [2*W:0] acc_in, // 누산 입력
  output signed [2*W:0] acc_out // 누산 출력
);
  reg signed [2*W-1:0] mult;
  reg signed [2*W:0]   acc;
  always @(posedge clk) begin
    if (en) begin
      mult <= a * b;
      acc  <= acc_in + mult;
    end
  end
  assign acc_out = acc;
endmodule

↑ 목차로 이동

5) NPU 설계는 어떻게 진행될까?

  1. 연산 구조 구상 — 타깃 모델(CNN/Transformer)과 데이터플로우 정의
  2. HDL 설계 — Verilog/SystemVerilog로 컴퓨트·버퍼·제어 모듈 작성
  3. 시뮬레이션 — Verilator/파형(Glitches, Hazards)로 기능 검증
  4. FPGA 검증 — 실제 보드에서 성능·정확도·지연 측정
  5. ASIC 테이프아웃 — 공정/배선/물리 합성 및 파운드리 제작
// Verilog: 2x2 MAC 배열 (데모용 간단 연결)
module mac_array_2x2(
  input clk, en,
  input  signed [7:0] a0, a1, b0, b1,
  output signed [16:0] y00, y01, y10, y11
);
  wire signed [16:0] acc0, acc1, acc2, acc3;
  mac_signed #(.W(8)) m00(.clk(clk), .en(en), .a(a0), .b(b0), .acc_in(0), .acc_out(acc0));
  mac_signed #(.W(8)) m01(.clk(clk), .en(en), .a(a0), .b(b1), .acc_in(0), .acc_out(acc1));
  mac_signed #(.W(8)) m10(.clk(clk), .en(en), .a(a1), .b(b0), .acc_in(0), .acc_out(acc2));
  mac_signed #(.W(8)) m11(.clk(clk), .en(en), .a(a1), .b(b1), .acc_in(0), .acc_out(acc3));
  assign y00 = acc0; assign y01 = acc1;
  assign y10 = acc2; assign y11 = acc3;
endmodule

↑ 목차로 이동

6) 무료 툴체인으로 CPU·NPU 설계 실습하기

목적 도구 특징 비용
HDL 시뮬레이션 Verilator 오픈소스 Verilog 시뮬레이터 무료
파형 분석 GTKWave 신호·타이밍 시각화 무료
논리합성 Yosys 게이트 레벨 변환 무료
실행 검증 QEMU, Spike 가상 CPU 실행, ISA 참조모델 무료
적합성 검사 RISCOF, riscv-arch-test 자동 테스트·리포트 무료
// Verilog: 간단 테스트벤치 (adder4 검증 예시)
module tb_adder4();
  reg  [3:0] a, b;
  wire [4:0] s;
  adder4 dut(.a(a), .b(b), .sum(s));
  initial begin
    $display("time a b | sum");
    a=4'd3; b=4'd4; #5 $display("%0t  %0d %0d | %0d",$time,a,b,s);
    a=4'd9; b=4'd6; #5 $display("%0t  %0d %0d | %0d",$time,a,b,s);
    $finish;
  end
endmodule

↑ 목차로 이동

7) NPU 설계를 배우는 단계별 로드맵

  1. 논리회로 기초(AND/OR/XOR, 플립플롭, FSM)
  2. HDL(Verilog) 문법과 모듈화 설계
  3. 시뮬레이션(Verilator)·파형분석(GTKWave) 실습
  4. 간단한 CPU(파이프라인) 구현으로 데이터 경로 이해
  5. MAC 블록 설계 → 소형 어레이로 병렬화
  6. 버퍼·DMA·스케줄러 등 데이터플로우 최적화
  7. FPGA 검증 → 필요 시 ASIC 제작 고려
// Verilog: Top 레벨 스켈레톤 (버퍼 + MAC 어레이 + 활성화)
module npu_top(
  input               clk, rst_n, en,
  input  signed [7:0] in0, in1, w0, w1,
  output signed [16:0] out0, out1
);
  // 입력 버퍼 (예시: 단순 레지스터)
  reg signed [7:0] in_buf0, in_buf1, w_buf0, w_buf1;
  always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
      in_buf0 <= 0; in_buf1 <= 0; w_buf0 <= 0; w_buf1 <= 0;
    end else if (en) begin
      in_buf0 <= in0; in_buf1 <= in1; w_buf0 <= w0; w_buf1 <= w1;
    end
  end

  // 2x1 MAC 배열 (간단 예)
  wire signed [16:0] y0, y1;
  mac_signed #(.W(8)) m0(.clk(clk), .en(en), .a(in_buf0), .b(w_buf0), .acc_in(0), .acc_out(y0));
  mac_signed #(.W(8)) m1(.clk(clk), .en(en), .a(in_buf1), .b(w_buf1), .acc_in(0), .acc_out(y1));

  // 활성화 (ReLU 예시)
  assign out0 = (y0[16] ? 17'd0 : y0);
  assign out1 = (y1[16] ? 17'd0 : y1);
endmodule

↑ 목차로 이동

8) 정리: AI 칩 설계의 핵심은 결국 ‘연산’이다

NPU는 대량의 곱셈·덧셈(MAC)을 병렬로 처리하는 구조이며, 연산 유닛 못지않게 데이터 이동·저장·재사용을 최적화하는 설계가 성능을 결정합니다. 무료 툴체인으로 노트북에서도 충분히 시작할 수 있으니, 작은 모듈부터 쌓아 올려보세요.

↑ 목차로 이동


키워드: NPU, AI 칩, MAC 연산, HDL, CPU 설계, RISC-V, 시뮬레이터, FPGA, 반도체 창업, 툴체인

반응형