DMA & AXI DMA 완전 가이드

🚀 DMA & AXI DMA 완전 가이드

Direct Memory Access의 원리부터 AXI DMA 설계·검증까지 — SoC 엔지니어를 위한 실전 레퍼런스

AMBA AXI SoC Design Scatter-Gather 2026 Updated

SoC 시스템에서 DMA(Direct Memory Access)는 프로세서의 개입 없이 메모리와 주변장치 간 데이터를 고속으로 전송하는 핵심 메커니즘입니다. 프로세서가 모든 데이터 이동을 직접 처리하면 Fetch → Decode → Execute 사이클을 데이터 복사에 낭비하게 되어 심각한 성능 저하가 발생합니다. DMA 컨트롤러(DMAC)는 이 병목을 해소하여 프로세서가 실제 연산에 집중할 수 있게 해줍니다.

이 글에서는 DMA의 기본 원리, DMAC가 갖추어야 할 핵심 기능, Scatter-Gather 연산, 그리고 AMBA AXI 프로토콜 기반 DMA 설계 및 Verilog 구현과 검증까지 체계적으로 다룹니다. 2026년 현재 최신 AXI5 스펙과 상용 IP 트렌드도 함께 소개합니다.

📌 1. DMA란 무엇인가?

Programmed Transfer vs DMA Transfer

전통적인 Programmed I/O 방식에서는 프로세서가 직접 모든 데이터 복사를 수행합니다. 메모리 블록 하나를 복사하려면 프로세서는 아래의 과정을 반복해야 합니다:

  • Instruction Fetch — 명령어를 메모리에서 가져옴
  • Decode & Execute — 명령어 해석 및 실행
  • Memory Read — 소스 주소에서 데이터 읽기
  • Memory Write — 목적 주소에 데이터 쓰기

한 워드(word)를 복사할 때마다 이 네 단계를 모두 거쳐야 하므로, 대용량 데이터 전송 시 프로세서 자원이 심각하게 낭비됩니다. 또한 프로세서는 단일 워드 단위로 전송하기 때문에 버스트(Burst) 전송을 활용할 수 없어 버스 효율이 떨어집니다.

⚡ Programmed Transfer vs DMA Transfer 비교
❌ Programmed Transfer
Processor: Fetch 명령어
Processor: Decode/Execute
Processor: Read Source
Processor: Write Dest
🔄

매 워드마다 4단계 반복 → CPU 점유율 100%

✅ DMA Transfer
Processor: DMA Setup (1회)
DMAC: Burst Read → Write
DMAC: Burst Read → Write
DMAC: Interrupt (완료)

CPU는 다른 작업 수행 가능 → 높은 효율

DMA의 정의

DMA(Direct Memory Access)는 프로세서의 개입 없이 시스템 내의 한 리소스에서 다른 리소스로 데이터를 복사하는 연산입니다. DMAC(DMA Controller)는 이러한 데이터 복사 작업을 전담하는 하드웨어 블록으로, 다음과 같은 전송 모드를 지원합니다:

  • I/O → Memory (주변장치에서 메모리로)
  • Memory → I/O (메모리에서 주변장치로)
  • Memory → Memory (메모리 간 복사)
  • I/O → I/O (주변장치 간 전송)

💡 핵심 포인트: DMA 전송에서 프로세서는 초기 설정(소스/목적 주소, 전송 길이)만 수행하고, 실제 데이터 이동은 DMAC가 버스트 단위로 수행합니다. 전송 완료 시 DMAC가 인터럽트를 발생시켜 프로세서에 알립니다. 이 동안 프로세서는 다른 연산을 자유롭게 수행할 수 있습니다.

⚙️ 2. DMAC가 갖추어야 할 핵심 기능

효과적인 DMA 컨트롤러를 설계하려면 단순한 데이터 복사 이상의 기능이 필요합니다. 다음은 실전 SoC에서 DMAC에 요구되는 주요 기능들입니다.

기능 설명 왜 필요한가?
제어 레지스터 Source Address, Destination Address, Transfer Length 등 DMA 정보를 저장하는 CSR 프로세서가 DMA 동작을 프로그래밍하기 위한 기본 인터페이스
완료 알림 Polling 방식의 Flag 설정 또는 Interrupt 발생 프로세서가 DMA 완료 시점을 인지하고 후처리 수행
버스트 전송 연속된 다수의 데이터를 한 번의 Burst로 전송 버스 효율 극대화, 단일 워드 전송 대비 처리량 대폭 향상
버스트 기반 중재 전체 DMA가 아닌 Burst 단위로 버스를 점유/해제 시스템 버스를 장시간 독점하지 않아 다른 마스터의 지연 최소화
Multi-Channel 다수의 DMA 채널을 독립적으로 운용 (예: 32채널) 여러 주변장치의 동시 전송 요구를 처리
Chunk 기반 Round-Robin 각 채널에 공정하게 Chunk(연속 Burst 묶음) 단위로 순서 배분 채널 간 공정성 보장 및 부하 균형
Scatter-Gather 비연속적인(non-contiguous) 메모리 영역 간 전송 지원 가상 주소 페이징으로 물리 메모리가 분산된 경우 필수

🔀 3. Scatter-Gather DMA 상세

Scatter-Gather DMA는 비연속적인 메모리 블록 간의 데이터 전송을 여러 개의 작은 연속 블록 전송(Descriptor)으로 분할하여 수행하는 기법입니다. 가상 메모리 환경에서 물리 메모리 페이지가 분산 배치되어 있을 때 반드시 필요한 기능입니다.

🔗 Scatter-Gather: Linked-List Buffer Descriptor 구조
📋 Buffer Descriptor #1
SR (Status)
DMACR (Control)
SA: 0x1000_0000
DA: 0x2000_0000
LENGTH: 256B
BDA → Next ↓
⬇️
📋 Buffer Descriptor #2
SR (Status)
DMACR (Control)
SA: 0x1000_1000
DA: 0x2000_0100
LENGTH: 512B
BDA → Next ↓
⬇️
📋 Buffer Descriptor #N (Last)
SR (Status)
DMACR (Control)
SA: 0x1000_3000
DA: 0x2000_0300
LENGTH: 128B
BDA → NULL ⏹️

각 Descriptor는 BDA(Buffer Descriptor Address) 필드를 통해 다음 Descriptor를 가리키며, 마지막은 NULL로 종료합니다.

Scatter(분산)는 DMAC가 연속된 소스 데이터를 여러 비연속 목적 주소로 나누어 쓰는 동작이고, Gather(수집)는 비연속 소스 주소에서 데이터를 모아 연속된 목적 주소에 쓰는 동작입니다. Linked-List 방식의 Buffer Descriptor는 각 전송 단위의 소스 주소, 목적 주소, 전송 길이, 상태, 그리고 다음 Descriptor의 포인터를 담고 있어 유연한 전송 체인을 구성합니다.

📦 4. Chunk 기반 DMA 전송과 버스 중재

하나의 DMA 전송은 여러 개의 Chunk로 구성됩니다. 각 Chunk는 버스를 해제하지 않고 연속으로 수행하는 일련의 Burst 전송 묶음입니다. Chunk 단위로 버스를 점유/해제함으로써 다른 버스 마스터가 끼어들 수 있게 하여 시스템 전체의 응답성을 유지합니다.

📊 DMA Transfer = Chunk들의 연속
Chunk 1
Bus Release
Chunk 2
Bus Release
Chunk N
Same Interface: R0 → W N per chunk
Different Interface: Read on IF-A, Write on IF-B

⚠️ 주의: Chunk 크기는 데이터 버스 폭의 배수로 설정해야 합니다. Chunk이 0으로 설정되면 데이터 버스 폭이 기본값으로 사용됩니다. 버스는 Chunk 완료 시까지 해제되지 않으므로, 메인 버스 아비터가 버스 시간을 제한하는 역할을 합니다.

🏗️ 5. AXI DMA 설계: dma_axi_simple

AXI DMA는 ARM의 AMBA AXI 프로토콜 위에서 동작하는 DMA 컨트롤러입니다. 여기서 소개하는 dma_axi_simple은 교육용 AXI DMA 설계로, 핵심 구조를 이해하기에 적합합니다.

주요 특성

  • AMBA AXI3AXI4 프로토콜 모두 지원
  • 데이터 전송 완료 시 인터럽트(IRQ) 신호 발생
  • 최대 216-1 바이트(약 64KB) 단일 전송 가능
  • ⚠️ 소스와 목적의 시작 주소는 (4 × burst length) 모듈로 값이 동일해야 하는 제약 존재
🧩 dma_axi_simple 내부 아키텍처
dma_axi_simple (Top Module)
dma_axi_simple_csr_axi
AXI Slave Interface (CSR)
csr_read
csr_write
csr (레지스터 파일)
EN, GO, SRC, DST, BNUM, CHUNK
dma_axi_simple_core
AXI Master Interface (Data)
core_read (AXI Read)
core_write (AXI Write)
BUSY, DONE 상태 피드백
S: AXI Slave Port (CSR 접근)
M: AXI Master Port (데이터 전송)
IRQ: 완료 인터럽트

📝 6. DMA CSR 레지스터 맵

프로세서(또는 BFM)는 AXI Slave 포트를 통해 DMA의 제어/상태 레지스터(CSR)에 접근합니다. 아래는 주요 레지스터의 구조입니다.

Name Offset R/W 설명
NAME0~3 +000h~+00Ch RO IP 식별 문자열 ("DMA", "AXI")
COMP0~3 +010h~+01Ch RO 회사명 식별 ("DYNA", "LITH")
VERSION +020h RO IP 버전 번호 (예: 0x2015_0712)
CONTROL +030h RW [31] EN: DMA Enable, [1] IP: Interrupt Pending, [0] IE: Interrupt Enable
NUM +040h RW [31] GO: 시작, [30] BUSY(RO), [29] DONE(RO), [23:16] CHUNK 크기, [15:0] BYTES 전송 크기
SOURCE +044h RW [31:0] 소스 주소
DESTINATION +048h RW [31:0] 목적 주소
🔧 CONTROL 레지스터 비트필드 (+030h)
Bit 31
EN
Bit 30:2
Reserved
Bit 1
IP
Bit 0
IE
🔧 NUM 레지스터 비트필드 (+040h)
31
GO
30
BUSY
29
DONE
28:24
Rsvd
23:16
CHUNK
15:0
BYTES

💻 7. Verilog 구현 코드

Top Module: dma_axi_simple.v

최상위 모듈은 CSR 서브모듈과 Core 서브모듈을 인스턴스화하고, AXI Slave/Master 포트 및 IRQ 신호를 외부에 노출합니다. 파라미터로 AXI 버스 폭, ID 폭 등을 설정할 수 있어 다양한 시스템에 통합 가능합니다.

Verilog — dma_axi_simple.v
`include "dma_axi_simple_defines.v"
`include "dma_axi_simple_csr_axi.v"
`include "dma_axi_simple_core.v"
`timescale 1ns/1ns

module dma_axi_simple
  #(parameter AXI_MST_ID   = 1
  , AXI_WIDTH_CID = 4
  , AXI_WIDTH_ID  = 4
  , AXI_WIDTH_AD  = 32
  , AXI_WIDTH_DA  = 32
  , AXI_WIDTH_DS  = (AXI_WIDTH_DA/8)
  , AXI_WIDTH_DSB = clogb2(AXI_WIDTH_DS)
  , AXI_WIDTH_SID = AXI_WIDTH_CID + AXI_WIDTH_ID
  )
(
    input  wire  ARESETn
  , input  wire  ACLK
  // DMA AXI Master Port
  `AMBA_AXI_MASTER_PORT(wire)
  // AXI Slave Port for CSR
  `AMBA_AXI_SLAVE_PORT(wire)
  , input  wire  CSYSREQ
  , output wire  CSYSACK
  , output wire  CACTIVE
  , output wire  IRQ
);

// Low-power interface: always active
assign CSYSACK = CSYSREQ;
assign CACTIVE = 1'b1;

// Internal wires: CSR ↔ Core
wire        DMA_EN;
wire        DMA_GO;
wire        DMA_BUSY;
wire        DMA_DONE;
wire [31:0] DMA_SRC;
wire [31:0] DMA_DST;
wire [15:0] DMA_BNUM;  // bytes to move
wire [ 7:0] DMA_CHUNK; // AxLEN (+1 beats)

// CSR sub-module instantiation
dma_axi_simple_csr_axi u_csr (
    .ARESETn(ARESETn), .ACLK(ACLK)
  , .IRQ(IRQ)
  , .DMA_EN(DMA_EN),   .DMA_GO(DMA_GO)
  , .DMA_BUSY(DMA_BUSY), .DMA_DONE(DMA_DONE)
  , .DMA_SRC(DMA_SRC),   .DMA_DST(DMA_DST)
  , .DMA_BNUM(DMA_BNUM), .DMA_CHUNK(DMA_CHUNK)
);

// Core sub-module instantiation
dma_axi_simple_core u_core (
    .ARESETn(ARESETn), .ACLK(ACLK)
  , .DMA_EN(DMA_EN),   .DMA_GO(DMA_GO)
  , .DMA_BUSY(DMA_BUSY), .DMA_DONE(DMA_DONE)
  , .DMA_SRC(DMA_SRC),   .DMA_DST(DMA_DST)
  , .DMA_BNUM(DMA_BNUM), .DMA_CHUNK(DMA_CHUNK)
);

endmodule

시뮬레이션 Makefile (ModelSim)

Makefile
# Makefile for AXI DMA simulation
SHELL    = /bin/sh
VLIB     = $(shell which vlib)
VLOG     = $(shell which vlog)
VSIM     = $(shell which vsim)
WORK     = work
TOP      = top

all: vlib compile simulate

vlib:
	if [ -d $(WORK) ]; then /bin/rm -rf $(WORK); fi
	$(VLIB) $(WORK)

compile:
	$(VLOG) -lint -work $(WORK) -f modelsim.args

simulate: compile
	$(VSIM) -novopt -c -do "run -all; quit" $(WORK).$(TOP)

🧪 8. 검증 환경 (Testbench)

AXI DMA의 검증 환경은 세 가지 핵심 구성요소로 이루어집니다:

🔬 AXI DMA 검증 Testbench 구조
AXI BFM
M1 (Master)
DMA 제어/설정
AMBA AXI 2×2
Interconnect
S0→AXI DMA S1→Memory
AXI MEM
mem_ahb
데이터 저장소

BFM이 DMA CSR을 설정 → DMA가 Master 포트를 통해 Memory 간 데이터 전송 → 완료 시 IRQ 확인

검증 실행 순서

  • Step 1: 프로젝트 디렉토리로 이동 — cd $(PROJECT)/codes/dma_axi_simple
  • Step 2: RTL 코드 확인 — cd design/verilog
  • Step 3: 컴파일 및 시뮬레이션 실행 — cd sim/modelsim && make
  • Step 4: 파형 확인 — gtkwave wave.vcd &

🌐 9. 2026년 DMA 기술 트렌드: AXI5와 그 너머

DMA 기술은 SoC 아키텍처의 발전과 함께 지속적으로 진화하고 있습니다. 2026년 현재, 업계에서 주목할 만한 변화들을 살펴봅니다.

AMBA 프로토콜 진화 타임라인

2003 — AXI3 (AMBA 3)
최초의 AXI 프로토콜. 분리된 Read/Write 채널 도입, Out-of-Order 트랜잭션 지원
2010 — AXI4 (AMBA 4)
AXI4-Stream, AXI4-Lite 추가. Burst 최대 256 beat으로 확장. Xilinx/AMD FPGA 생태계 표준으로 채택
2022 — AXI5 (AMBA 5)
Atomic 연산, Data Poisoning, Interface Parity Protection, MPAM, Memory Tagging Extension(MTE) 등 안전성·보안 기능 대폭 강화
2023~2026 — CHI C2C, CXS-B
Chiplet 간 Coherent 인터커넥트(CHI C2C), CXL/CCIX 패킷 전송용 CXS 프로토콜 확장. AXI3/AXI4는 신규 설계에서 비권장(deprecated) 전환

상용 DMA IP 동향

벤더 IP 이름 주요 특징
Synopsys DW_axi_dmac 최대 32채널, 독립 클럭 도메인, Linked List / Auto Reload / Shadow Register 멀티블록 전송, Safety-critical 지원
Arm CoreLink DMA-330 프로그래머블 DMAC, Scatter-Gather, 채널별 보안(Security), 저전력 설계
AMD (Xilinx) AXI DMA / AXI CDMA Vivado IP 카탈로그, AXI4-Stream 브리지, Versal/Zynq 지원, SG 모드 내장
Microchip CoreAXI4DMAController Internal/External Descriptor, Stream Cache, 멀티 프로세서 동시 사용 지원, Interrupt Queue

🔮 2026 트렌드 요약: 최신 AXI5 스펙에서는 Atomic 연산으로 Read-Modify-Write를 단일 트랜잭션으로 처리하고, Interface Parity Protection으로 차량용(Automotive) 안전 요건을 충족하며, Unique ID로 인터커넥트의 순서 추적 복잡도를 줄이는 등 DMA 효율과 안전성이 동시에 강화되고 있습니다. 또한 AXI3/AXI4는 신규 설계에서 AXI5로 대체가 권장되는 추세입니다.

🔄 10. DMA 프로그래밍 플로우

소프트웨어(또는 BFM) 관점에서 DMA를 사용하는 전형적인 단계를 정리합니다.

📋 DMA 전송 프로그래밍 순서
① CONTROL.EN = 1 (DMA 모듈 활성화)
② SOURCE 레지스터에 소스 주소 기록
③ DESTINATION 레지스터에 목적 주소 기록
④ NUM.BYTES = 전송 크기, NUM.CHUNK = Chunk 크기
⑤ CONTROL.IE = 1 (인터럽트 활성화, 선택사항)
⑥ NUM.GO = 1 (DMA 전송 시작!)
Polling: NUM.DONE == 1 확인
OR
Interrupt: IRQ 수신 대기
⑦ 전송 완료 확인 후 CONTROL.IP 클리어

📌 11. 정리 및 핵심 요약

🎯 이 글에서 다룬 핵심 내용:

  • 1. DMA 기본 원리 — Programmed Transfer의 비효율을 해소하는 하드웨어 가속 데이터 전송 메커니즘
  • 2. DMAC 필수 기능 — 버스트 전송, Multi-Channel, Chunk 기반 중재, Scatter-Gather
  • 3. Linked-List Buffer Descriptor — 유연한 비연속 메모리 전송을 위한 체인 구조
  • 4. AXI DMA 설계 — CSR 서브모듈과 Core 서브모듈의 분리 구조, 레지스터 맵 상세
  • 5. Verilog 구현 & 검증 — 파라미터화된 Top 모듈, ModelSim 시뮬레이션 플로우
  • 6. 2026년 트렌드 — AXI5 Atomic/Safety 기능, 상용 IP 현황, AXI3/4 → AXI5 전환 추세

DMA는 단순해 보이지만, 실제 SoC에서는 버스 중재, 캐시 일관성(Cache Coherency), 가상 메모리 페이지 경계, 보안 파티셔닝 등 복잡한 시스템 수준 이슈와 밀접하게 연관됩니다. AXI5의 MTE, MPAM, Atomic 연산 등은 이러한 현대적 요구사항을 프로토콜 수준에서 해결하려는 노력의 결과입니다. 다음 포스트에서는 Scatter-Gather DMA의 상세 구현과 Linux 커널 DMA 드라이버 연동을 다룰 예정입니다.

Reference: Ando Ki, "Introduction to DMA" & "Design and Verification of AXI DMA", Future Design Systems, 2020

Arm AMBA AXI Protocol Specification Issue J · Synopsys DW_axi_dmac · AMD AXI DMA IP

© 2026 SoC Design Engineer Blog | Updated March 2026

댓글

이 블로그의 인기 게시물

📚 SDC 마스터 클래스 시리즈 | Chapter 1

📚 SDC 마스터 클래스 시리즈 | Chapter 2

📚 SDC 마스터 클래스 시리즈 | Chapter 3