Понимание портов Verilog: входы, выходы и коммуникация модулей
Порты — набор сигналов, выступающих входами и выходами модуля, и основной способ взаимодействия с ним. Представьте модуль как чип на печатной плате: очевидно, что общение с ним возможно только через его ножки. Порты — это и ножки, через которые дизайн посылает и принимает сигналы извне.
Типы портов
| Порт | Описание |
|---|---|
| Input | Модуль может только принимать значения извне через input порты |
| Output | Модуль может только посылать значения наружу через output порты |
| Inout | Модуль может и посылать, и принимать значения через inout порты |
Порты по умолчанию считаются сетями типа wire.
Синтаксис
Порты, объявленные как inout, могут работать и как вход, и как выход.
input [net_type] [range] list_of_names; // Входной порт
inout [net_type] [range] list_of_names; // Вход/Выход
output [net_type] [range] list_of_names; // Выходной порт, управляемый wire
output [var_type] [range] list_of_names; // Выходной порт, управляемый переменной
Пример
В коде ниже три input порта, один output и один inout.
module my_design (
input wire clk,
input en,
input rw,
inout [15:0] data,
output int
);
// Поведение дизайна на Verilog
endmodule
Недопустимо использовать одно имя для нескольких портов.
input aport; // Первое объявление — OK
input aport; // Ошибка — уже объявлен
output aport; // Ошибка — уже объявлен
Знаковые порты (Signed ports)
Атрибут signed можно прикрепить к объявлению порта или net/reg или к обоим. Неявные сети по умолчанию беззнаковые (unsigned).
module ( input a, b, output c); // a, b, c по умолчанию unsigned
endmodule
Если либо объявление net/reg имеет атрибут signed, другой тоже считается знаковым.
module ( input signed a, b, output c);
wire a, b; // a, b знаковые из объявления порта
reg signed c; // c знаковое из reg объявления
endmodule
Вариации портов
Verilog 1995
Оригинальный IEEE 1995 требовал сначала перечислить имена портов в скобках, а направление определять позже в теле модуля.
module test (a, b, c);
input [7:0] a; // входы "a" и "b" — wire
input [7:0] b;
output [7:0] c; // выход "c" по умолчанию wire
wire [7:0] a; wire [7:0] b; wire [7:0] c; // можно переобъявить как wire
endmodule
module test (a, b, c);
input [7:0] a, b;
output [7:0] c;
reg [7:0] c; // порт "c" изменён на reg тип
endmodule
Verilog 2001 и далее
ANSI-C стиль объявления портов введён в 2001: тип можно указывать прямо в списке портов.
module test (
input [7:0] a, b, // "b" считается 8-битным входом
output [7:0] c
);
// Содержимое дизайна
endmodule
module test (
input wire [7:0] a,
input wire [7:0] b,
output reg [7:0] c
);
// Содержимое дизайна
endmodule
Если объявление порта включает net или variable type, порт считается полностью объявленным. Повторное объявление того же порта в net/variable type недопустимо.
module test (
input [7:0] a, // a, e неявно объявлены как wire
output reg [7:0] e
);
wire signed [7:0] a; // недопустимо — объявление a уже завершено (зависит от симулятора)
wire [7:0] e; // недопустимо — объявление e уже завершено
// Остальной код дизайна
endmodule
Если объявление порта не включает net/variable type, порт можно объявить в net/variable declaration снова.
module test (
input [7:0] a,
output [7:0] e
);
reg [7:0] e; // OK — net_type не был объявлен раньше
// Остальной код дизайна
endmodule
Verilog
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Генератор тактового сигнала в Verilog: проектирование и реализация
- Мастерство математических функций Verilog для эффективного аппаратного дизайна
- Мастерство $timeformat в Verilog: точность и контроль отображения времени
- Понимание и печать timescale в Verilog в любой области видимости