Sintaxe Verilog
As convenções lexicais em Verilog são semelhantes a C no sentido de que contém um fluxo de tokens. Um token léxico pode consistir em um ou mais caracteres e os tokens podem ser comentários, palavras-chave, números, strings ou espaços em branco. Todas as linhas devem ser terminadas por um ponto e vírgula
;
. Verilog é diferencia maiúsculas de minúsculas , então var_a e var_A são diferentes.
Comentários
Existem duas maneiras de escrever comentários em Verilog.
- Uma linha única o comentário começa com
//
e diz ao compilador Verilog para tratar tudo após este ponto até o final da linha como um comentário. - Uma linha múltipla o comentário começa com
/*
e termina com*/
e não pode ser aninhado.
No entanto, comentários de linha única podem ser aninhados em um comentário de várias linhas.
// 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
Espaço em branco
Espaço em branco é um termo usado para representar os caracteres de espaços, tabulações, novas linhas e feeds de formulários, e geralmente é ignorado pelo Verilog, exceto quando separa tokens. Na verdade, isso ajuda na indentação do código para torná-lo mais fácil de ler.
module dut; // 'module' is a keyword, // 'dut' is an identifier reg [8*6:1] name = "Hello!"; // The 2 spaces in the beginning are ignored
No entanto, espaços em branco (espaços) e tabulações (da tecla TAB) não são ignorados em strings. No exemplo abaixo, a string variável chamada addr recebe o valor "Earth" por causa da preservação de espaços nas strings.
// 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
Operadores
Existem três tipos de operadores:unários , binário , e ternário ou condicional .
- Os operadores unários devem aparecer à esquerda de seus operandos
- Os operadores binários devem aparecer entre seus operandos
- Os operadores condicionais têm dois operadores separados que separam três operandos
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
Se a expressão (y> 5) for verdadeira, então a variável x obterá o valor em w , senão o valor em z .
Formato numérico
Estamos mais familiarizados com números representados como decimais. No entanto, os números também podem ser representados em binário , octal e hexadecimal . Por padrão, os simuladores Verilog tratam os números como decimais. Para representá-los em uma raiz diferente , algumas regras devem ser seguidas.
16 // Number 16 in decimal 0x10 // Number 16 in hexadecimal 10000 // Number 16 in binary 20 // Number 16 in octal
Tamanho
Os números dimensionados são representados conforme mostrado abaixo, onde tamanho é escrito apenas em decimal para especificar o número de bits no número.
[size]'[base_format][number]
- formato_base pode ser decimal ('d ou 'D), hexadecimal ('h ou 'H) e octal ('o ou 'O) e especifica em que base o número parte representa.
- número é especificado como dígitos consecutivos de 0, 1, 2 ... 9 para formato de base decimal e 0, 1, 2 .. 9, A, B, C, D, E, F para hexadecimal.
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
Letras maiúsculas são válidas para especificação de número quando o formato base é hexadecimal.
16'hcafe; // lowercase letters Valid 16'hCAFE; // uppercase letters Valid 32'h1D40_CAFE; // underscore can be used as separator between 4 letters Valid
Sem tamanho
Números sem um formato_base especificação são números decimais por padrão . Números sem tamanho especificação têm um número padrão de bits dependendo do tipo de simulador e máquina.
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
Negativo
Os números negativos são especificados colocando um menos
-
sinal antes do tamanho de um número. É ilegal ter um sinal de menos entre base_format e número . -6'd3; // 8-bit negative number stored as two's complement of 3 -6'sd9; // For signed maths 8'd-4; // Illegal
Cordas
Uma sequência de caracteres entre aspas duplas
" "
é chamado de cadeia. Ele não pode ser dividido em várias linhas e cada caractere na string leva 1 byte para ser armazenado. "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
Identificadores
Identificadores são nomes de variáveis para que possam ser referenciadas posteriormente. Eles são compostos de caracteres alfanuméricos
[a-z][A-Z][0-9]
, sublinha _
ou cifrão $
e diferenciam maiúsculas de minúsculas. Eles não podem começar com um dígito ou um cifrão. 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
Palavras-chave
Palavras-chave são identificadores especiais reservados para definir as construções da linguagem e estão em letras minúsculas. Uma lista de palavras-chave importantes é fornecida abaixo.
Revisões Verilog
A Verilog passou por algumas revisões ao longo dos anos e mais adições foram feitas de 1995 a 2001, conforme mostrado abaixo.
Verilog