Menu
Coddy logo textTech

Port Mapping By Name

Parte da seção Fundamentos do Journey de Verilog da Coddy. Lição 34 de 90.

Na lição anterior, você aprendeu a instanciar um módulo passando os sinais na mesma ordem em que as portas aparecem na definição do módulo. Isso funciona, mas tem um problema: a ordem importa.

Se você acidentalmente misturar a ordem, os sinais serão conectados às portas erradas. Isso pode ser difícil de depurar.

O problema do mapeamento por ordem

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

// Mapeamento de ordem - a ordem DEVE coincidir
or_gate or1 (input_a, input_b, output_y);  // Correto
or_gate or1 (input_b, input_a, output_y);  // Errado! Entradas trocadas

A segunda linha conecta input_b a in1 e input_a a in2: um bug sutil que é fácil de não perceber.

Solução: Mapeamento de Portas por Nome

O mapeamento de portas por nome usa o nome da porta para fazer conexões. A ordem não importa porque cada conexão é identificada explicitamente.

Sintaxe:

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

O ponto . antes do nome da porta indica que estamos nos referindo a uma porta dentro do módulo. O sinal dentro dos parênteses é aquilo que conectamos a ela.

Exemplo

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

Isso diz explicitamente:

  • A porta in1 recebe o sinal input_a
  • A porta in2 recebe o sinal input_b
  • A porta result recebe o sinal output_y

A Ordem Não Importa

Com o mapeamento de portas por nome, você pode escrever as conexões em qualquer ordem:

// Todos os três são 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)
);

Todas fazem exatamente a mesma coisa porque cada conexão é identificada.

challenge icon

Desafio

Conclua a instanciação adicionando as conexões de porta ausentes usando mapeamento de portas por nome.

O que fazer:

  1. Conecte a porta clk ao sinal clock_signal
  2. Conecte a porta data_in ao sinal input_data
  3. Conecte a porta data_out ao sinal output_data

Experimente você mesmo

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: Adicione mapeamentos de portas usando a sintaxe .port(signal)
  );
  
endmodule
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos

Pratique por conta própria: Compilador de Verilog online