2016-07-12

vak: (Улыбка)
Регистр в подходе NCL logic выглядит так:



Попробуем изобразить его на Верилоге. Трудность в том, что Верилог не даёт простого способа обозначить Dual Rail encoding, то есть сигналы, представленные в виде пары проводов. Один из вариантов - задействовать состояние X, приписав ему другую семантику. Будем считать, что X - это когда оба провода логического сигнала принимают значения Low (то есть NULL). В этом случае асинхронный регистр может выглядеть так:

module areg #(
    parameter WIDTH = 2             // ширина регистра
)(
    input  wire             reset,  // сброс
    input  wire [WIDTH-1:0] d,      // данные на входе
    input  wire             ki,     // вход подтверждения
    output reg  [WIDTH-1:0] q,      // данные на выходе
    output wire             ko      // выход подтверждения
);
    always @(*) begin
        if (reset)
            q <= {WIDTH{1'bx}};     // при сбросе выдаём NULL
        else if (ki)
            q <= d;                 // защёлкиваем вход (возможно, содержащий NULL-и)
        else for (i=0; i<WIDTH; i=i+1)
            if (d[i] === 1'bx)
                q[i] <= 1'bx;       // сбрасываем выход в NULL

    assign ko = (^q === 1'bx);      // выдаём подтверждение, пока выход не полностью определён
endmodule
Не знаю пока, вылезут ли грабли при симуляции из-за нештатного использования состояния X, или прокатит.