int foo(int a, int b, int c)
라고 함수를 정의하고 foo(10, 20, 30)
이라고 call하면, R0에 10, R1에 20, R3에 30이 들어간다.HBUSREQx
신호를 보낸다.HGRANTx
신호로 대답한다.HLOCKx
신호를 arbiter에게 보낸다. 이제 arbiter는 master보다 priority가 낮은 IP에게는 bus 사용을 허가하지 않을 것이다.HADDR
을 decoder에게 준다. Decoder는 해당 slave에게 HSELx
신호를 줘서 ‘누가 너한테 접근하고 싶대’라고 알려 활성화시킨다.HWRITE
을 전달한다.HREADY
로 대답한다.HWDATA
신호에 write하고 싶은 data를 써서 slave에게 전달하거나HADDR
과 HWRITE
을 전달한다.HWDATA
를 유지하고 있어야한다.HREADY
를 보내면 그때 master의 HWDATA
를 인식한 뒤 write할 것이다. 또는, 이때 준비한 HRDATA
를 master에게 전달할 것이다.HTRANS
신호에 대해서 알아보자. HTRANS
는 트랜잭션의 mode를 알려주는 역할을 하며 burst mode를 지원하는 AHB의 경우 현재 데이터와 다음 데이터 사이의 연관성을 나타내는 역할을 하기도 한다.HADDR
이 0x20
을 가리키며 HTRANS
에 NONSEQ
을 날린다. 즉, ‘나 새롭게 데이터 전송 시작할거야’라고 알려준다.HREADY
로 대답한 slave는 1-cycle 뒤에 (0x20
에 대한) HWDATA
를 받거나 HRDATA
를 제공한다. HTRANS
에 BUSY
를 날리면, slave는 알겠다고 대답한다.HADDR
에 0x24
를 가리키며 HTRANS
에 SEQ
을 날린다. 즉, ‘나 burst mode 사용 중이고, 지금 내가 요청한 데이터는 아까 데이터랑 연관돼있어’라고 알려주는 것이다.HADDR
이 자동으로 증가하거나 감소해야 한다. HBURST
신호를 통해 증가하거나 감소하는 bit수를 조절할 수 있다.HBURST
는 3-bit로 다양한 burst mode를 표현한다.INCR x
는 이름 그대로 x-bit씩 주소가 증가하는 것을 말한다.WRAP x
는 주소가 wrapping 돼 boundary 내부에서만 burst 한다는 뜻인데 조금 난해하다.WRAP 4
의 경우 word 4개가 address boundary라는 의미고 ARM core는 1-word가 4-byte니까 4-word면 16-byte = 0x10
이니까 0x10
단위로 boundary가 만들어지는 것이다.0x38
에서 burst mode - WRAP 4
를 시작했다면, 0x38 - 0x3C - 0x30 - 0x34
에 대해 접근하게 된다. Boundary가 0x10
단위기 때문에 0x30~0x40
가 boundary일 것이며 이 영역 내에서 다시 시작지점으로 돌아올 때까지 burst transfer 한다.