늘상 하듯 아이패드의 노타빌리티로 녹음동기화된 필기를 하려다가,
AMBA의 경우 필기보다는 타이핑을 통한 저장이 더 유리할 듯 하여 Velog에 필기를 하도록 하였다.
강의출처
P.S. - 3년간 게임을 안하다가, 블루아카이브를 최근에 시작했는데, 그덕분에 3일을 정말 쓰레기처럼 살았다. 이 게임은 해로운 게임이다. 하지만 난 월정액권을 결제했다. 크아아악
여러 블럭들이 상호데이터를 전송하기 위해 전기적으로 연결한 공유신호선
버스를 통해 데이터를 전송하기 위한 규칙
이번 강좌에서는, BUS보단 protocol 구현에 대해 공부하게 될 것.
모듈 A가 B로 신호를 보낸다 치자.
과연 이걸로 될까?
A->B로 VALID 신호를 함께 주는 것이 요구된다.
B->A로 ACK 신호를 회신하는 것이 요구된다.
이를 Handshake 라고 한다.
이를 skew 라고 한다.
이것은 Bus 설계에 있어서 major 한 문제인데,
Valid 신호를 d0~5까지 모두 안정화되었을 때 ON 시켜줘야 한다.
ACK는 받았다는 사실자체만 의미하지 "제대로" 받았는지를 의미하지는 않는다.
B가 받은 정보의 상태를 회신하기 위해 Status 신호를 회신한다.
이 때, B로부터 Status나 ACK이 오지 않으면 A는 1번 더 보내야하거나 에러처리를 별도로 할 수 있게끔 설계해야한다(당연)
Wait 시간동안 다른 자원이 Bus를 활용가능하도록 설계해야하며,
이러한 것은 Bus Utilization 향상이라고 말한다.
그리고 그 구현법은 여러가지가 있다.
묵시적으로 address가 ++로써 매우 간단한 동작일 때, 즉 인접한 주소면 시전가능하다.
보다시피 a는 첫 data를 1번만 보내고, module b가 알아서 처리하고있다.
CPU는 3GHz대인데 비해 DDR은 300MHz대이다.
그러므로 무지성으로 설계하면 CPU는 메모리에 읽거나 쓰는동안 메모리를 기다리게 된다.
따라서 CPU는 A0라는 주소를 요청날리고 다른 데이터에 대한 작업을 할 수 있게 해야한다.
Operation이 끝나지 않았는데도, 즉 ACK가 회신되지 않았는데도 다른 data에 access할 수 있게 하는 기능을 Multiple Outstanding이라고 한다.
별도로, Request 한 순서와 동일하지 않게 data return 을 수행하는 기능을 Out of Order Completion 이라고 한다.
당연히 아니다.
Decoder가 Centralized됨
Decoder가 Slave마다 Distributed됨
주소를 받아서 decoded address 로 바꿔준다.
종합하면 이러한 꼴이 된다.
DMA의 경우는 메모리를 옮기는 기능이므로 Master 의 일종으로 분류된다.
여러 Master가 있는데, 그 중 누가 쓸지를 "중재"해줘야 한다.
이를 Arbiter 가 한다.
마찬가지로,
한 방법이 각각 있다.
대략 아래 그래프와 같이 분류가능하다.
OS시간의 자원분배 이슈와 비슷한 고려사항을 안고있는 듯 하다.
대략 REQ 받으면 GRANT 신호가 떨어지고, GRANT 되면 버스를 점유할 수 있는 권리를 얻는, 저번시간에 배운 AMBA구조의 약식이다.
그러나 이 경우 Starvation이 발생하는데 REQ4는 REQ1에 의해 우선순위가 밀려서 GRT4가 GRT1에 ON을 뺏긴다.
여러 방법이 있지만,
한 번 버스를 쓴 상황이 있다면, 그 Request 는 Masking 을 해서 Priority 가 높더라도 기다리게끔 HW적으로 구현하는 방법이 있다.
Bus A의 M0이 Bus B의 Sy에, Bus B의 M3이 Bus A의 Sx에 접근하고자 한다.
이렇게 설계하면, HW적인 데드락이 발생할 수 있다.
버스를 효율적으로 쓰고자 할 때, 파이프라이닝이나 Overlapping 의 안이 나왔는데,
성능에 대한 관점을 다르게 하여
Latency 를 가능하면 줄이는 방향 또는 Bus가 데이터를 옮기는데 소요되는 Throughput을 줄이는 방향으로 초점을 다르게 맞춰 접근할 수도 있을 것이다.
만약 모듈이 빨리 움직여야 하면 Latency(=Speed).
DMA같이 대용량의 데이터 처리의 경우 Throughput
이 중요시되게 될 것이다(=Bandwidth).
이러한 사양의 요구유형을 Transfer Type 라고 하며 아래와 같다.
이는 Bus가 어떤 의도로 동작을 하는지를 구분할 수 있도록 한다.
예를 들어, 메모리로부터 데이터를 읽어서 프로세서의 캐시에 쓰고자 할 때는
버스입장에서는 Read지만, 결국 그 Read 는 Processor의 캐시에 쓰기 위함이기 때문에 Read For Write 라고 할 수 있다.
마찬가지로, AHB의 경우 NONSEQ냐 SEQ냐로 구분하며
SINGLE이냐 INCR이냐 WRAP이냐로 구분하여 Bus에 알려주어야만 하게끔 되어있다.
이렇게 하는 이유는 뭐냐면,
현재 수행중인 Data Type 을 버스가 알면 조금 더 효율적으로 관리가능하며 현재 무슨일이 벌어지는지를 버스에 연결된 다른 모듈이 인지하게 됨으로써 시스템 전체의 최적화에 도움이 되기 때문이다.
말그대로 참조하려고 하는 의도가 무엇인지를 Bus가 아는 방법을 의미한다.
DMA라면 burst 를 지원해야할테고,
CPU는 명령어 접근/데이터 접근에 따라 두 종류의 access 를 구분가능할테고, 따라서 더 세분화된 캐시가 필요할 것이다.
목적: Higher Throughput
수단: 인접한 데이터의 경우 한 번의 transfer로 시전가능하다.
필요정보:
이외에도 여러 기술이 있다.
=>요청한 순서와 회신된 순서가 안맞으면, 회신된 순서대로 버스 사용
=>공유자원인 Bus를 효율적으로 사용하기 위해 회신된 순서대로? 버스사용
(=>Out of Order Complete 와 무슨 차이인지 모르겠다. 일단 넘어감)
Bus가 data 를 어떻게 보내느냐에 따라 Justified/Nonjustified Bus로 구분된다.
문서작성시 왼쪽맞춤, 오른쪽맞춤처럼 align시키는 것.
그림처럼, 4-byte block이 아니라면 D[31:24]는 사용하지않음을 볼 수 있다.
0번째 Byte를 Access할 때, Address에 관련있는 Byte Ring 만
1-byte bus에도 전부 물려있기 때문에 Wrapper가 필요하다.
1Byte를 보낼 때, 4바이트 중 어느 바이트가 의미있는지 어케 아는가?
Byte Enable을 같이 보내서, 어느 바이트가 유효하고 안유효한지 표시
data[32]당 be[4] 필요
주소와 크기를 같이 보낸다.
data[32]당 size[2]와 addr[2]필요
생략
CPU 자체가 안나눠떨어지는 주소의 접근을 허용할 것인지?
아니면 컴파일러가 애초에 그런 주소를 안주게끔 할 것인지?
예를 들어, 은행서버에 동시에 read 및 돈 인출명령 request 를 내렸는데 1회만 차감되면 안될 것이다.
그러한 개념이다.
이러한 개념을 Bus에서도 지원해줘야 한다.
읽고쓰는 동안, 값을 바꾸는 동안의 타인의 접근을 차잔하기 위해
위와같이 LOCK 이라는 신호를 추가적으로 두게 된다.
이러한 신호를 위해 대부분의 Processor는 atomic 을 위한 명령어를 보유한다.
ex) ARM - SWAP, LDREX, STREX
Intel - lock inc, lock dec, ...