Ready/valid protocol은 data 전송 시 사용하 수 있는 심플하고 일반적인 handshake 방식이며, ABMA AXI에서 flow control을 위해 사용되는 signal이기도 하다.
Transmitter와 Receiver가 있다고 가정해보자.
data를 보내거나 받기 전에는 handshake 과정이 필수적이다.
Transmitter는 유효한(valid) data를 가지고 있어야 하며,
Receiver는 Data를 받기 위해 준비되어야(be ready) 한다.
즉 이 두 valid/ready 정보가 전부 asserted (active) 상태여야 데이터를 주고받을 수 있는 것이다. (*여기서 assert란 신호가 inactive -> active로 가는 것)
valid와 ready의 값에 따라 총 4가지의 상태가 존재한다. (표를 보고 이해하는 게 빠를 것 같다..)
상태 | ready | valid | 설명 |
---|---|---|---|
Idle | 0 | 0 | Transmitter가 valid data를 가지고 있지 않음. |
Wait for Ready | 0 | 1 | Transmitter가 valid data를 가지고 있지만 Receiver가 준비되지 않음. 이 때는 Data가 전송되면 안 됨. |
Wait for Valid | 1 | 0 | Receiver가 data를 전달받을 준비가 되었지만 transmitter가 가지고있지 않음. |
Transfer | 1 | 1 | Transmitter가 valid data를 가지고 있고, Receiver가 준비됨. Data 전송 가능. |
그리고 AMBA specification에서는 READY/VALID 동작에 대해 두 가지 동작이 나와있는데,
1) transmitter는 VALID를 assert하기 전까지 READY를 기다리지 말아야 함.
2) 한 번 VALID가 assert되고 나면 handshake가 일어나기 전까지는 계속 그 상태(asserted)를 유지해야 한다. 즉 VALID와 READY가 둘 다 rising clock에서 asserted되었을 때까지는 유지해야 한다.
첫 번째 규칙은 성능 요구사항에 의한 것이다. 무작정 기다리면 성능 loss가 발생하기 때문에 ready와 valid 시그널은 반드시 독립적이어야 한다.
두 번째 규칙은 Ready 상태에서 벗어나기 위한 제약이다. 일단 transmitter가 valid data를 가지면 전송 규칙을 어기면 안 된다. receiver가 ready 상태가 될 때까지는 기다려야 한다.