AHB 프로토콜에 대한 간단한 tip – HTRANS 신호의 BUSY 상태가 필요한 이유
– 이 글은 2014년 3월 22일 이글루스 블로그에 올렸던 글인데 서비스 종료로 옮겨 온 글입니다.
제 전공분야가 Network-on-Chip 임에도 불구하고 이 분야에 대해서 글을 쓰는건 블로그를 만들고 거의 6개월이 다 된 시점이네요. 우선 몸 풀기로 이 분야에 입문해서 AMBA 프로토콜 중의 AHB에 대해 공부하다 보면 마주치게 되는 간단한 의문점에 대한 글을 써 봅니다.
AMBA 프로토콜은 ARM사에서 제안한 on-chip interconnect 프로토콜로 사용 용도에 따라 AXI, AHB, APB 의 3가지로 나눠지게 되는데, (ASB 프로토콜도 있었지만 거의 사용되지 않고 ATB는 test와 debug에 관련된 프로토콜이라 용도가 좀 다릅니다.) 조금씩 AXI에 의해 대체 되어가고 있지만 여전히 많이 사용되고 상대적으로 간단한 AHB에 대해 이야기를 하려고 합니다.
AHB의 HTRANS 신호는 프로토콜 스펙 문서에 따르면 간단히 다음 4가지 값을 가집니다.
- IDLE (2’b00) – 마스터가 아무런 data transaction을 보내지 않음.
- BUSY (2’b01) – 마스터가 burst transaction 중간에 어떤 이유로 data를 보낼 수 없어서 쉬고 있는 상태
- NONSEQ (2’b10) – 마스터가 burst data transaction을 시작하거나 single data transaction을 수행함
- SEQ (2’b11) – 마스터가 burst data transaction의 중간 또는 끝을 수행함
제가 처음에 AHB 프로토콜을 접하면서 가졌던 궁금증은 HTRANS signal에 왜 BUSY 상태가 있느냐는 점이었습니다. 마스터가 한 번의 burst를 보낼 수 있는 만큼 data를 모아 두었다가 transaction을 시작하면 중간에 data를 보내지 못해서 BUSY를 띄워야 하는 경우는 없을 거라는 생각이 들어서였기 때문이지요. 아래 그림의 왼쪽과 같이 간단한 버스 구조에서는 BUSY 상태를 지원하지 않더라도 분명히 문제가 되지 않을 것입니다. (그림이 잘 안 보일 경우 클릭하면 크게 보입니다.) 하지만 아래 그림의 오른쪽과 같이 동작 속도나 data width가 다른 버스들을 multi layer로 구성하여 사용한다면, HTRANS신호가 BUSY 상태를 지원하는 것은 분명한 도움이 됩니다.
HTRANS 값이 BUSY가 발생해야 하는 가장 간단한 예는 위의 그림과 같이 clock 주파수가 다른 두 버스가 연결될 경우 입니다. Master 0는 100MHz로 동작하는 버스에 연결되어 있고 Master 0가 data를 읽거나 쓰기를 원하는 slave M은 200MHz로 동작하는 상황을 가정해 봅시다. (여기서 주목해야 할 부분은 윗 그림의 오른쪽에서 빨간색 점선 원으로 표시된 부분입니다.) 이와 같은 상황에서 Master 0가 연속된 4개의 주소에 data를 write를 한다고 하면 Master 0가 한 cycle도 쉬지 않고 연속적으로 data를 내 보내더라도, 두배의 속도로 동작하는 slave M이 연결된 버스의 입장에서는 연속된 cycle이 될 수가 없습니다. (AHB bus layer 0의 M_0 port와 AHB bus layer 1의 S_0 port 사이의 interface)
만약 HTRANS 신호에 BUSY 상태가 없다면 100MHz로 동작하는 M_0 port 입장에서 연속적인 신호가 200MHz로 동작하는 S_0 port 에서도 연속적이 되어야 하기 때문에 프로토콜에 맞게 버스를 구현하기 위해서는 M_0 port에 4개의 burst write data를 저장하는 공간을 만들고 100MHz의 동작속도로 4개의 data를 모두 받아 들인 후, 200MHz의 동작속도로 4개의 연속적인 data를 S_0 port에 전달하도록 회로를 설계 해야합니다. 이런 식으로 버스를 설계 한다면 clock 속도가 바뀌는 부분마다 AHB의 최대 burst 크기인 16개 만큼의 저장공간을 만들어 놓아야하기 때문에 chip 면적에 매우 좋지 않은 영향을 끼치게 됩니다.
하지만 HTRANS신호에 BUSY 상태를 허용한다면 버스 사이의 인터페이스 마다 저장공간을 만들어 놓을 필요가 사라지게 됩니다. 아래 그림과 같이 느린 쪽에서는 best effort로 burst data를 내보내고, 빠른쪽에는 clock 속도차이 때문에 data를 보내줄 수 없는 cycle 동안 BUSY 상태를 표시하기만 하면 됩니다.
제가 올리는 이 글이 AHB를 새로 공부하는 누군가에게 되길 빌면서 간단한 글을 마칩니다.