Tipos de datos en Verilog: Bits, wires y valores lógicos explicados
La intención principal de los tipos de datos en Verilog es representar elementos de almacenamiento como bits en un flip-flop y elementos de transmisión como wires que conectan puertas lógicas y estructuras secuenciales.
¿Qué valores pueden tener las variables?
Casi todos los tipos de datos solo pueden tener uno de cuatro valores (excepto real y event):
| 0 | representa un cero lógico, o condición falsa |
| 1 | representa un uno lógico, o condición verdadera |
| x | representa un valor lógico desconocido (puede ser 0 o 1) |
| z | representa un estado de alta impedancia |
La imagen muestra cómo se representan estos valores en diagramas de tiempo y formas de onda de simulación. La mayoría de simuladores usan rojo para X y naranja en el medio para alta impedancia o Z.

¿Qué implica el sistema de valores de Verilog?
Como Verilog describe elementos de hardware como flip-flops y lógica combinacional (NAND, NOR), debe modelar el sistema de valores del hardware. Un uno lógico representa la tensión de alimentación Vdd (0.8V a más de 3V según nodo tecnológico). Un cero lógico representa tierra (0V).
X o x significa que el valor es desconocido en ese momento, podría ser 0 o 1. Es distinto de la lógica booleana donde X significa "no importa".
Como en cualquier circuito eléctrico incompleto, un wire no conectado tendrá alta impedancia en ese nodo, representado por Z o z. En Verilog, cualquier wire no conectado resulta en alta impedancia.
Nets y Variables
Nets y variables son los dos grupos principales de tipos de datos que representan diferentes estructuras de hardware y difieren en cómo se asignan y retienen valores.
Nets
Los Nets conectan entidades de hardware como puertas lógicas y no almacenan valor propio. En la imagen, un net llamado net_11 conecta la salida de una puerta AND a la primera entrada de un flip-flop data_0. Las dos entradas del AND se conectan a nets net_45 y net_67.

Hay diferentes tipos de nets, pero el más popular y usado en diseños digitales es wire. Un wire conecta elementos y nets impulsados por una sola puerta o asignación continua. Es similar al cable eléctrico que conecta dos componentes en una protoboard.

Cuando se requieren múltiples nets, pueden agruparse en un solo wire. En la imagen, un wire de 4 bits puede enviar 4 valores separados. Entidades con ancho > 1 se llaman vectores (ver siguiente artículo).
wire [3:0] n0; // wire de 4 bits -> esto es un vector

Es ilegal redeclarar un nombre ya declarado por net, parámetro o variable:
module design;
wire abc;
wire a;
wire b;
wire c;
wire abc; // Error: Identificador "abc" declarado previamente
assign abc = a & b | c;
endmodule
Variables

Una variable abstrae un elemento de almacenamiento y puede retener valores. Un flip-flop es buen ejemplo.
El tipo reg de Verilog modela registros de hardware ya que retiene valores entre asignaciones. Nota que un reg no siempre representa un flip-flop; también puede representar lógica combinacional.

Otros tipos de datos
integer
Un integer es variable de propósito general de 32 bits para modelar hardware y almacenar valores enteros.
integer count; // Count es valor entero > 0
time
Una variable time es sin signo, 64 bits, para almacenar cantidades de tiempo de simulación para depuración. realtime almacena tiempo como punto flotante.
time end_time; // end_time = 50ns
realtime rtime; // rtime = 40.25ps
real
Una variable real almacena valores de punto flotante y se asigna igual que integer y reg.
real float; // float = 12.344
Ejemplo
module testbench;
integer int_a;
real real_b;
time time_c;
initial begin
int_a = 32'hcafe_1234;
real_b = 0.1234567;
#20;
time_c = $time;
$display ("int_a = 0x%0h", int_a);
$display ("real_b = %0.5f", real_b);
$display ("time_c = %0t", time_c);
end
endmodule
Salida de simulación:
ncsim> run int_a = 0xcafe1234 real_b = 0.12346 time_c = 20 ncsim: *W,RNQUIE: Simulation is complete.
Strings en Verilog
Los strings se almacenan en reg, y el ancho del reg debe ser suficiente para guardar el string. Cada carácter representa un valor ASCII y requiere 1 byte. Si el tamaño de la variable es menor que el string, Verilog trunca los bits más significativos. Si es mayor, añade ceros a la izquierda.
// "Hello World" requiere 11 bytes
reg [8*11:1] str = "Hello World"; // Variable guarda 11 bytes, str = "Hello World"
reg [8*5:1] str = "Hello World"; // Solo 5 bytes (resto truncado), str = "World"
reg [8*20:1] str = "Hello World"; // 20 bytes (resto padded con ceros), str = " Hello World"
Ejemplo completo simulando las tres variables:
module testbench;
reg [8*11:1] str1;
reg [8*5:1] str2;
reg [8*20:1] str3;
initial begin
str1 = "Hello World";
str2 = "Hello World";
str3 = "Hello World";
$display ("str1 = %s", str1);
$display ("str2 = %s", str2);
$display ("str3 = %s", str3);
end
endmodule
Salida:
ncsim> run str1 = Hello World str2 = World str3 = Hello World ncsim: *W,RNQUIE: Simulation is complete.
Nota: str1 tiene tamaño correcto y se imprime completo. str2 solo 5 bytes, trunca 6 bytes superiores quedando "World". str3 es mayor a 11 bytes y añade espacios a la izquierda.
Verilog
- 5 Modelos de Centros de Datos Explicados: Diseño, Casos de Uso y Ejemplos
- Ocho Modelos Clave de Computación en la Nube en 2021
- 8 Tipos Comunes de Violación de Datos: Ejemplos Reales e Impacto
- Domine variables y tipos de datos primitivos en C#: Guía completa
- Entendiendo los Tipos de Datos en C++: Fundamentos, Modificadores y Mejores Prácticas
- Tipos de datos en C explicados: int, float, char y más – guía completa
- Entendiendo los tipos de datos en C: Guía completa
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Dominando tipos de datos en Python: Guía práctica
- Tipos de Datos Primitivos en Java: Guía Completa con Ejemplos