Комбинационные примитивы
В комбинационных примитивах, выход определяется как функция от текущего состояния входа. При любых изменениях входного состояния, выход вычисляется по соответствующей имеющейся строке в таблице функции примитива.
Комбинационные примитивы имеют один набор значений для каждого входного состояния, и соответствующее поле для значения выхода. Поле для записи значений входов отделяется от поля выхода двоеточием. Каждая строка таблицы завершается точкой с запятой. Например, следующая таблица состояний описывает три входа с нулевыми состояниями, и нулевой выход.
Verilog Code:
primitive udp_combo (.....); table 0 0 0 : 0; ... endtable endprimitive
Порядок входов в таблице состояний должен соответствовать порядку входов в списке портов в заголовке примитива. Это не относится к порядку объявлений входов.
Каждая строка таблицы описывает частную комбинацию состояний входов. Если все входы описаны как x [неопределенное состояние], то выход также получит состояние x. Все наборы входных сигналов, которые явно не описаны, приведут к x на выходе.
Пример
В примере ниже, ? представляет безразличное условие. Этот символ показывает итеративную замену 1, 0, и X. Его вхождение в строку таблицы означает, что когда входы имеют состояние 0 и 1, выход имеет состояние 1, независимо от значения текущего состояния.
Вы не описываете все возможные входные состояния. Все комбинации, не указанные явно, по умолчанию приводят выход в состояние X.
Недопустимо иметь одни и те же входные комбинации, определяющие различные состояния выхода. [Так как это противоречит математическому определению функции.]
Verilog Code:
// Пример кода с описанием функции primitive udp_body ( a, // Port a b, // Port b c // Port c ); output a; input b,c; // Код функции примитива // A = B | C; table // B C : A ? 1 : 1; 1 ? : 1; 0 0 : 0; endtable endprimitive
Тест кода udp_body
Verilog Code:
`include "udp_body.v" module udp_body_tb(); reg b,c; wire a; udp_body udp (a,b,c); initial begin $monitor(" B = %b C = %b A = %b",b,c,a); b = 0; c = 0; #1 b = 1; #1 b = 0; #1 c = 1; #1 b = 1'bx; #1 c = 0; #1 b = 1; #1 c = 1'bx; #1 b = 0; #1 $finish; end endmodule
Code:
<span style="color: black; font-size: small;"> B = 0 C = 0 A = 0 B = 1 C = 0 A = 1 B = 0 C = 0 A = 0 B = 0 C = 1 A = 1 B = x C = 1 A = 1 B = x C = 0 A = x B = 1 C = 0 A = 1 B = 1 C = x A = 1 B = 0 C = x A = x</span>