Статические последовательные примитивы
Поведение статических [реагирующих на уровень сигнала] примитивов представляется тем же самым способом, как это делается для комбинационных схем, за исключением того, что выход объявляется регистрового типа, а в строках таблицы имеется дополнительное поле. Это поле представляет текущее состояние примитива.
- Выход объявляется регистром для индикации внутреннего состояния. Значение выхода всегда совпадает с внутренним состоянием.
- Добавляется поле для текущего состояния. Это поле отделяется двоеточием от входов и выходов.
Последовательные примитивы имеют дополнительное поле, вставляемое между входным и выходным полями, если сравнивать с комбинационными UDP. Оно представляет текущее состояние примитива и определяет эквивалент состояния выхода. Отделяется двоеточиями.
Verilog Code:
primitive udp_seq (.....); table 0 0 0 : 0 : 0; ... endtable endprimitive
Пример
Verilog Code:
primitive udp_latch(q, clk, d) ; output q; input clk, d; reg q; table //clk d q q+ 0 1 : ? : 1 ; 0 0 : ? : 0 ; 1 ? : ? : - ; endtable endprimitive
Динамические примитивы
В статических схемах значений входов и текущего состояния достаточно для описания состояния выходов. Динамические отличаются от статических тем, что их состояние изменяется в момент перепада фронтов входных сигналов.
Как и в комбинационных и статических примитивах, ? означает итерацию по значениям 0, 1, и x. Тире (−) в колонке выхода показывает, что значение выхода не изменяется.
Все не описанные переходы по умолчанию означают, что на выходе будет x. Следовательно, в предыдущем примере переход тактового сигнала от 0 к x с данными 0 и текущим состоянием 1 приводит к 1 на прямом выходе и x на выходе q.
Все переходы, не имеющие влияния на выход, должны быть явно описаны. В противном случае, они приведут выход к состоянию x. Если примитив днамический по любому из входов, желательный переход должен быть описан для всех фронтов сигнала на входах.
Пример
Verilog Code:
primitive udp_sequential(q, clk, d); output q; input clk, d; reg q; table // выход изменяется передним фронтом clk // clk d q q+ (01) 0 : ? : 0 ; (01) 1 : ? : 1 ; (0?) 1 : 1 : 1 ; (0?) 0 : 0 : 0 ; // игнорируем спад импульса clk (?0) ? : ? : - ; // игнорируем изменение d в установившемся состоянии clk ? (??) : ? : - ; endtable endprimitive
Пример примитва с initial
Verilog Code:
primitive udp_sequential_initial(q, clk, d); output q; input clk, d; reg q; initial begin q = 0; end table // вход изменяется передним фронтом clk // clk d q q+ (01) 0 : ? : 0 ; (01) 1 : ? : 1 ; (0?) 1 : 1 : 1 ; (0?) 0 : 0 : 0 ; // игнорируем спад импульса clk (?0) ? : ? : - ; // игнорируем изменение d в установившемся состоянии clk ? (??) : ? : - ; endtable endprimitive