Entender puertos en Verilog: Entradas, salidas y comunicación entre módulos
Los puertos son un conjunto de señales que actúan como entradas y salidas de un módulo y son la forma principal de comunicarse con él. Piensa en un módulo como un chip fabricado colocado en un PCB: queda claro que la única forma de comunicarse con el chip es a través de sus pines. Los puertos son como pines y el diseño los usa para enviar y recibir señales del exterior.

Tipos de puertos
| Puerto | Descripción |
|---|---|
| Input | El módulo solo recibe valores del exterior usando puertos input |
| Output | El módulo solo envía valores al exterior usando puertos output |
| Inout | El módulo puede enviar o recibir valores usando puertos inout |
wire.Sintaxis
Puertos declarados como inout actúan como entrada y salida.
input [net_type] [range] lista_nombres; // Puerto de entrada
inout [net_type] [range] lista_nombres; // Puerto entrada/salida
output [net_type] [range] lista_nombres; // Puerto salida impulsado por wire
output [var_type] [range] lista_nombres; // Puerto salida impulsado por variable
Ejemplo
En el código siguiente hay tres puertos input, uno output y uno inout.
module my_design (
input wire clk,
input en,
input rw,
inout [15:0] data,
output int
);
// Comportamiento del diseño como código Verilog
endmodule
Es ilegal usar el mismo nombre para múltiples puertos.
input aport; // Primera declaración - válida
input aport; // Error - ya declarado
output aport; // Error - ya declarado
Puertos con signo (Signed ports)
El atributo signed puede adjuntarse a declaración de puerto o net/reg o ambos. Nets implícitos son por defecto unsigned.
module ( input a, b, output c); // a, b, c son unsigned por defecto
endmodule
Si la declaración net/reg tiene atributo signed, el otro también se considera signed.
module ( input signed a, b, output c);
wire a, b; // a, b son signed por declaración de puerto
reg signed c; // c es signed por declaración reg
endmodule
Variaciones de puertos
Verilog 1995
La versión IEEE original de 1995 declaraba puertos así: primero listar nombres en paréntesis y luego definir direcciones en el cuerpo.
module test (a, b, c);
input [7:0] a; // entradas "a" y "b" son wires
input [7:0] b;
output [7:0] c; // salida "c" por defecto wire
// Aún puedes declararlos como wires para evitar confusión
wire [7:0] a;
wire [7:0] b;
wire [7:0] c;
endmodule
module test (a, b, c);
input [7:0] a, b;
output [7:0] c;
reg [7:0] c; // puerto "c" cambiado a tipo reg
endmodule
Verilog 2001 en adelante
Estilo ANSI-C de nombres de puertos se introdujo en 2001 permitiendo especificar tipo dentro de la lista de puertos.
module test (
input [7:0] a, b, // "b" considerado entrada de 8 bits
output [7:0] c
);
// Contenido del diseño
endmodule
module test (
input wire [7:0] a,
input wire [7:0] b,
output reg [7:0] c
);
// Contenido del diseño
endmodule
Si declaración de puerto incluye tipo net o variable, el puerto se considera completamente declarado. Es ilegal redeclarar el mismo puerto en declaración net o variable.
module test (
input [7:0] a, // a, e declarados implícitamente como wire
output reg [7:0] e
);
wire signed [7:0] a; // ilegal - declaración de a ya completa -> depende del simulador
wire [7:0] e; // ilegal - declaración de e ya completa
// Resto del código
endmodule
Si la declaración de puerto no incluye tipo net o variable, el puerto puede declararse en declaración net o variable de nuevo.
module test (
input [7:0] a,
output [7:0] e
);
reg [7:0] e; // OK - net_type no declarado antes
// Resto del código
endmodule
Verilog
- Dominar Verilog: Tutorial completo para diseño de circuitos digitales
- Dominar la concatenación en Verilog: Guía práctica
- Comprender las asignaciones en Verilog: tipos, sintaxis y mejores prácticas
- Bloqueante vs. No bloqueante en Verilog: Diferencias clave explicadas
- Dominar las funciones en Verilog para diseño RTL eficiente
- Comprender las Tasks en Verilog: Funciones vs Tasks, sintaxis y uso
- Generador de reloj en Verilog: Guía de diseño e implementación
- Dominar las funciones matemáticas en Verilog para diseño de hardware eficiente
- Dominar $timeformat en Verilog: Control de precisión y visualización
- Comprender e imprimir timescales de Verilog en cualquier alcance
- Dominando la E/S de Archivos en Verilog: Abrir, Leer, Escribir y Cerrar