Синтаксис Verilog
Лексические соглашения в Verilog аналогичны C в том смысле, что он содержит поток токенов. Лексическая лексема может состоять из одного или нескольких символов, а лексемы могут быть комментариями, ключевыми словами, числами, строками или пробелами. Все строки должны заканчиваться точкой с запятой ;
.
Verilog чувствителен к регистру , поэтому var_a и var_A разные.
Комментарии
Есть два способа писать комментарии в Verilog.
- одна строка комментарий начинается с
//
и указывает компилятору Verilog рассматривать все после этой точки до конца строки как комментарий. - A многострочный комментарий начинается с
/*
и заканчивается на*/
и не может быть вложенным.
Однако однострочные комментарии могут быть вложены в многострочный комментарий.
// This is a single line comment
integer a; // Creates an int variable called a, and treats everything to the right of // as a comment
/*
This is a
multiple-line or
block comment
*/
/* This is /*
an invalid nested
block comment */
*/
/* However,
// this one is okay
*/
// This is also okay
///////////// Still okay
Пробел
Пустое пространство — это термин, используемый для представления символов пробелов, табуляции, новой строки и перевода страницы, и обычно Verilog игнорирует его, за исключением случаев, когда он разделяет токены. На самом деле, это помогает делать отступы в коде, чтобы его было легче читать.
module dut; // 'module' is a keyword, // 'dut' is an identifier reg [8*6:1] name = "Hello!"; // The 2 spaces in the beginning are ignored
Однако пробелы (пробелы) и табуляции (от клавиши TAB) не игнорируются в строках. В приведенном ниже примере строка переменная с именем addr получает значение "Земля" из-за сохранения пробелов в строках.
// There is no space in the beginning of this line, // but there's a space in the string reg [8*6:1] addr = "Earth "; endmodule
Операторы
Существует три типа операторов:унарные , двоичный и тройное или условное .
- Унарные операторы должны располагаться слева от своего операнда
- Двоичные операторы должны стоять между их операндами
- Условные операторы состоят из двух отдельных операторов, разделяющих три операнда.
x = ~y; // ~ is a unary operator, and y is the operand
x = y | z; // | is a binary operator, where y and z are its operands
x = (y > 5) ? w : z; // ?: is a ternary operator, and the expression (y>5), w and z are its operands
Если выражение (y> 5) истинно, то переменная x получит значение в w , иначе значение в z .
Числовой формат
Мы больше всего знакомы с числами, представленными в виде десятичных дробей. Однако числа также могут быть представлены в двоичном формате. , восьмеричный и шестнадцатеричный . По умолчанию симуляторы Verilog обрабатывают числа как десятичные дроби. Чтобы представить их в другом основании счисления , необходимо соблюдать определенные правила.
16 // Number 16 in decimal 0x10 // Number 16 in hexadecimal 10000 // Number 16 in binary 20 // Number 16 in octal
Размер
Числа с размерами представлены, как показано ниже, где размер записывается только в десятичном виде, чтобы указать количество битов в числе.
[size]'[base_format][number]
- базовый_формат может быть десятичной ('d или 'D), шестнадцатеричной ('h или 'H) и восьмеричной ('o или 'O) и определяет основание числа. часть представляет.
- номер указывается как последовательные цифры от 0, 1, 2 до 9 для десятичного базового формата и 0, 1, 2 ... 9, A, B, C, D, E, F для шестнадцатеричного.
3'b010; // size is 3, base format is binary ('b), and the number is 010 (indicates value 2 in binary) 3'd2; // size is 3, base format is decimal ('d) and the number is 2 (specified in decimals) 8'h70; // size is 8, base format is hexadecimal ('h) and the number is 0x70 (in hex) to represent decimal 112 9'h1FA; // size is 9, base format is hexadecimal ('h) and the number is 0x1FA (in hex) to represent decimal 506 4'hA = 4'd10 = 4'b1010 = 4'o12 // Decimal 10 can be represented in any of the four formats 8'd234 = 8'D234 // Legal to use either lower case or upper case for base format 32'hFACE_47B2; // Underscore (_) can be used to separate 16 bit numbers for readability
Буквы верхнего регистра допустимы для указания числа, если базовый формат — шестнадцатеричный.
16'hcafe; // lowercase letters Valid 16'hCAFE; // uppercase letters Valid 32'h1D40_CAFE; // underscore can be used as separator between 4 letters Valid
Без размера
Числа без base_format спецификация - десятичные числа по по умолчанию . Числа без размера спецификация имеет количество битов по умолчанию в зависимости от типа симулятора и машины.
integer a = 5423; // base format is not specified, a gets a decimal value of 5423
integer a = 'h1AD7; // size is not specified, because a is int (32 bits) value stored in a = 32'h0000_1AD7
Отрицательно
Отрицательные числа указываются минусом -
знак перед размером числа. Недопустимо иметь знак минус между base_format и номер .
-6'd3; // 8-bit negative number stored as two's complement of 3 -6'sd9; // For signed maths 8'd-4; // Illegal
Строки
Последовательность символов, заключенная в двойные кавычки " "
называется строкой. Его нельзя разбить на несколько строк, и каждый символ в строке занимает 1 байт для хранения.
"Hello World!" // String with 12 characters -> require 12 bytes "x + z" // String with 5 characters "How are you feeling today ?" // Illegal for a string to be split into multiple lines
Идентификаторы
Идентификаторы - это имена переменных, чтобы на них можно было ссылаться позже. Они состоят из буквенно-цифровых символов [a-z][A-Z][0-9]
, подчеркивание _
или знак доллара $
и чувствительны к регистру. Они не могут начинаться с цифры или знака доллара.
integer var_a; // Identifier contains alphabets and underscore -> Valid integer $var_a; // Identifier starts with $ -> Invalid integer v$ar_a; // Identifier contains alphabets and $ -> Valid integer 2var; // Identifier starts with a digit -> Invalid integer var23_g; // Identifier contains alphanumeric characters and underscore -> Valid integer 23; // Identifier contains only numbers -> Invalid
Ключевые слова
Ключевые слова — это специальные идентификаторы, зарезервированные для определения языковых конструкций и написанные в нижнем регистре. Список важных ключевых слов приведен ниже.
Версии Verilog
За прошедшие годы Verilog претерпел несколько изменений, и в период с 1995 по 2001 год были внесены дополнительные дополнения, как показано ниже.
Verilog