Verilog

Лексические соглашения.

Лексические соглашения

Основные лексические соглашения, используемые в Verilog HDL (Hardware Description Language - язык описания аппаратуры), подобны тем, которые применяются в языке программирования C. Verilog HDL чувствителен к регистру символов. Все его ключевые слова пишутся в нижнем регистре.

Разделители

Множество разделителей состоит из пробела, табуляции, и управляющих символов новой строки и перевода формата. Эти символы игнорируются, за исключением тех случаев, когда они разделяют другие лексемы. При этом, однако, пробелы и табуляция являются составной частью строки.

Разделители:

  • Пробел
  • Табуляция
  • Символ возврата каретки
  • Символ разрыва строки / Новая строка
  • Символ прогона страницы.

Примеры с разделителями

функционально эквивалентный код.

Плохой код: не стоит писать подобный:

Verilog Code:
  1. module addbit(a,b,ci,sum,co);
  2. input a,b,ci;output sum co;
  3. wire a,b,ci,sum,co;endmodule

Хороший код: правильный способ писать код.

Verilog Code:
  1. module addbit (
  2. a,
  3. b,
  4. ci,
  5. sum,
  6. co);
  7. input a;
  8. input b;
  9. input ci;
  10. output sum;
  11. output co;
  12. wire a;
  13. wire b;
  14. wire ci;
  15. wire sum;
  16. wire co;
  17. endmodule

Комментарии

Есть два способа написания комментариев [как в языке C].

  • Однострочный комментарий начинается лексемой // и заканчивается переводом строки
  • Многострочный начинается с /* и заканчивается */

Автор предпочитает однострочные комментарии [многострочный комментарий относится к стилю языка C) или микропроцессоры, содержащие тысячи транзисторов. Поэтому традиционный 70-х годов прошлого века].

Примеры комментариев

Verilog Code:
  1. /* Это пример
  2. многострочного
  3. комментария*/
  4. module addbit (
  5. a,
  6. b,
  7. ci,
  8. sum,
  9. co);
  10.  
  11. // Входные порты, однострочный комментарий
  12. input a;
  13. input b;
  14. input ci;
  15. // Выходные порты
  16. output sum;
  17. output co;
  18. // Типы данных
  19. wire a;
  20. wire b;
  21. wire ci;
  22. wire sum;
  23. wire co;
  24.  
  25. endmodule

Регистр символов

Verilog [как уже говорилось] различает регистр символов.

  • Символы верхнего и нижнего регистров считаются различными.
  • Все ключевые слова Verilog записываются в нижнем регистре.
Verilog Code:
  1. input //Ключевое слово языка Verilog
  2. wire //Ключевое слово языка Verilog
  3. WIRE //Уникальное имя (не ключевое слово)
  4. 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:
  1. //Изолированные идентификаторы должны
  2. /отделяться от других символов разделителем
  3. module \1dff (
  4. q, // Q выход
  5. \q~ , // Q_out выход
  6. d, // D вход
  7. cl$k, // CLOCK вход
  8. \reset* // Reset вход
  9. );
  10.  
  11. input d, cl$k, \reset* ;
  12. output q, \q~ ;
  13.  
  14. 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:
  1. module signed_number;
  2.  
  3. reg [31:0] a;
  4.  
  5. initial begin // инициализация
  6. a = 14'h1234;
  7. $display ("Текущее значение a = %h", a);
  8. a = -14'h1234;
  9. $display ("Текущее значение a = %h", a);
  10. a = 32'hDEAD_BEEF;
  11. $display ("Текущее значение a = %h", a);
  12. a = -32'hDEAD_BEEF;
  13. $display ("Текущее значение a = %h", a);
  14. #10 $finish;
  15. end
  16.  
  17. endmodule

Текущее значение a = 00001234

Текущее значение a = ffffedcc

Текущее значение a = deadbeef

Текущее значение a = 21524111