Асинхронный регистр
2016-07-12 21:19Регистр в подходе NCL logic выглядит так:

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

Попробуем изобразить его на Верилоге. Трудность в том, что Верилог не даёт простого способа обозначить 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, или прокатит.