반응형

본 글은 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 설계는 어떻게 진행될까?
- 연산 구조 구상 — 타깃 모델(CNN/Transformer)과 데이터플로우 정의
- HDL 설계 — Verilog/SystemVerilog로 컴퓨트·버퍼·제어 모듈 작성
- 시뮬레이션 — Verilator/파형(Glitches, Hazards)로 기능 검증
- FPGA 검증 — 실제 보드에서 성능·정확도·지연 측정
- 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 설계를 배우는 단계별 로드맵
- 논리회로 기초(AND/OR/XOR, 플립플롭, FSM)
- HDL(Verilog) 문법과 모듈화 설계
- 시뮬레이션(Verilator)·파형분석(GTKWave) 실습
- 간단한 CPU(파이프라인) 구현으로 데이터 경로 이해
- MAC 블록 설계 → 소형 어레이로 병렬화
- 버퍼·DMA·스케줄러 등 데이터플로우 최적화
- 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, 반도체 창업, 툴체인
반응형