AXI Burst Transaction의 4KB Boundary 규칙과 Cortex-A MMU 설정 영향 분석
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
🔧 AXI 프로토콜의 핵심: Burst Transaction과 4KB Boundary 규칙 완벽 가이드
SoC 설계자와 임베디드 엔지니어를 위한 AXI 버스 프로토콜 4KB 주소 경계 규칙의 원리, 위반 사례, 그리고 Cortex-A 환경에서의 실전 해결 방안을 총정리합니다.
📌 AXI 4KB Boundary 규칙이란?
AMBA AXI 스펙(IHI0022)에는 "하나의 Burst Transaction은 4KB(2¹² = 4096 바이트) 주소 경계를 넘어서는 안 된다"는 명시적인 규칙이 존재합니다. 주소값 기준으로 하위 12비트가 0x000으로 정렬되는 지점, 즉 0x1000, 0x2000, 0x3000 등이 바로 4KB 경계입니다.
🤔 왜 하필 4KB인가?
이 제약의 배경에는 두 가지 핵심 이유가 있습니다.
📊 AXI Burst 유형별 4KB 규칙 적용
AXI 프로토콜은 세 가지 Burst 유형을 정의하며, 각각에 대해 4KB 규칙이 다르게 영향을 미칩니다.
| Burst 유형 | ARBURST / AWBURST | 주소 동작 | 4KB 위반 가능성 |
|---|---|---|---|
| FIXED | 2'b00 | 주소 고정 (FIFO 접근) | 없음 ✓ |
| INCR | 2'b01 | 주소 순차 증가 | 높음 ⚠ |
| WRAP | 2'b10 | 경계에서 시작 주소로 래핑 | 제한적 (정렬 필수) |
INCR Burst가 가장 주의가 필요합니다. 주소가 계속 증가하므로 시작 주소와 전송 길이 조합에 따라 4KB 경계를 넘을 확률이 높습니다. 반면 WRAP Burst는 캐시 라인 페치에 주로 사용되며, 전송 크기가 자연 정렬(Natural Alignment)을 만족해야 하므로 위반 가능성이 상대적으로 낮습니다.
⚠️ 규칙 위반은 어떻게 발생하는가?
이 오류는 주로 하드웨어 마스터(커스텀 DMA 엔진 등)를 직접 설계하거나, 소프트웨어에서 주소 정렬을 고려하지 않고 대량 데이터를 전송할 때 발생합니다.
🔍 실제 위반 시나리오
상황: 32-bit(4-byte) 데이터를 16 beat INCR Burst로 전송 (총 64 bytes)
시작 주소: 0x0FD0
끝 주소: 0x0FD0 + 64 = 0x1010
→ 전송 도중 0x1000 (4KB 경계)을 넘어감!
▼ 4KB Boundary 위반 다이어그램
이 경우 AXI 마스터는 반드시 트랜잭션을 두 개로 분할(Split)해야 합니다. 하드웨어 로직이 이를 처리하지 못하고 단일 ARLEN/AWLEN 값으로 전송을 시도하면, 인터커넥트 레벨에서 SLVERR(Slave Error) 또는 DECERR(Decode Error)가 발생하며 시스템이 Hang될 수 있습니다.
✅ 올바른 Split 처리 방법
📐 경계 위반 여부 판단 공식
🧠 Cortex-A MMU 환경과 Single Transaction 현상
Cortex-A 프로세서에서 MMU를 켜고 특정 메모리 영역을 설정했을 때, 예상과 달리 Burst가 발생하지 않고 Single 전송만 나오는 현상이 보고됩니다. 이는 오류가 아니라 메모리 속성(Memory Attribute) 설정에 따른 정상 동작인 경우가 대부분입니다.
ARMv8-A 메모리 타입과 Burst 동작 비교
| 메모리 타입 | Gathering | Reordering | Burst 가능 | 용도 |
|---|---|---|---|---|
| Device-nGnRnE | ✗ | ✗ | 불가 | MMIO 레지스터 |
| Device-nGnRE | ✗ | ✗ | 불가 | 디바이스 접근 |
| Device-GRE | ✓ | ✓ | 가능 | DMA 영역 |
| Normal (NC) | ✓ | ✓ | 가능 | 비캐시 메모리 |
| Normal (WB) | ✓ | ✓ | 최적 | 일반 메모리 |
핵심은 'Gathering' 속성입니다. Device-nGnRnE에서 'nG(No Gathering)'는 여러 개의 작은 쓰기 요청을 하나의 큰 Burst로 묶는 것을 금지합니다. 따라서 이 속성이 적용된 영역에서는 memcpy()를 호출하더라도 모든 전송이 Single Transaction으로 나가게 됩니다.
💡 실무 팁: DMA 버퍼 영역에 Burst 전송이 필요하다면 해당 영역을 Normal Memory (Non-cacheable 또는 Write-Back)로 설정하세요. MMIO 레지스터와 DMA 버퍼의 메모리 속성을 분리하는 것이 성능 최적화의 핵심입니다.
🛠️ 실전 진단 및 솔루션 가이드
Burst가 의도대로 동작하지 않거나 4KB 경계 오류가 의심될 때, 다음 4단계로 체계적으로 원인을 파악하세요.
해당 메모리 영역의 MAIR(Memory Attribute Indirection Register) 인덱스와 PTE 속성을 확인하세요. 성능이 중요한 DMA 영역이라면 Device 타입 대신 Normal Memory (Non-cacheable)로 설정해야 Write Combining이 허용됩니다.
DMA 컨트롤러에 넘기는 시작 주소가 전송 크기의 배수인지 확인하세요. 가급적 주소를 4KB 단위로 정렬하거나, 전송 길이가 경계를 넘지 않도록 remaining = 0x1000 - (addr & 0xFFF)로 사전 계산하여 Split 로직을 구현해야 합니다.
시스템이 멈추면 ILA(Integrated Logic Analyzer) 또는 외부 프로토콜 분석기로 ARADDR/AWADDR 값과 AxLEN 조합을 모니터링하세요. Address + (Len+1) × Size가 4KB 경계를 넘는지 RTL 시뮬레이션에서 assertion으로 검증하는 것을 권장합니다.
MMU가 활성화된 환경에서 소프트웨어는 가상 주소를 다루지만, AXI 버스로 나가는 것은 물리 주소입니다. 가상 주소에서 연속적인 영역이 물리 주소에서는 4KB 페이지 단위로 불연속적일 수 있습니다. 이 경우 Scatter-Gather DMA 기능을 사용하여 페이지별 디스크립터를 구성해야 합니다.
🚨 현업에서 자주 발생하는 실수 TOP 5
🔑 AXI3 vs AXI4: 주요 차이점
4KB Boundary 규칙은 AXI3과 AXI4 모두에서 동일하게 적용되지만, 프로토콜 버전에 따라 Burst 관련 스펙이 다릅니다.
| 항목 | AXI3 | AXI4 |
|---|---|---|
| 최대 Burst Length | 16 beats | 256 beats |
| AxLEN 비트 수 | 4-bit (0~15) | 8-bit (0~255) |
| 4KB 위반 위험도 | 중간 | 높음 |
| Write Interleaving | 지원 | 제거됨 |
AXI4에서 Burst Length가 256까지 확장되면서, 단일 Burst가 최대 256 × 128 = 32KB(128-byte 데이터 폭 기준)까지 전송할 수 있게 되었습니다. 이에 따라 4KB 경계를 넘을 가능성이 크게 증가했고, Split 로직의 구현이 더욱 중요해졌습니다.
📝 결론: 안정적인 SoC 설계를 위한 체크리스트
AXI 프로토콜의 4KB Boundary 규칙은 시스템의 확장성과 슬레이브 독립성을 보장하는 최소한의 안전장치입니다. 이를 준수하기 위한 핵심 체크리스트를 정리합니다.
특히 Cortex-A 환경에서는 MMU 설정 하나만으로도 버스 전송 효율이 극명하게 달라질 수 있습니다. 메모리 맵(Memory Map) 설계 시 각 영역의 속성을 신중히 결정하고, 하드웨어의 Split 로직과 소프트웨어의 메모리 속성 관리가 조화를 이루는 것이 안정적인 SoC의 핵심입니다.
📚 References
본 콘텐츠는 공개된 기술 문서와 실무 경험을 바탕으로 작성되었습니다. 정확한 스펙은 ARM 공식 문서를 참조하시기 바랍니다.
📄 Raw Data
### AXI 프로토콜의 핵심: Burst Transaction과 4KB Boundary 규칙 완벽 가이드
임베디드 시스템과 SoC(System on Chip) 설계에서 데이터 전송 효율을 극대화하기 위해 사용하는 **AXI(Advanced eXtensible Interface) 프로토콜**은 매우 정교한 규칙들을 가지고 있습니다. 그중에서도 개발자들이 가장 흔히 접하면서도 실수하기 쉬운 제약 사항이 바로 **'4KB Address Boundary'** 규칙입니다. 이번 포스팅에서는 이 규칙의 정의와 위반 시 발생하는 문제, 그리고 Cortex-A 환경에서의 실질적인 해결 방안을 심층적으로 분석해 보겠습니다.
---
### 1. AXI 4KB Boundary 규칙이란 무엇인가?
AMBA AXI 스펙에 따르면, **"하나의 Burst Transaction은 4KB 주소 경계를 넘어서는 안 된다"**는 명시적인 규칙이 존재합니다. 여기서 4KB는 $2^{12}$ 바이트를 의미하며, 주소값으로 따지면 하위 12비트가 `000`으로 끝나는 지점(예: `0x1000`, `0x2000`, `0x3000` 등)입니다.
**왜 하필 4KB인가?**
그 이유는 메모리 관리와 슬레이브(Slave) 장치의 보호에 있습니다. 현대적인 시스템에서 대부분의 메모리 관리 장치(MMU)는 최소 페이지 단위를 **4KB**로 설정합니다. 또한, AXI 인터커넥트(Interconnect) 상에서 각 슬레이브 장치들에 할당되는 최소 주소 공간 역시 보통 4KB 단위입니다.
만약 하나의 Burst가 이 경계를 넘어가게 되면, 데이터 전송 중에 의도치 않게 **A 슬레이브에서 B 슬레이브로 접근 대상이 바뀌는 현상**이 발생할 수 있습니다. 이는 시스템 버스 프로토콜의 복잡도를 기하급수적으로 증가시키고 데이터 무결성을 파괴하기 때문에 프로토콜 차원에서 금지하고 있는 것입니다.
---
### 2. 규칙 위반은 어떻게 발생하는가? (예시와 상황)
이 오류는 주로 하드웨어 마스터(DMA 등)를 직접 설계하거나, 소프트웨어에서 주소 정렬(Alignment)을 고려하지 않고 대량의 데이터를 전송할 때 발생합니다.
**실제 발생 예시:**
* **상황:** 32-bit (4-byte) 데이터를 16번 보내는 INCR Burst를 수행하려고 합니다. (Total 64 bytes)
* **시작 주소:** `0x0FD0`
* **계산:** `0x0FD0`에서 64바이트를 더하면 `0x1010`이 됩니다.
* **결과:** 전송 도중에 `0x1000`이라는 4KB 경계를 통과하게 됩니다.
이 경우, AXI 마스터는 `0x0FD0`부터 `0x0FFF`까지만 전송하는 첫 번째 Burst와, `0x1000`부터 시작하는 두 번째 Burst로 **트랜잭션을 쪼개서(Split)** 보내야 합니다. 만약 하드웨어 로직이 이를 처리하지 못하고 단일 `ARLEN`이나 `AWLEN` 값으로 전송을 시도하면 인터커넥트 레벨에서 **Slave Error(SLVERR)** 혹은 **Decode Error(DECERR)**가 발생하며 시스템이 정지(Hang)될 수 있습니다.
---
### 3. Cortex-A MMU 환경과 Single Transaction 현상
사용자가 지적한 것처럼, Cortex-A 프로세서에서 MMU를 켜고 특정 메모리 영역을 설정했을 때 Burst가 일어나지 않고 단일(Single) 전송만 발생하는 경우가 있습니다. 이는 오류라기보다는 **메모리 속성(Memory Attribute) 설정에 따른 정상적인 동작**인 경우가 많습니다.
**원인 분석:**
Cortex-A의 페이지 테이블 엔트리(PTE)에서 해당 영역이 **Device Memory**로 설정되어 있다면, CPU는 데이터의 순서와 기록 시점을 엄격하게 제어합니다. 특히 다음과 같은 설정에서 문제가 됩니다:
1. **Device-nGnRnE (Strongly Ordered):** No Gathering, No Reordering, No Early Write Acknowledgement. 여기서 **'No Gathering'**이 핵심입니다. 여러 개의 작은 쓰기 요청을 하나의 큰 Burst로 묶지 않겠다는 의미이므로, 무조건 Single Transaction으로 나갑니다.
2. **Alignment Fault:** 주소 정렬이 맞지 않는 상태에서 Normal Memory가 아닌 영역에 접근하면 프로세서가 이를 쪼개서 처리하거나 예외를 발생시킵니다.
---
### 4. 문제 해결을 위한 진단 및 솔루션 가이드
만약 의도한 대로 Burst가 동작하지 않거나 4KB 경계 오류가 의심된다면 다음 순서로 원인을 파악하고 해결해야 합니다.
**단계 1: 페이지 테이블 설정 확인 (MAIR/PTE)**
가장 먼저 해당 메모리 영역의 속성을 확인하세요. 성능이 중요하다면 `Device` 타입 대신 **Normal Memory (Non-cacheable)** 타입을 사용해야 합니다. Normal Memory 속성에서는 프로세서가 여러 전송을 묶어 Burst로 보낼 수 있는 'Write Combining'이 허용됩니다.
**단계 2: 데이터 정렬(Alignment) 검사**
소프트웨어에서 DMA 컨트롤러에 주소를 넘길 때, 시작 주소가 전송 크기의 배수인지 확인하십시오. 가급적 **주소를 4KB 단위로 정렬**하거나, 전송 길이가 4KB 경계를 넘지 않도록 소프트웨어 레벨에서 `Transfer_Size`를 계산하여 두 번의 DMA 호출로 나누는 로직을 추가해야 합니다.
**단계 3: 버스 프로토콜 분석기 활용**
시스템이 멈춘다면 ILA(Integrated Logic Analyzer)나 외부 프로토콜 분석기를 통해 `ARADDR` 혹은 `AWADDR` 값과 `ALEN`의 조합을 모니터링하세요. `Address + (Len * Size)`가 4KB 경계를 넘는지 체크하는 로직을 시뮬레이션에서 검증하는 것이 필수적입니다.
**단계 4: 가상 주소 vs 물리 주소**
MMU가 켜진 경우 소프트웨어는 가상 주소를 보지만, AXI 버스로 나가는 것은 물리 주소입니다. 가상 주소에서는 연속적이어도 물리 주소에서 4KB 페이지가 불연속적일 수 있습니다. 이 경우 Scatter-Gather DMA 기능을 사용하여 물리적으로 파편화된 메모리에 대응해야 합니다.
---
### 결론: 안정적인 SoC 설계를 위한 조언
AXI 프로토콜의 4KB Boundary 규칙은 시스템의 확장성과 독립성을 보장하기 위한 최소한의 안전장치입니다. 이를 준수하기 위해서는 **하드웨어 설계 단계에서의 Split 로직 구현**과 **소프트웨어 단계에서의 메모리 속성 및 정렬 관리**가 조화를 이루어야 합니다. 특히 Cortex-A 환경에서는 MMU 설정 하나만으로도 버스 전송 효율이 극명하게 갈릴 수 있으므로, 메모리 맵(Memory Map) 설계 시 각 영역의 속성을 신중히 결정하시기 바랍니다.
---
## References
- [AMBA AXI and ACE Protocol Specification](https://developer.arm.com/documentation/ihi0022/latest/)
- [Arm Architecture Reference Manual for A-profile architecture](https://developer.arm.com/documentation/ddi0487/latest/)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기