Menu
Coddy logo textTech

Mapeo de puertos por nombre

Parte de la sección Fundamentos del Journey de Verilog de Coddy — lección 34 de 90.

En la lección anterior, aprendiste cómo instanciar un módulo pasando señales en el mismo orden en que aparecen los puertos en la definición del módulo. Esto funciona, pero tiene un problema: el orden importa.

Si accidentalmente confundes el orden, las señales se conectan a los puertos incorrectos. Esto puede ser difícil de depurar.

El problema con el mapeo por orden

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

// Mapeo por orden - el orden DEBE coincidir
or_gate or1 (input_a, input_b, output_y);  // Correcto
or_gate or1 (input_b, input_a, output_y);  // ¡Incorrecto! Entradas intercambiadas

La segunda línea conecta input_b con in1 e input_a con in2 — un error sutil que es fácil de pasar por alto.

Solución: Mapeo de puertos por nombre

El mapeo de puertos por nombre utiliza el nombre del puerto para realizar conexiones. El orden no importa porque cada conexión está etiquetada explícitamente.

Sintaxis:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

El punto . antes del nombre del puerto indica que nos estamos refiriendo a un puerto dentro del módulo. La señal dentro de los paréntesis es lo que conectamos a él.

Ejemplo

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

Esto dice explícitamente:

  • El puerto in1 recibe la señal input_a
  • El puerto in2 recibe la señal input_b
  • El puerto result recibe la señal output_y

El orden no importa

Con el mapeo de puertos por nombre, puedes escribir las conexiones en cualquier orden:

// Los tres son IDÉNTICOS

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

or_gate or1 (
  .result(output_y),
  .in1(input_a),
  .in2(input_b)
);

or_gate or1 (
  .in2(input_b),
  .result(output_y),
  .in1(input_a)
);

Todos hacen exactamente lo mismo porque cada conexión está etiquetada.

challenge icon

Desafío

Completa la instanciación agregando las conexiones de puerto faltantes utilizando el mapeo de puertos por nombre.

Qué hacer:

  1. Conecta el puerto clk a la señal clock_signal
  2. Conecta el puerto data_in a la señal input_data
  3. Conecta el puerto data_out a la señal output_data

Hoja de referencia

El mapeo de puertos por nombre utiliza la sintaxis .port_name(signal), haciendo que el orden sea irrelevante:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

Ejemplo:

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

El . antes del nombre del puerto se refiere a un puerto dentro del módulo; la señal entre paréntesis es lo que se conecta a él. A diferencia del mapeo por orden, las conexiones pueden listarse en cualquier orden sin causar errores.

Pruébalo tú mismo

module register (
  input clk,
  input [7:0] data_in,
  output reg [7:0] data_out
);
  always @(posedge clk) begin
    data_out <= data_in;
  end
endmodule

module top (
  input clock_signal,
  input [7:0] input_data,
  output [7:0] output_data
);
  
  register reg1 (
    // TODO: Agregar mapeos de puertos usando la sintaxis .puerto(señal)
  );
  
endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos