Menu
Coddy logo textTech

Mapeamento de Portas por Nome

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

Na lição anterior, você aprendeu como instanciar um módulo passando 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 se conectam às portas erradas. Isso pode ser difícil de depurar.

O Problema com o Mapeamento por Ordem

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

// Mapeamento por 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 passar despercebido.

Solução: Mapeamento de Porta por Nome

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

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 é o 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)
);

Todos fazem exatamente a mesma coisa porque cada conexão está rotulada.

challenge icon

Desafio

Complete a instanciação adicionando as conexões de porta que faltam usando o mapeamento de porta 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

Folha de consulta

O mapeamento de portas por nome usa a sintaxe .port_name(signal), tornando a ordem irrelevante:

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

Exemplo:

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

O . antes do nome da porta refere-se a uma porta dentro do módulo; o sinal entre parênteses é o que se conecta a ela. Ao contrário do mapeamento por ordem, as conexões podem ser listadas em qualquer ordem sem causar bugs.

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 porta 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