vak: (Default)
[personal profile] vak
Продолжаю постигать азы асинхронной логики. Про сигналы и базовый протокол взаимодействия я уже писал. Но то были теоретические рассуждения, а теперь пора заняться реальным кодом. Для описания асинхронных каналов задействуем конструкцию interface языка SystemVerilog. Будет использовать кодирование dual-rail. Адаптировать для quad-rail или 1-of-N будет нетрудно.

Существует три типа асинхронных каналов: 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)
From: [personal profile] a_shen
казалось бы, каждая сторона должна как-то сигнализировать о том, что пришли новые данные, или что предыдущие данные уже считаны?

Re: странно

Date: 2017-02-02 21:49 (UTC)
From: [personal profile] a_shen
ну да, в принципе можно сказать, что появление ненуля на одном из входов является запросом на передачу данных.

что касается монотонности, то не очень понятно, как это систематически провести. Невозможно ведь монотонно преобразовать сигнал из 0/1 в 01/10 монотонно - если же все сигналы хранить в такой кодировке, то тогда монотонность фактически утрачивается, и всякую функцию можно считать монотонноой...
OSZAR »