Menu
CoddyTech

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

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