Отрабатываем протокол valid/ready и конвейеры на микроархитектурном тренажере
![e1b17f606dfa324f5ee095440e42f73b.png](https://habrastorage.org/getpro/habr/upload_files/e1b/17f/606/e1b17f606dfa324f5ee095440e42f73b.png)
Чем хорош FPGA-хаб на Хабре это еще и тем что тема протокола valid/ready время от времени тут всплывает. И это действительно важно так как valid/ready является одним из основных протоколов организации управления потоком (flow-control). Понимание valid/ready для микроархитектора так же необходимо как необходимо понимание закона ома электрику.
Да вот только проблема в том что, существует крайне мало литературы на эту тему. А в тех немногих книгах, разные авторы, как правило, толкуют концепцию valid/ready приводя в пример частные случаи его использования.
Так некоторые авторы трактуют ready как (read enable) то есть необходимое условие для получения valid данных от приемника. Другие же говорят что ready это как бы подтверждение принятых данных приемником и начинают трактовать всю концепцию valid/ready как некий аналог механизма работающего по схеме «запрос/подтверждение». Третьи все это дело привязывают к AXI-stream который в принципе даже не протокол, а интерфейс, где приемник может быть «не жадным» — то есть не давать ready по умолчанию. Четвертые ожидают valid на интерфейсе передатчика и дополнительно регистрируют valid данные в регистре внедряя сложную логику с конечными автоматами которая, как правило, не позволяет передавать данные между приемником и потребителем в каждом такте. И так далее.
Фишка в том что valid/ready в принципе может трансформироваться в каждый из этих приведенных частных случаев.
Так откуда все эти сложности с объяснением простого протокола состоящего всего из двух сигналов?
Вообще, не проще ли объяснять протокол valid/ready не на уровне регистровых передач, а немного абстрагировавшись, на уровне передач между очередями (FIFO)? Очередь так же как и регистр является хранилищем данных и при этом, такие две важные концепции flow-control как валидность данных и backpressure уже по определению ассоциированы с понятием «очередь».
На прошлом занятии мы как раз отработали концепцию очереди FIFO на микроархитектурном тренажере — hdlgadgets. В этот раз мы возьмем два FIFO буфера (которые образуют конвейер с valid/ready рукопожатиями) и будем менять flow-control логику конвейера.
Мы покажем что valid/ready это не только механизм передачи данных от одной очереди к другой, но еще и метод для организации разного рода логического функционала между очередями.
Если до этого момента вы не сталкивались с протоколом valid/ready, то будете приятно удивлены как легким движением руки (а если точнее, написанием пары строк на верилоге) мы можем реализовывать разного рода функционал взяв за основу конвейер из двух FIFO.
В общем, смотрим видео, устанавливаем тренажер, практикуемся с верилогом. Вопросы и комментарии постим в комментах.