Menu
Coddy logo textTech

Asignación 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 las 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 mezclas accidentalmente 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 con in1 y input_a con in2: un error sutil que es fácil pasar por alto.

Solución: asignación de puertos por nombre

La asignación de puertos por nombre utiliza el nombre del puerto para establecer 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 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 la asignación 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)
);

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

challenge icon

Desafío

Completa la instanciación agregando las conexiones de puertos que faltan mediante 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

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

Practica por tu cuenta: Compilador de Verilog online