Создание экземпляра модуля (инстанцирование)

Модули могут содержать внутри себя другие модули. Такое использование называется инстанцированием и образует иерархию модулей.

Обозначение # при создании экземпляра модуля используется для переопределения значений параметров в экземпляре модуля. Параметры должны быть переопределены в том же порядке, в котором они объявлены в модуле. Начиная с 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