![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Продолжаю постигать азы асинхронной логики. Про сигналы и базовый протокол взаимодействия я уже писал. Но то были теоретические рассуждения, а теперь пора заняться реальным кодом. Для описания асинхронных каналов задействуем конструкцию interface языка SystemVerilog. Будет использовать кодирование dual-rail. Адаптировать для quad-rail или 1-of-N будет нетрудно.
Существует три типа асинхронных каналов: push, pull и nonput. В первом случае активная сторона (мастер) выдаёт данные, а пассивная (slave) отвечает подтверждением:
Существует три типа асинхронных каналов: push, pull и nonput. В первом случае активная сторона (мастер) выдаёт данные, а пассивная (slave) отвечает подтверждением:
_______ ______ | data | Master | ======> | Slave output | | input | req | _______| <------ |______Второй вариант - канал типа pull. Здесь мастер выдаёт запрос, а в ответ приходят данные:
_______ ______ | req | Master | ------> | Slave input | | output | data | _______| <====== |______Каналы push и pull с кодированием dual rail ширины N бит можно описать следующим образом:
interface dual_rail #(parameter N = 1); logic [N-1:0] hidata; // Positive rail logic [N-1:0] lodata; // Negative rail logic req; // Request for pull channel modport master_output( // Active push channel. output hidata, output lodata, input req ); modport master_input( // Active pull channel. output req, input hidata, input lodata ); modport slave_input( // Passive push channel input hidata, input lodata, output req ); modport slave_output( // Passive pull channel input req, output hidata, output lodata ); endinterfaceТретий тип канала называют nonput или sync. Он не передаёт данные, и состоит всего из двух проводов. Мастер посылает запрос, slave отвечает:
_______ ______ | req | | ------> | Master | | Slave | ack | _______| <------ |______Описание интерфейса на Системверилоге:
interface sync; logic req; // Request logic ack; // Acknowledge modport master( // Active channel output req, input ack ); modport slave( // Passive channel input req, output ack ); endinterface
странно
Date: 2017-02-02 11:33 (UTC)Re: странно
Date: 2017-02-02 19:14 (UTC)https://vak.dreamwidth.org/403847.html
Re: странно
Date: 2017-02-02 21:49 (UTC)что касается монотонности, то не очень понятно, как это систематически провести. Невозможно ведь монотонно преобразовать сигнал из 0/1 в 01/10 монотонно - если же все сигналы хранить в такой кодировке, то тогда монотонность фактически утрачивается, и всякую функцию можно считать монотонноой...
Re: странно
Date: 2017-02-03 06:50 (UTC)