Введение
Verilog имеет встроенные примитивы: логические и передаточные вентили и ключи. Они редко используются в проектировании, но являются основным материалом при синтезе для моделирования заказных микросхем и ячеек микросхем программируемой логики, которые затем используются на уровне симуляции логики или того, что называется симуляцией SDF. Утилиты синтеза также производят нетлист, импортируемый в утилиты трассировки, что Verilog относит к уровню логических примитивов.
Логические примитивы

Логические вентили имеют один скалярный выход и несколько скалярных входов. Первый терминал в списке терминалов вентиля является выходом, остальные входами.
|
Логика |
Описание |
|
and |
Элемент И |
|
nand |
Элемент И-НЕ |
|
or |
Элемент ИЛИ |
|
nor |
Элемент ИЛИ-НЕ |
|
xor |
Элемент XOR (исключающие ИЛИ) |
|
xnor |
Элемент XNOR (инверсия исключающего ИЛИ) |
Пример.
Verilog Code:
module gates(); wire out0; wire out1; wire out2; reg in1,in2,in3,in4; not U1(out0,in1); and U2(out1,in1,in2,in3,in4); xor U3(out2,in1,in2,in3); initial begin $monitor( "in1=%b in2=%b in3=%b in4=%b out0=%b out1=%b out2=%b", in1,in2,in3,in4,out0,out1,out2); in1 = 0; in2 = 0; in3 = 0; in4 = 0; #1 in1 = 1; #1 in2 = 1; #1 in3 = 1; #1 in4 = 1; #1 $finish; end endmodule
Вывод симулятора
Code:
<span style="color: black; font-size: small;"> in1 = 0 in2 = 0 in3 = 0 in4 = 0 out0 = 1 out1 = 0 out2 = 0 in1 = 1 in2 = 0 in3 = 0 in4 = 0 out0 = 0 out1 = 0 out2 = 1 in1 = 1 in2 = 1 in3 = 0 in4 = 0 out0 = 0 out1 = 0 out2 = 0 in1 = 1 in2 = 1 in3 = 1 in4 = 0 out0 = 0 out1 = 0 out2 = 1 in1 = 1 in2 = 1 in3 = 1 in4 = 1 out0 = 0 out1 = 1 out2 = 1</span>
Передаточные элементы логики (буферы)
Передаточные вентили двунаправленные и могут быть резистивными и нерезистивными.
Синтаксис: keyword unique_name(inout1, inout2, control)

|
Элемент |
Описание |
|
not |
N-выходной инвертор |
|
buf |
N-выходной буфер |
|
bufif0 |
Буфер с тремя состояниями, активный низкий разрешающий. |
|
bufif1 |
Буфер с тремя состояниями, активный высокий разрешающий. |
|
notif0 |
Инвертер с тремя состояниями, активный низкий разрешающий. |
|
notif1 |
Инвертер с тремя состояниями, активный высокий разрешающий. |
Передаточные вентили tran и tran постоянно включены и не имеют управляющих линии. Tran можно использовать для сопряжения двух линий с отдельными источниками сигналов, а rtran-для ослабления сигналов.
Пример.
Verilog Code:
module transmission_gates(); reg data_enable_low, in; wire data_bus, out1, out2; bufif0 U1(data_bus,in, data_enable_low); buf U2(out1,in); not U3(out2,in); initial begin $monitor( "@%g in=%b data_enable_low=%b out1=%b out2= b data_bus=%b", $time, in, data_enable_low, out1, out2, data_bus); data_enable_low = 0; in = 0; #4 data_enable_low = 1; #8 $finish; end always #2 in = ~in; endmodule
Code:
<span style="color: black; font-size: small;"> @0 in = 0 data_enable_low = 0 out1 = 0 out2 = 1 data_bus = 0 @2 in = 1 data_enable_low = 0 out1 = 1 out2 = 0 data_bus = 1 @4 in = 0 data_enable_low = 1 out1 = 0 out2 = 1 data_bus = z @6 in = 1 data_enable_low = 1 out1 = 1 out2 = 0 data_bus = z @8 in = 0 data_enable_low = 1 out1 = 0 out2 = 1 data_bus = z @10 in = 1 data_enable_low = 1 out1 = 1 out2 = 0 data_bus = z</span>
Примитивы ключей
В Verilog используются шесть различных примитивов переключателей (модели транзисторов), nmos, pmos и cmos и соответствующие три резистивные версии rnmos, rpmos и rcmos. Переключатели типа cmos имеют два затвора и поэтому имеют два управляющих сигнала.
Синтаксис: keyword unique_name (drain. source, gate)

|
Логика |
Описание |
|
pmos |
Однонаправленный PMOS ключ |
|
rpmos |
Резистивный PMOS ключ |
|
nmos |
Однонаправленный NMOS ключ |
|
rnmos |
Резистивный NMOS ключ |
|
cmos |
Однонаправленный CMOS ключ |
|
rcmos |
Резистивный CMOS ключ |
|
tranif1 |
Двунаправленный транзистор (H) |
|
tranif0 |
Двунаправленный транзистор (L) |
|
rtranif1 |
Резистивный транзистор (H) |
|
rtranif0 |
Резистивный транзистор (L) |
|
tran |
Двунаправленный проходной транзистор |
|
rtran |
Резистивный проходной транзистор |
|
pullup |
Подтягивающий резистор к питанию |
|
pulldown |
Подтягивающий резистор к земле |
Передаточные вентили являются двунаправленными и могут быть резистивными или нерезистивными. Резистивные устройства уменьшают уровень сигнала, который появляется на выходе, к одному уровню. Все переключатели только передают сигналы от истока к стоку, неправильное подключение вентилей приведет к высокоимпедансным выходам.
Пример.
Verilog Code:
module switch_primitives(); wire net1, net2, net3; wire net4, net5, net6; tranif0 my_gate1 (net1, net2, net3); rtranif1 my_gate2 (net4, net5, net6); endmodule
Передаточные вентили tran и rtran постоянно подключены и не имеют управляющих линий. Tran может использоваться как интерфейс между двумя линиями с разными источниками, а rtran используется для ослабления сигналов. Устройства на сопротивлениях согласуют уровни сигналов. Все ключи передают сигналы от истока к стоку, неправильное подключение приведет к высокоимпедансному состоянию выходов.
Логические значения и уровни сигналов
Verilog различает четыре логических уровня:
|
Логический уровень |
Описание |
|
0 |
ноль, низкий, ложно |
|
1 |
единица, высокий, истина |
|
z or Z |
высокий импеданс, плавающий |
|
x or X |
неизвестно, не инициализирован, конфликт уровней |
Физические уровни в Verilog
|
Уровень сигнала |
Ключевое слово описания |
|
7 Соединен с шиной |
supply0 supply1 |
|
6 Сильная подтяжка |
strong0 strong1 |
|
5 Обычная подтяжка |
pull0 pull1 |
|
4 Большая емкость |
large |
|
3 Слабая подтяжка |
weak 0 weak1 |
|
2 Средняя емкость |
medium |
|
1 Малая емкость |
small |
|
0 Высокий импеданс |
highz0 highz1 |
Пример 1.

Два буфера с выходом
A : Подтяжка к 1
B : Замкнут на землю 0
Поскольку замыкание на землю сильнее подтяжки к 1, выход C принимает значение B.
Пример 2.

Два буфера имеют выход
A : Замкнут на питание 1
B : Большая емкость 1
Поскольку питание приоритетнее большой емкости 1, выход C будет иметь значение A