- Код: Выделить всё
primitive dummy(o, i1, i2);
input i1, i2;
...
endprimitive
Типы портов UDP требуется описывать всегда.
2. Можно ли не описывать цепи latch_out, dff_out и mux_out в коде
- Код: Выделить всё
module Testbench;
reg channel;
reg clk, data;
wire latch_out, dff_out, mux_out;
mux multiplexor(mux_out, channel, latch_out, dff_out);
latch dlatch(latch_out, clk, data);
d_ff dff(dff_out, clk, data);
...
endmodule
Можно. Стандарт Verilog-2001 допускает неявное описание цепи, если ее имя встречается в списке подключений примитива или модуля, как приведенном примере. То есть, строчку "wire latch_out, dff_out, mux_out;" можно закомментировать.
3. Какой смысл имеет тело wait?
wait может не иметь тела:
- Код: Выделить всё
...
wait(condition);
statement1
В этом случае wait() ждет выполнения условия condition и блокирует до этих пор выполнение statement1. Точно такой же эффект будет при использовании statement1 в качестве тела wait:
- Код: Выделить всё
...
wait(condition)
statement1
Полезность помещения statement1 в тело wait может возникнуть, когда wait используется в блоке fork..join:
- Код: Выделить всё
fork
statement2;
wait(condition)
statement1;
statement3;
join
В этом случае выполнение statement2 и statement3 не задерживается, тогда как statement1 дожидается условия condition.
Вообще польза wait() проявляется тогда, когда он находится в теле цикла:
- Код: Выделить всё
forever
wait(condition)
statement
Здесь выполнение statement будет блокироваться до тех пор, пока не будет выполнено condition. Однако если condition истинно, statement будет выполняться при каждом витке цикла до тех пор, пока condition снова не станет ложным. Это поведение отличается от списка событий:
- Код: Выделить всё
forever
@(condition) statement
Здесь выполнение statement блокируется до тех пор, пока condition не изменится, и будет блокироваться при каждом витке цикла, не зависимо от значения condition. @ ждет перепада, тогда как wait() ждет уровня.