Tipos de Dados Verilog: Bits, Wires e Valores Lógicos Explicados
A intenção primária dos tipos de dados na linguagem Verilog é representar elementos de armazenamento de dados como bits em um flip-flop e elementos de transmissão como wires que conectam entre portas lógicas e estruturas sequenciais.
Que Valores as Variáveis Guardam?
Quase todos os tipos de dados podem ter apenas um dos quatro valores diferentes como dado abaixo, exceto para os tipos de dados real e event.
| 0 | representa lógica zero, ou condição falsa |
| 1 | representa lógica um, ou condição verdadeira |
| x | representa valor lógico desconhecido (pode ser zero ou um) |
| z | representa estado de alta impedância |
A imagem a seguir mostra como esses valores são representados em diagramas de timing e formas de onda de simulação. A maioria dos simuladores usa esta convenção onde vermelho representa X e laranja no meio representa alta impedância ou Z.
O Que o Sistema de Valores Verilog Implica?
Como Verilog é essencialmente usado para descrever elementos de hardware como flip-flops e lógica combinacional como NAND e NOR, ele tem que modelar o sistema de valores encontrado no hardware. Uma lógica um representaria a tensão de alimentação Vdd que pode variar entre 0.8V a mais de 3V baseado no nó de tecnologia de fabricação. Uma lógica zero representaria ground e portanto um valor de 0V.
X ou x significa que o valor é simplesmente desconhecido no momento, e pode ser 0 ou 1. Isso é bem diferente da forma como X é tratado na lógica booleana, onde significa "don't care".
Como em qualquer circuito elétrico incompleto, o fio que não está conectado a nada terá uma alta impedância naquele nó e é representado por Z ou z. Mesmo no verilog, qualquer fio não conectado resultará em alta impedância.
Nets e Variáveis
Nets e variáveis são os dois principais grupos de tipos de dados que representam diferentes estruturas de hardware e diferem na forma como são atribuídos e retêm valores.
Nets
Nets são usadas para conectar entre entidades de hardware como portas lógicas e portanto não armazenam nenhum valor por conta própria. Na imagem mostrada abaixo, uma net chamada net_11 é usada para conectar entre a saída da porta AND à primeira entrada do flip-flop chamado data_0. De forma similar, as duas entradas da porta AND são conectadas às nets net_45 e net_67.
Existem diferentes tipos de nets cada um com diferentes características, mas o mais popular e amplamente usado net em projetos digitais é do tipo wire. Um wire é um tipo de dado Verilog usado para conectar elementos e conectar nets que são conduzidas por uma única porta ou atribuição contínua. O wire é similar ao fio elétrico usado para conectar dois componentes em uma protoboard.
Quando há necessidade de múltiplas nets, elas podem ser agrupadas para formar um único wire. Na imagem mostrada abaixo, temos um wire de 4-bit que pode enviar 4 valores separados em cada um dos fios. Tais entidades com largura maior que 1 são chamadas de vetores, como veremos no próximo artigo.
wire [3:0] n0; // 4-bit wire -> este é um vetor
É ilegal redeclarar um nome já declarado por uma net, parâmetro ou variável como mostrado no código abaixo.
module design;
wire abc;
wire a;
wire b;
wire c;
wire abc; // Error: Identifier "abc" previously declared
assign abc = a & b | c;
endmodule
Variáveis
Uma variável, por outro lado, é uma abstração de um elemento de armazenamento de dados e pode guardar valores. Um flip-flop é um bom exemplo de elemento de armazenamento.
O tipo de dado Verilog reg pode ser usado para modelar registradores de hardware já que pode guardar valores entre atribuições. Note que um reg não precisa sempre representar um flip-flop porque também pode ser usado para representar lógica combinacional.
Outros Tipos de Dados
integer
Um integer é uma variável de propósito geral de 32-bits de largura que pode ser usada para outros propósitos enquanto modela hardware e armazena valores inteiros.
integer count; // Count é um valor inteiro > 0
time
Uma variável time é unsigned, 64-bits de largura e pode ser usada para armazenar quantidades de tempo de simulação para propósitos de debug. Uma variável realtime simplesmente armazena tempo como quantidade de ponto flutuante.
time end_time; // end_time pode armazenar valor de tempo como 50ns
realtime rtime; // rtime = 40.25ps
real
Uma variável real pode armazenar valores de ponto flutuante e pode ser atribuída da mesma forma que integer e reg.
real float; // float = 12.344 - pode armazenar números flutuantes
Exemplo
module testbench;
integer int_a; // Integer variable
real real_b; // Real variable
time time_c; // Time variable
initial begin
int_a = 32'hcafe_1234; // Assign an integer value
real_b = 0.1234567; // Assign a floating point value
#20; // Advance simulation time by 20 units
time_c = $time; // Assign current simulation time
// Now print all variables using $display system task
$display ("int_a = 0x%0h", int_a);
$display ("real_b = %0.5f", real_b);
$display ("time_c = %0t", time_c);
end
endmodule
Strings Verilog
Strings são armazenadas em reg, e a largura da variável reg tem que ser grande o suficiente para guardar a string. Cada caractere em uma string representa um valor ASCII e requer 1 byte. Se o tamanho da variável for menor que a string, então Verilog trunca os bits mais à esquerda da string. Se o tamanho da variável for maior que a string, então Verilog adiciona zeros à esquerda da string.
// "Hello World" requer 11 bytes
reg [8*11:1] str = "Hello World"; // Variable can store 11 bytes, str = "Hello World"
reg [8*5:1] str = "Hello World"; // Variable stores only 5 bytes (rest is truncated), str = "World"
reg [8*20:1] str = "Hello World"; // Variable can store 20 bytes (rest is padded with zeros), str = " Hello World"
Verilog
- Domine Variáveis e Tipos de Dados Primitivos em C#: Guia Completo
- Entendendo Tipos de Dados em C++: Fundamentos, Modificadores e Boas Práticas
- Tipos de Dados em C Explicados: int, float, char e Mais – Guia Completo
- Dominando Tipos de Dados em Python: Guia Prático
- Tipos de Dados Primitivos do Java: Guia Completo com Exemplos
- 5 Modelos de Data Center Explicados: Design, Casos de Uso e Exemplos
- Oito Modelos Principais de Computação em Nuvem de 2021
- 8 Tipos Comuns de Vazamento de Dados – Exemplos Reais e Impacto
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático