Menu
Coddy logo textTech

Port Mapping By Name

Часть раздела Основы путешествия по Verilog на Coddy. Урок 34 из 90.

На предыдущем уроке вы узнали, как создавать экземпляр модуля, передавая сигналы в том же порядке, в котором порты указаны в определении модуля. Это работает, но есть одна проблема: порядок имеет значение.

Если вы случайно перепутаете порядок, сигналы подключатся не к тем портам. Это может быть трудно отлаживать.

Проблема с сопоставлением по порядку

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

// Сопоставление по порядку — порядок ДОЛЖЕН совпадать
or_gate or1 (input_a, input_b, output_y);  // Правильно
or_gate or1 (input_b, input_a, output_y);  // Неправильно! Входы перепутаны

Вторая строка подключает input_b к in1, а input_a к in2: это трудно заметить, но такая ошибка может привести к неожиданным результатам.

Решение: сопоставление портов по именам

Сопоставление портов по именам использует имя порта для создания соединений. Порядок не имеет значения, поскольку каждое соединение явно обозначено.

Синтаксис:

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

Точка . перед именем порта указывает, что мы обращаемся к порту внутри module. Сигнал в скобках — это то, что мы к нему подключаем.

Пример

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

Здесь явно указано:

  • Порт in1 получает сигнал input_a
  • Порт in2 получает сигнал input_b
  • Порт result получает сигнал output_y

Порядок не имеет значения

При сопоставлении портов по имени можно записывать соединения в любом порядке:

// Все три ИДЕНТИЧНЫ

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 делают ровно одно и то же, потому что каждое соединение имеет метку.

challenge icon

Задание

Завершите инстанцирование, добавив отсутствующие соединения портов с помощью сопоставления портов по имени.

Что нужно сделать:

  1. Соедините порт clk с сигналом clock_signal
  2. Соедините порт data_in с сигналом input_data
  3. Соедините порт data_out с сигналом output_data

Попробуйте сами

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: Добавьте сопоставления портов, используя синтаксис .port(signal)
  );
  
endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog