Освоение синтаксиса Verilog: ключевые правила и лучшие практики
Лексические соглашения в Verilog похожи на C: поток токенов. Лексический токен может состоять из одного или нескольких символов и быть комментарием, ключевым словом, числом, строкой или пробелом. Все строки должны заканчиваться точкой с запятой ;.
Verilog чувствителен к регистру, поэтому var_a и var_A — разные идентификаторы.
Комментарии
Два способа написать комментарии в Verilog:
- Однострочный начинается с
//и говорит компилятору считать всё до конца строки комментарием. - Многострочный начинается с
/*и заканчивается*/, вложение недопускается.
Однако однострочные комментарии могут быть вложены в многострочные.
// Это однострочный комментарий
integer a; // Создаёт int переменную a, всё справа от // — комментарий
/* Это многострочный или блоковый комментарий */
/* Это /* недопустимый вложенный блоковый комментарий */ */
/* Однако // этот вариант допустим */
// Это тоже допустимо
///////////// И это тоже допустимо
Пробелы (Whitespace)
Пробелы — символы для пробелов, табуляций, переводов строк и прогонов страниц. Обычно игнорируются Verilog, кроме случаев разделения токенов. Это помогает форматировать код для читаемости.
module dut; // 'module' — ключевое слово, 'dut' — идентификатор
reg [8*6:1] name = "Hello!"; // 2 пробела в начале игнорируются
Но пробелы и табы не игнорируются в строках. В примере ниже строковая переменная addr получает значение "Earth " из-за сохранения пробелов в строках.
// В начале этой строки нет пробела, но он есть в строке
reg [8*6:1] addr = "Earth ";
endmodule
Операторы
Три типа операторов: унарные, бинарные и тернарные (условные).
- Унарные операторы стоят слева от операнда.
- Бинарные — между операндами.
- Условные имеют два отдельных оператора, разделяющих три операнда.
x = ~y; // ~ — унарный, y — операнд
x = y | z; // | — бинарный, y и z — операнды
x = (y > 5) ? w : z; // ?: — тернарный, (y>5), w, z — операнды
Если выражение (y > 5) истинно, переменная x получит значение w, иначе — z.
Форматы чисел
Привычны десятичные числа, но Verilog поддерживает двоичные, восьмеричные и шестнадцатеричные. По умолчанию симуляторы traktируют числа как десятичные. Для другого основания (radix) нужны специальные правила.
16 // 16 в десятичной
0x10 // 16 в шестнадцатеричной
10000 // 16 в двоичной
20 // 16 в восьмеричной
Числа с указанием размера (Sized)
Формат: [size]'[base_format][number], где size — только в десятичной, задаёт количество бит.
base_format: десятичный ('dили'D), шестнадцатеричный ('hили'H), восьмеричный ('oили'O).number: последовательные цифры 0-9 для десятичного, 0-9, A-F для шестнадцатеричного.
3'b010; // размер 3, бинарный, значение 2
3'd2; // размер 3, десятичный, значение 2
8'h70; // размер 8, хекс, 0x70 = 112 десятичное
9'h1FA; // размер 9, хекс, 0x1FA = 506 десятичное
4'hA = 4'd10 = 4'b1010 = 4'o12 // 10 в четырёх форматах
8'd234 = 8'D234 // регистр базы не важен
32'hFACE_47B2; // подчёркивание для читаемости (группы по 16 бит)
Заглавные буквы допустимы для шестнадцатеричных чисел.
16'hcafe; // строчные — допустимо
16'hCAFE; // заглавные — допустимо
32'h1D40_CAFE; // подчёркивание как разделитель — допустимо
Числа без размера (Unsized)
Числа без base_format — десятичные по умолчанию. Без size — ширина по умолчанию зависит от симулятора и машины.
integer a = 5423; // десятичное 5423
integer a = 'h1AD7; // размер не указан, a — int (32 бита), значение 32'h0000_1AD7
Отрицательные числа
Указываются минусом - перед размером. Минус между base_format и number недопустим.
-6'd3; // 8-битное отрицательное (дополнение до двух для 3)
-6'sd9; // для знаковой арифметики
8'd-4; // Недопустимо
Строки
Последовательность символов в двойных кавычках " ". Не может быть разбита на несколько строк. Каждый символ — 1 байт.
"Hello World!" // 12 символов -> 12 байт
"x + z" // 5 символов
"How are you feeling today ?" // Недопустимо: строка разбита на несколько строк
Идентификаторы
Идентификаторы — имена переменных для ссылки на них. Состоят из алфавитно-цифровых символов [a-z][A-Z][0-9], подчёркиваний _ или доллара $. Чувствительны к регистру. Не могут начинаться с цифры или доллара.
integer var_a; // буквы и подчёркивание — OK
integer $var_a; // начинается с $ — НЕДОПУСТИМО
integer v$ar_a; // содержит $ — OK
integer 2var; // начинается с цифры — НЕДОПУСТИМО
integer var23_g; // алфавитно-цифровые и _ — OK
integer 23; // только цифры — НЕДОПУСТИМО
Ключевые слова
Ключевые слова — зарезервированные идентификаторы в нижнем регистре для языковых конструктур. Важные ключевые слова показаны на изображении.
Ревизии Verilog
Verilog проходил несколько ревизий с 1995 по 2001 год, показано на изображении.
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени
- Понимание и печать timescale в Verilog в любой области видимости