Сраный верилог
.pdf- 2 -
Элементы языка Verilog
Данная глава посвящена описанию таких элементов языка Verilog, как идентификаторы, константы, директивы компилятора и пр.
В первую очередь, задача этой главы состоит в формировании представления о наборе средств языка Verilog, более подробное рассмотрение особенностей применения которых будет осуществлено в следующих главах.
Большинство синтаксических конструкций язык описания оборудования Verilog унаследовал от языка Си. Программа на языке Verilog представляет собой поток литералов (последовательностей символов ASCII-кода), интерпретирующихся как комментарии, разделители, числа, строки, идентификаторы и ключевые слова. В отличие от VHDL, язык Verilog чувствителен к регистру. Все ключевые слова Verilog набираются в нижнем регистре.
2.1. Комментарии в языке Verilog
Существенно повысить читаемость и понятность программного кода позволяет широкое использование комментариев, которые устанавливаются в произвольном месте программы и могут содержать любые возможные символы (в том числе и знаки кириллицы). Во время компиляции комментарии игнорируются, поэтому их можно также применять для временного отключения фрагментов программы (при отладке программы без удаления фрагментов). Во многих организациях приняты внутренние стандарты для сопровождения программ ком-
24 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
ментариями. Например, среда Active-HDL в автоматически генерируемые модули добавляет комментарии, содержащие стандартный заголовок для программы следующего вида:
//-------------------------------------------------
//
//Title : Full_Adder
//Design : Verilog_book
//Author : serh_syd
//Company : NPK_SIGNAL
//-------------------------------------------------
//File : a.v
//Generated : Wed Jul 28 15:41:01 2002
//From : interface description file
//By : Itf2Vhdl ver. 1.20
//
//-------------------------------------------------
//
// Description :
//
//-------------------------------------------------
При этом информация о компании, авторе и т.п. берется средой Active-HDL автоматически из данных операционной системы.
Синтаксические правила по созданию комментариев состоят в следующем.
Пара символов « // » начинает комментарий, заканчивающийся вместе с окончанием текущей строки. Для получения многострочных комментариев возможно использование пар символов « /* » (открытие комментария) и « */ » (закрытие комментария). Ниже приведены примеры использования комментариев обоих типов:
// Комментарий от начала строки до конца assign a = z // Комментарий до конца строки
§Учебное2. Элементыпособиеязыка Verilog |
25 |
|
/* |
Комментарий Комментарий */ |
|
/* |
Многострочный комментарий, с помощью которого удобно времен- |
но отключать фрагменты программы module Reg01 (a, b, c)
assign a = 1; */
В языке Verilog не допускается наличие в программе конструкций, содержащих вложенные комментарии второго типа, подобно ниже приведенному фрагменту:
/* ++ /* неправильный вложенный комментарий */ ++ */
В то же время комбинация различных типов комментариев допустима:
/* Внешний
//и правильный вложенный комментарий */
//Еще один /* правильный вложенный комментарий */
Учебное пособие |
25 |
2.2. Операции
Операции в языке Verilog различаются по числу операндов – унарные, бинарные и тернарные. Унарные операции в выражениях предшествуют операнду, например:
A = ~B; // ~ это унарная логическая операция НЕ, // B – это операнд
Знаки бинарных операций помещаются между операндами:
A = B + С; // + это бинарная операция, B, С – это операнды
Полное описание операций и методов их использования представлено в разделе 4.1.
26 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
.
2.3. Числовые константы
Язык Verilog позволяет задавать числовые константы двумя способами – с указанием разрядности и без указания разрядности.
В первом случае число представляется следующим образом:
<Разрядность>'<Основание><Число>
<Разрядность> – это записанная в десятичном представлении разрядность константы (число бит).
<Основание> – задает систему счисления, в которой записывается константа, при этом допускаются следующие варианты: десятичная система ('d или 'D), шестнадцатеричная ('h или 'H), двоичная ('b или 'B) и восьмеричная ('o или 'O).
<Число> – строковое представление числовой константы (последовательность цифр из набора 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f).
Символы верхнего регистра также разрешены для использования в шестнадцатеричных числах.
Ниже представлены примеры числовых констант с заданной разрядностью:
8'b01011100
12'hF00
8'd123
Числовые константы, в которых не задана система счисления, рассматриваются как десятичные. Если в числовой константе не указана разрядность, то принимается число бит, установленное в системе по умолчанию. В этом случае разрядность зависит от конкретной реализации Verilog-компилятора (обычно это число равно 32). Примеры таких числовых констант:
Учебное§ 2. Элементыпособиеязыка Verilog |
27 |
|
26781 |
// 32-битное десятичное (по умолчанию) число |
|
'hAE |
// 32-битное шестнадцатеричное число |
|
В связи со спецификой языка Verilog как языка описания оборудования в его состав введены специальные средства для представления реальных процессов передачи сигналов в электронных системах.
К таким средствам относятся специальные литералы x и z. Первый из них обозначает «неизвестное значение сигнала», кото-
рое возникает в ряде случаев, например, до первого присваивания сигналу значения, при наложении сигналов, при отключении источника на некоторых типах шин и т.п.
Константа z используется для обозначения высокого импеданса (также называемого третьим состоянием). Это значение используется при организации одновременной работы нескольких источников на одну и ту же шину. Более подробно применение данной константы описано в разделе 3.5.
Литералы x и z могут использоваться в двоичных, восьмеричных
ишестнадцатеричных числовых константах одновременно с другими допустимыми цифрами. При этом в зависимости от системы счисления литералы x и z занимают 1, 3 и 4 двоичных разряда, соответственно. Например, константа 8'h4x при переводе в двоичную форму примет вид 8'b0100xxxx, число 12'o4xz5 соответствует числу 12'b100xxxzzz101
ит.д. Если старший значащий разряд числа равен x или z, то все разряды, расположенные левее старшего, заполняются соответствующим литералом. Если старший значащий разряд равен 0 или 1, то число дополняется нулями, например:
16'bx010 = 16'bxxxxxxxxxxxxx010 12'hxF = 12'bxxxxxxxx1111 32'd136 = 32'b0000000010000100
Это позволяет довольно просто заполнить нулями, x или z целый вектор.
Отрицательные числа в языке Verilog образуются прибавлением унарного минуса перед числовой константой:
28 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
-8'd15 -'hF000
Для двоичного представления отрицательные числа транслируются в дополнительный код [8, 14].
Кроме того, числовые константы могут содержать знак подчеркивания «_», который игнорируется при компиляции, однако позволяет облегчить читаемость программного кода:
32'b0010_1011_0000_1010_0100_1000_0000_0000
Для этой же цели служит вопросительный знак «?», который воспринимается компилятором как высокий импеданс (z).
28 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
2.4. Строковые константы
Строки в Verilog представляют собой последовательности ASCIIсимволов, с двух сторон охваченные парными кавычками. Строки не могут включать знак переноса каретки (то есть занимать больше одной экранной строки). Например:
"Это корректная строковая константа"
"А это некорректная строковая константа в Verilog, потому что состоит из двух экранных строк"
28 |
Verilog-HDL для моделирования и синтеза цифровых электронных схем |
2.5. Идентификаторы и ключевые слова
Идентификаторы, как и в любом другом языке программирования, позволяют обозначать объекты уникальными именами и ссылаться на них в других частях программы. Идентификаторы могут состоять из латинских букв верхнего и нижнего регистра, цифр, а также знаков подчеркивания «_» и знака доллара «$». Любой идентификатор обязательно должен начинаться с буквы или знака подчеркивания, так как идентификаторы, начинающиеся с цифры, рассматриваются компилятором как числовые константы, а идентификаторы, начинающиеся со знака $, зарезервированы для системных целей.
Учебное§ 2. Элементыпособиеязыка Verilog |
29 |
Язык Verilog, в отличие от многих других языков, чувствителен к регистру литералов, поэтому, например, идентификаторы Data и DATA являются различными.
Ряд идентификаторов, использующихся для построения языковых конструкций, зарезервирован компилятором. Такие идентификаторы называются ключевыми словами. Их полный список приведен ниже:
always |
highz1 |
rtran |
and |
if |
rtranif0 |
assign |
initial |
rtranif1 |
begin |
inout |
scalared |
buf |
input |
small |
bufif0 |
integer |
specify |
bufif1 |
join |
specparam |
case |
large |
strong0 |
casex |
macromodule |
strong1 |
casez |
mediummodule |
supply0 |
cmos |
nand |
supply1 |
deassign |
negedge |
table |
default |
nmos |
task |
defparam |
nor |
time |
disable |
not |
tran |
edge |
notif0 |
tranif0 |
else |
notif1 |
tranif1 |
end |
or |
tri |
endcase |
output |
tri0 |
endfunction |
pmos |
tri1 |
endmodule |
posedge |
triand |
endprimitive |
primitive |
trior |
endspecify |
pull0 |
vectored |
endtable |
pull1 |
wait |
endtask |
pulldown |
wand |
event |
pullup |
weak0 |
for |
rcmos |
weak1 |
force |
reg |
while |
forever |
release |
wire |
fork |
repeat |
wor |
function |
rnmos |
xnor |
highz0 |
rpmos |
xor |