Лексические соглашения
Основные лексические соглашения, используемые в Verilog HDL (Hardware Description Language - язык описания аппаратуры), подобны тем, которые применяются в языке программирования C. Verilog HDL чувствителен к регистру символов. Все его ключевые слова пишутся в нижнем регистре.
Разделители
Множество разделителей состоит из пробела, табуляции, и управляющих символов новой строки и перевода формата. Эти символы игнорируются, за исключением тех случаев, когда они разделяют другие лексемы. При этом, однако, пробелы и табуляция являются составной частью строки.
Разделители:
- Пробел
- Табуляция
- Символ возврата каретки
- Символ разрыва строки / Новая строка
- Символ прогона страницы.
Примеры с разделителями
функционально эквивалентный код.
Плохой код: не стоит писать подобный:
Verilog Code:
module addbit(a,b,ci,sum,co); input a,b,ci;output sum co; wire a,b,ci,sum,co;endmodule
Хороший код: правильный способ писать код.
Verilog Code:
module addbit ( a, b, ci, sum, co); input a; input b; input ci; output sum; output co; wire a; wire b; wire ci; wire sum; wire co; endmodule
Комментарии
Есть два способа написания комментариев [как в языке C].
- Однострочный комментарий начинается лексемой // и заканчивается переводом строки
- Многострочный начинается с /* и заканчивается */
Автор предпочитает однострочные комментарии [многострочный комментарий относится к стилю языка C) или микропроцессоры, содержащие тысячи транзисторов. Поэтому традиционный 70-х годов прошлого века].
Примеры комментариев
Verilog Code:
/* Это пример многострочного комментария*/ module addbit ( a, b, ci, sum, co); // Входные порты, однострочный комментарий input a; input b; input ci; // Выходные порты output sum; output co; // Типы данных wire a; wire b; wire ci; wire sum; wire co; endmodule
Регистр символов
Verilog [как уже говорилось] различает регистр символов.
- Символы верхнего и нижнего регистров считаются различными.
- Все ключевые слова Verilog записываются в нижнем регистре.
Verilog Code:
input //Ключевое слово языка Verilog wire //Ключевое слово языка Verilog WIRE //Уникальное имя (не ключевое слово) Wire //Уникальное имя (не ключевое слово)
ПРИМЕЧАНИЕ: Никогда не используйте ключевые слова в качестве имен, даже подменяя регистр на верхний.
Идентификаторы
Идентификаторы - это имена, присвоенные объектам, таким как регистры, функции или модули, на которые можно ссылаться из других мест описания.
- Идентификаторы должны начинаться с алфавитного символа или символа подчёркивания (a-z A-Z _ )
- Идентификаторы могут содержать буквы, числа, символ подчёркивания и знак доллара (a-z A-Z 0-9 _ $ ).
- Идентификаторы могут содержать до 1024 символов.
Примеры стандартных идентификаторов
data_input mu
clk_input my$clk
i386 A
Изолированные идентификаторы
Verilog HDL допускает изоляцию (escaping) любой буквы в идентификаторе. Изоляция позволяет добавлять в идентификатор любой печатаемый символ ASC (десятичные значения 33 до 126 или 21 до 7Е в шестнадцатеричной системе исчисления)
- Изолированный идентификатор начинается с обратного слеша (\).
- Идентификатор изолируется обратным слешем полностью.
- Конец изолированного идентификатора находится перед разделителем. Символы запятой, круглой скобки и точки с запятой являются частью идентификатора, если они не отделяются от него разделителем.
- Отделяйте изолированные идентификаторы разделителями, иначе символы, которые должны следовать за ними, станут их частью!
Примеры изолированных идентификаторов
Verilog не допускает идентификаторов, начинающихся с цифры [обычное правило для имен переменных во многих языках программирования]. Если же вы захотите обойти это правило, то можете использовать изоляцию обратным слешем, как показано ниже.
Verilog Code:
//Изолированные идентификаторы должны /отделяться от других символов разделителем module \1dff ( q, // Q выход \q~ , // Q_out выход d, // D вход cl$k, // CLOCK вход \reset* // Reset вход ); input d, cl$k, \reset* ; output q, \q~ ; endmodule
Числа в Verilog
Числа (константы) могут использоваться в десятичном, шестнадцатеричном, восьмеричном или двоичном формате. Отрицательные числа представляются в двоичном дополнительном коде. При использовании чисел, вопросительный знак (?) является альтернативой символу z. Символ подчеркивания (_) допустим в числах всюду, за исключением самой первой позиции, где он будет игнорироваться.
Целые числа
Verilog HDL позволяет использовать целые числа в виде:
- Числа переменного размера (до 32 бит)
- С основаниями системы 2, 8, 10, 16
- Основание и шестнадцатеричные цифры (a,b,c,d,e,f) нечувствительны к регистру символов
- Между размером, основанием и значением допускаются разделители
Синтаксис: <размер>'<основание><значение>
Пример целых чисел
Целое число |
Записывается как |
1 |
00000000000000000000000000000001 |
8'hAA |
10101010 |
6'b10_0011 |
100011 |
'hF |
00000000000000000000000000001111 |
В Verilog разряды числа заполняются справа-налево
- При переполнении числа старшие значащие биты отбрасываются
- При недополнении - старшие значащие биты дополняются по следующим правилам:
- Крайний левый разряд '0' или '1' дополняется '0'
- Крайний левый разряд 'Z' дополняется 'Z'
- Крайний левый разряд 'X' дополняется 'X'
Примечание: X означает неизвестное; Z – высокоимпедансное состояние; 1 – высокий логический уровень, 1; или 1 и 0 – низкий логический уровень, 0.
Пример целых чисел
Целое число |
Записывается как |
6'hCA |
001010 |
6'hA |
001010 |
16'bZ |
ZZZZZZZZZZZZZZZZ |
8'bx |
xxxxxxxx |
Вещественные числа
- Язык Verilog поддерживает вещественные константы и переменные.
- Вещественные числа преобразуются в целые с округлением.
- Вещественные числа не содержат значений Z и X
- Вещественные числа могут быть записаны в десятичной или научной нотации.
- <целое>.<дробная часть>
- <мантисса>E<показатель>
- Вещественные числа округляются до ближайшего целого при преобразовании.
Примеры вещественных чисел
Действительное число |
Десятичное представление |
1.2 |
1.2 |
0.6 |
0.6 |
3.5E6 |
3,500000.0 |
Знаковые и беззнаковые числа
Verilog поддерживает оба типа чисел, но с некоторыми ограничениями. В отличие от языка N мы не можем использовать явное указание типа int или uint для указания знаковости или беззнаковости числа. Любое число не имеющее минуса в префиксе будет считаться положительным или, неявным образом, беззнаковым.
Отрицательные числа задаются указанием знака минус перед числом-константой, что делает это число отрицательным. Verilog представляет такие числа в двоичном дополнительном коде. Опциональный знаковый признак может быть добавлен для знаковой арифметики.
Пример знаковых и беззнаковых чисел
Число |
Описание |
32'hDEAD_BEEF |
Беззнаковое или знаковое положительное число |
-14'h1234 |
Знаковое отрицательное число |
Ниже показаны примеры представления в Verilog знаковых и беззнаковых чисел.
Verilog Code:
module signed_number; reg [31:0] a; initial begin // инициализация a = 14'h1234; $display ("Текущее значение a = %h", a); a = -14'h1234; $display ("Текущее значение a = %h", a); a = 32'hDEAD_BEEF; $display ("Текущее значение a = %h", a); a = -32'hDEAD_BEEF; $display ("Текущее значение a = %h", a); #10 $finish; end endmodule
Текущее значение a = 00001234
Текущее значение a = ffffedcc
Текущее значение a = deadbeef
Текущее значение a = 21524111