Menu
Coddy logo textTech

Подключение портов по имени

Часть раздела Основы путешествия по 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)
);

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

Пример

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

Все они выполняют одно и то же действие, потому что каждое соединение помечено.

challenge icon

Задание

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

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

  1. Подключите порт clk к сигналу clock_signal
  2. Подключите порт data_in к сигналу input_data
  3. Подключите порт data_out к сигналу output_data

Шпаргалка

Сопоставление портов по имени использует синтаксис .port_name(signal), что делает порядок неважным:

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

Пример:

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

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

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

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Проверьте себя

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

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