AMBA – 2 AHB overview

APB 버스가 peripheral 같은 고성능이 필요하지 않은 모듈들을 위한 버스이기 때문에 성능보다는 최적화를 중요시했다면, AHB(Advanced High-performance Bus)는 보다 성능에 집중한 버스입니다. 그래서 signal도 더 많고 실제 작동하는 방식도 복잡합니다.

그럼, specification을 보면서 자세히 알아볼까요??

Block diagram

AHB Block diagram
Block diagram

먼저 Block diagram부터 봐야겠죠?? 언뜻 보면 Master가 여러 Slave를 HSEL을 통해 선택하고 HWDATA와 HRDATA로 데이터를 주고받는 간단한 구조로 보입니다. 하지만 APB 버스에는 없는 여러 가지 신호와 기능들이 있는데요, Signal을 보면서 알아봅시다.

Signals

Spec. Ch 2는 signal에 대해서 기술합니다.

AHB Global signals
Global signals

먼저 APB 버스와 마찬가지로 clock과 Active Low인 resetn이 있습니다. 다음부터 난리 나요,,,,

Master signals

AHB Master signals
Master signals 1

HADDR은 알겠는데,,,, 나머지는 뭐지?? 아직 안 끝났습니닼ㅋㅋㅋㅋㅋ

Master signals
Master signals 2

HWDATA, HWRITE 빼고는 모르는 signal들이네요,,, 여기까지가 Master에서 나가는 신호입니다.

Slave signals

Slave signals
Slave signals

HRDATA는 Slave에서 Master로 가는 데이터일 것이고,,,, HREADYOUT은 Slave 준비 상태를 의미하겠죠?? 모르는 신호들이 너무 많은데 실제 AHB 동작을 하나하나 확인하면서 알아봅시다.

AHB Read / Write

Single transfer

Spec. Ch 3는 Transfer에 대해 기술합니다. 먼저 Basic transfer를 살펴볼까요?

AHB Basic transfer
Basic transfer

위 timing diagram을 보면 APB transfer와 크게 차이가 없는 것처럼 보이지만, APB transfer와 달리 address phase와 data phase로 나뉘는 것을 알 수 있습니다. 잠깐 APB transfer timing diagram을 살펴볼까요??

APB write transfer
APB write transfer

APB transfer의 경우 Slave가 데이터를 받을 준비가 되어 PREADY가 뜨면 Slave가 데이터를 받는데 그동안 PADDR은 신호를 계속해서 잡고 있게 됩니다. 하지만 AHB transfer의 경우, address와 data의 phase가 분리돼 있기 때문에  HADDR이 신호를 계속 물고 있지 않아도 됩니다. 그렇다면 그게 무슨 이점이 있을까요?? 그건 Multiple transfer를 보면서 이해해 봅시다.

Multiple transfer

AHB Multiple transfer
Multiple transfer

우선 위 transfer의 시나리오를 살펴보자면 write가 1이면 쓰기, 0이면 읽기라고 했죠?? A 주소에 쓰고 B 주소의 데이터를 읽고 C 주소에 쓰는데, B 주소의 데이터를 읽을 때 slave가 무슨 일인지 준비가 안 돼서 1 clock 주기만큼 기다리고 진행하는 상황이네요.

Multiple transfer의 특징 중 하나는 address phase와 data phase가 중첩된다는 겁니다.

AHB Multiple transfer 설명
Multiple transfer 설명

Data phase와 다음 transfer의 address phase를 중첩함으로써 Multiple transfer가 연속적으로 진행될 수 있고, 이를 통해 performance를 높일 수 있습니다.

Burst mode transfer

HTRANS[1:0] 설명

HTRANS[1:0]은 transfer의 상태를 나타냅니다.

HTRANS signal 설명
HTRANS signal 설명
  • 00(IDLE) : Bus를 통해 transfer가 진행되지 않고 있는 상태
  • 01(BUSY) : Master가 어떤 이유로 인해 다음 transfer를 진행시킬 수 없는 상태
  • 10(NONSEQ) : 이전에 transfer가 없었고 첫 번째 transfer인 상태, single transfer라면 NONSEQ입니다.
  • 11(SEQ) : 이전 transfer에 이어 진행되는 상태
Transfer type 예시
Transfer type 예시

Transfer type의 예시가 있는데요, 자세히 살펴봅시다. 모든 transfer는 HWRITE가 Low 상태이므로 read입니다.
HBURST[2:0] signal은 조금 뒤에 설명하겠습니다.

  • T0 – T1 : 첫 번째 transfer의 address phase입니다. 첫 전송이니 HTRANS가 NONSEQ 상태를 나타내고 있습니다.
  • T1 – T2 : Address 0X20의 data phase와 0X24의 address phase가 중첩된 상태입니다. 두 번째 transfer부터는 SEQ 상태이지만 Master가 다음 transfer를 처리할 준비가 안 돼서 BUSY 상태네요. 0X20 데이터는 받았지만 다음 transfer인 0X24의 address phase는 한 번 더 나와야 할 겁니다.
  • T2 – T3 : BUSY 상태가 끝나서 SEQ 상태로 넘어간 것을 확인할 수 있습니다. 이후로는 transfer가 끝날 때까지 SEQ 상태를 유지하는 것을 확인할 수 있습니다. 0X24 address phase입니다.
  • T3 – T4 : 0X24 data phase와 0X28 address phase 중첩된 상황입니다.
  • T4 – T5 : Slave가 데이터를 보낼 준비가 되지 않아 전송이 진행되지 않고 있습니다. T5 clock posedge에 HREADY LOW이므로 address와 data 모두 HREADY High가 될 때까지 기다립니다.
  • T5 – T6 : 0X28 data phase와 0X2C address phase 중첩상태입니다.
  • T6 – T7 : 0X2C data phase입니다. Slave로부터 마지막 데이터를 읽어옵니다.

HMASTLOCK 설명

위 예시는 한 address에 한 번의 transfer만 진행했습니다. 그런데 만약 두 번의 transfer를 진행해야 한다면 어떻게 해야 할까요?

Locked transfer
Locked transfer

HMASTLOCK signal을 통해 한 address에 여러 번 transfer를 진행할 수 있습니다. 위의 예시는 A 주소의 데이터를 읽고 바로 쓰는 transfer인데요, HMASTLOCK signal이 High이므로 A address phase가 연속으로 나오고 데이터를 읽고 쓰는 것을 확인할 수 있습니다. 그리고 HTRANS가 NONSEQ인 것으로 보아 이전 transfer는 없었고, 첫 transfer가 NONSEQ라면 HMASTLOCK – High로 인해 두 번째 transfer도 같은 address에 대한 transfer이므로 NONSEQ 상태인 것을 알 수 있습니다.

HBURST[2:0] 설명

이제 AHB Bus의 핵심이라고 할 수 있는 Burst mode에 대해 알아봅시다. AHB Burst mode는 HBURST[2:0] signal과 HSIZE[2:0] signal로 컨트롤할 수 있습니다.

HBURST signal 설명
HBURST signal 설명

이전 그림에서 HBURST signal이 INCR였던 것 기억하시나요? 위 표의 description을 이해한다면 HBURST signal에 대해 알 수 있을 것 같네요.

Single은 당연히 single transfer일 것이고, 4, 8, 16-beat burst가 있는데 여기서 beat는 transfer 할 데이터의 수를 의미합니다. 예를 들어 16-beat burst는 16개의 데이터를 연속적으로 transfer 시킨다는 것입니다. Undefined length burst는 transfer 시킬 데이터 수를 정하지 않은 것을 의미합니다. 그럼, 이제 INCR와 WRAP에 대해 알아봅시다.

Incrementing burst

Incrementing burst mode는 address를 연속적으로 증가시키며 transfer를 진행시키는 mode입니다. 얼마나 증가시킬지는 HSIZE[2:0] signal을 통해 설정할 수 있습니다.

Wrapping burst

Wrapping burst mode는 incrementing burst mode처럼 주소를 계속 증가시키는 것이 아니라 boundary를 만들어 그 안에서만 주소를 증가시키는 것입니다, boundary는 HBURST와 HSIZE를 통해 설정할 수 있습니다.

HSIZE[2:0] 설명

HSIZE signal 설명
HSIZE signal 설명

HSIZE[2:0] signal은 data transfer의 size를 의미합니다. 그렇다면 앞에 나온 HBURST와 HSIZE에 따라 transfer가 어떻게 달라지는지 예시를 통해 이해해 봅시다.

Burst examples

Incrementing burst example

Incrementing burst 1
Incrementing burst 1

먼저 incrementing burst mode입니다. 이제 HPROT 빼고는 다 이해하실 수 있겠죠?? HTRANS를 통해 상태를 볼 수 있고, read transfer이며, T1~T2에서 HREADY가 Low여서 1 clock 주기만큼 대기한 것을 확인할 수 있습니다.

HBURST[2:0]가 INCR4이므로 4개의 데이터를 읽는데 주소가 boundary 없이 증가하고

HSIZE[2:0]가 word(4-byte)이므로 주소가 시작 0X38부터 4씩 증가하여 0X3c, 0X40, 0X44인 것을 확인할 수 있습니다.

Incrementing burst 2
Incrementing burst 2

이번에는 INCR8이므로 8개의 data를 transfer 하겠네요. Word가 Halfword이므로 address가 2-byte 씩 증가하는 것을 알 수 있습니다.

Wrapping burst example

Wrapping burst 1
Wrapping burst 1

Wrapping burst에서는 boundary를 계산해야 하는데요, 4-beat burst이고 word(4-byte)이므로 boundary는 4*4 = 16 (0X10)인 것을 알 수 있습니다. 그러므로 0X3C에서 0X40으로 넘어가지 않고 0X30으로 돌아오는 것을 알 수 있습니다.

Wrapping burst 2
Wrapping burst 2

8-beat wrapping burst입니다. Boundary부터 계산해 볼까요?? 8-beat * word(4-byte) = 32(0x20)입니다. 그래서 address가 0X3C에서 0X20으로 돌아갑니다.

Undefined burst example

Undefined burst
Undefined burst

마지막으로 Undefined length burst mode입니다. Undefined length burst로 설정하면 3개의 data도 transfer 시킬 수 있네요.

Slave response signals

Slave가 Master에 의한 transfer에 대해 HRESP signal을 통해 반응하는데요, OKAY 상태와 ERROR 상태가 있습니다.

HRESP signal
HRESP signal
  • 0 (OKAY) : Transfer가 성공적으로 완료됨
  • 1 (ERROR) : Transfer에 error가 있음

그래서 Slave source signal인 HRESP와 HREADYOUT을 통해 transfer의 상태를 확인할 수 있습니다.

HRESP and HREADYOUT
HRESP and HREADYOUT

HRESP에서 중요한 점은 ERROR 신호는 두 clock cycle 이상 내보내야 한다는 겁니다.

Slave response signal example
Slave response signal example

위 Timing diagram을 보면서 이해해 봅시다.

  • T0 – T1 : A의 address phase가 slave로 잘 전달됨 (HREADYOUT 1, HRESP 0 – Successful transfer completed)
  • T1 – T2 : Slave가 wait 상태를 보냄 (0,0 – Transfer pending)
  • T2 – T3 : Slave가 ERROR signal을 보냄 (0,1 – ERROR response, first cycle)
  • T3 – T4 : Slave가 wait 상태를 끝내고 transfer 진행할 준비가 됨 (1,1 – ERROR response, second cycle)
  • T4 – T5 : Slave가 OKAY signal을 보냄 (1,0 – Successful transfer completed)

Slave는 ERROR signal을 두 번 보냄으로써 버스에 이미 실린 Address를 취소하게 됩니다.

Arbitration

AHB bus에 대한 글은 중재(Arbitration)에 대한 설명으로 마무리하면 될 것 같습니다.

Arbitration block diagram
Arbitration block diagram
Arbitration signals
Arbitration signals 1

HBUSREQ: Master가 Arbiter에게 bus를 사용하고 싶다고 요청하는 신호입니다.

HLOCK: Master가 bus를 계속 사용하고 있으니 끊지 말아달라고 Arbiter에게 요청하는 신호입니다.

HGRANT: Arbiter가 가장 높은 우선순위를 가진 Master에게 High를 띄워줍니다.

Arbitration signals 2
Arbitration signals 2

HMASTER: 현재 bus를 사용중인 Master를 표시해줍니다.

HMASTLOCK: 현재 Master가 locked sequence를 수행중임을 나타냅니다.

HSPLIT: Slave가 다시 split transaction을 할 수 있다고 알려줍니다.

참고: ARM® AMBA 5 AHB Protocol Specification

Similar Posts