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 a 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 equivocados. Esto puede ser difícil de depurar.

El problema con la asignación por orden

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

// Mapeo de 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 a in1 e input_a a in2 — un error sutil que es fácil de pasar por alto.

Solución: Port Mapping By Name

El mapeo de puertos por nombre utiliza el port_name para realizar las 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 referimos a un puerto dentro del módulo. La señal entre 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 añadiendo las conexiones de puertos que faltan utilizando la asignación de puertos por nombre (mapping 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

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: Añade mapeos de puertos usando la sintaxis .port(signal)
  );
  
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