Создание экземпляра модуля (инстанцирование)
Модули могут содержать внутри себя другие модули. Такое использование называется инстанцированием и образует иерархию модулей.
Обозначение #
при создании экземпляра модуля используется для переопределения значений параметров в экземпляре модуля. Параметры должны быть переопределены в том же порядке, в котором они объявлены в модуле. Начиная с Verilog-2001 можно использовать обозначение переопределения именованных параметров.
При создании экземпляра модуля можно указать диапазон, аналогично созданию векторов из reg
и wire
, что позволяет кратко описывать подключение векторных значений к скалярным портам инстанцируемых модулей.
Подключение к портам может быть упорядоченным или именованным списком. В упорядоченном списке соединения должны быть в том же порядке, что и список портов в описании модуля. В случае не указания аргумента (две запятые подряд) какие-то порты окажутся неподключенными. В именованном списке имена должны соответствовать портам в модуле.
Для подключения к входным портам могут использоваться произвольные выражения, но выходные порты могут быть подключены только к проводам, частичным выборкам проводов или их объединениям. Входные выражения создают неявные непрерывные присваивания.
Сила сигнала может быть использована только для примитивов.
Синтаксис
// вариант объявления экземпляра модуля с упорядоченным списком портов
<имя модуля> <имя инстанса>(<порты>);
// вариант объявления экземпляра модуля с именованным списком портов
<имя модуля> <имя инстанса>(.<имя порта> ( <сигнал> ), .<имя порта> ( <сигнал> ), …);
// вариант объявления экземпляра модуля с заданием силы выходного сигнала
<имя модуля> (<сила сигнала>) <имя инстанса>(.<имя порта> ( <сигнал> ), .<имя порта> ( <сигнал> ), …);
// вариант объявления экземпляра модуля с переопределением значений параметров
<имя модуля> #(<список значений параметров>) <имя инстанса>(.<имя порта> ( <сигнал> ), .<имя порта> ( <сигнал> ), …);
Примеры
/* Пример 1: определение модуля и его инстанцирование с именованным списком портов */
module logic_gates(input in1, in2, output out1, out2);
assign out1 = in1 & in2;
assign out2 = in1 | in2;
endmodule
module logic_gates_tb;
reg in1, in2;
wire out1, out2;
logic_gates lg_inst(.in1(in1), .in2(in2), .out1(out1), .out2(out2));
initial begin
$monitor("%d %d %d %d", in1, in2, out1, out2);
in1 = 1’b0; in2 = 1’b0;
#10 in1 = 1’b1;
#10 in2 = 1’b1;
end
endmodule
/* Пример 2: инстанцирование встроенных логических примитивов с заданием силы выходного сигнала */
module strength_(output out, input i1, i2);
or (supply1, strong0) o1(out, i1, i2);
and (strong1, supply0) a1(out, i1, i2);
endmodule
/* Пример 3: определение модуля, в котором инстанцируется с переопределением параметра модуля */
module counterm_tb #(parameter _N = 6);
reg clk, reset, enable;
wire[_N-1:0] out;
counterm #(_N) _counterm(out, clk, reset, enable);
endmodule
Last updated