Как я могу назначить аргументы модуля в Verilog?

У меня есть модуль Verilog с очень длинным списком необходимых входов и выходов.

module mymodule(clock,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16,S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24);

Я пытаюсь написать тестовый стенд для этого модуля. Есть ли разумный способ предоставить аргументы в виде массива. Около половины аргументов являются входными данными, а другая половина — выходными данными. Я пытался сделать что-то подобное, основываясь на своем ограниченном опыте работы с Verilog.

reg clk = 0;
reg inputs[16:0] = 0;
wire outputs[23:0];

mymodule tc(clk, inputs, outputs);     

Я хочу, чтобы переменная «входы» действовала как массив, который будет содержать все входы, и «выходы» также будут делать то же самое.

Я также хочу иметь возможность установить все входы в случайном порядке

inputs = $random; 

Есть ли способ сделать это в Verilog или мне нужно инициализировать все переменные вручную?


person ched    schedule 10.02.2020    source источник


Ответы (3)


Поскольку модуль определяется отдельными портами, каждый порт должен быть подключен отдельно. Verilog не имеет встроенного способа автоматического подключения портов.

SystemVerilog имеет .* соединений, но работает только тогда, когда имя сети/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*/);

or

/* mymodule AUTO_TEMPLATE (
  .m18      (inputs[13]),
  .m@       (inputs[@"(- \1 1)"]),
  .S@       (outputs[@"(- \1 6)"]),
); */
mymodule dut (/*AUTOINST*/);
person Greg    schedule 10.02.2020

Помимо использования какой-то генерации кода, в обычном Verilog вам нужно подключать все порты по отдельности. Вы можете сделать что-то вроде:

reg  [2:0] inp = $random;
wire [2:0] outp;

mymodule my (clk, inp[1:0], inp[2], outp[1:0], outp[2], ...);

чтобы присвоить все одному и тому же вектору, но все равно нужно все это напечатать.

person Justin N    schedule 10.02.2020
comment
просто не называйте свою входную переменную как input. Это ключевое слово на языке Verilog. - person Serge; 10.02.2020
comment
Хорошо, а как насчет того, чтобы сделать все входы случайными? Должен ли я также делать это индивидуально? - person ched; 10.02.2020
comment
@ched, если вы используете массив для ввода, вы можете заполнить его циклом for: tci tc(clk, in[0], in[1], in[2]... for (i=0; i<16; i=i+1) in[i] = $random; - person Oldfart; 10.02.2020

Вы можете использовать директиву `define для объединения отдельных битов в массивы в вашем тестовом стенде:

`define inputs {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16}
`define outputs {S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24}

Затем вы можете использовать $random задачу:

initial
begin

...

`inputs = $random;

...

end
person acmert    schedule 13.02.2020