Поскольку модуль определен с отдельными портами, каждый порт должен быть подключен индивидуально. Verilog не предоставляет встроенный способ автоматического подключения портов.
SystemVerilog имеет .*
подключений, но работает только тогда, когда имя net / var соответствует имени порта. Таким образом, с SystemVerilog вы можете связаться с промежуточным назначением. (Примечание: все современные симуляторы Verilog поддерживают большинство, если не все, функции SystemVerilog. Просто измените вымирание файла с .v
на .sv
, чтобы включить)
logic clock;
logic [15:0] inputs;
wire [22:0] outputs;
wire m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16;
wire S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24;
assign {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16} = inputs;
assign outputs = {S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24};
mymodule tc( .* );
Для Более чистое решение, я рекомендую плагин Emacs Verilog-Mode (существует оболочка vim ). Этот инструмент был специально создан для упрощения подключения к длинному списку портов и выполнения других повторяющихся задач, общих для проектов Verilog. Например, нижеприведенный код будет расширен до соединения индекс-индекс
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[\1]),
.S@ (outputs[\1]),
); */
mymodule dut (/*AUTOINST*/);
Два следующих шаблона будут расширяться со смещением, за исключением m18
, который явно подключается к inputs[13]
. (я выбрал m18
, потому что заметил, что нет m14
и он определен между m13
и m15
)
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[@"(- \1 1)"]),
.S@ (outputs[@"(- \1 6)"]),
); */
mymodule dut (
.m18 (inputs[13]),
/*AUTOINST*/);
или
/* mymodule AUTO_TEMPLATE (
.m18 (inputs[13]),
.m@ (inputs[@"(- \1 1)"]),
.S@ (outputs[@"(- \1 6)"]),
); */
mymodule dut (/*AUTOINST*/);