В языке Verilog реализовано 2 типа циклов: while – цикл с предусловием и for – цикл с параметром (счетчиком). Третий цикл do в Verilog не предусмотрен.
Цикл While
Условие выхода из цикла проверяется каждый раз перед выполнением тела цикла.
Синтаксис:
while (логическое выражение) тело цикла, оператор 1;
Или:
while (логическое_выражение) begin
тело цикла, оператор 1;
тело цикла, оператор 2;
... тело цикла, оператор n;
end
Рассмотрим цикл While на примере циклического сдвига числа 8′b10001101 вправо на 4 бита. При таком типе сдвига, старшие биты (с 8-го по 2-ой) сдвигаются на 1 позицию вправо, а младший бит (1-ый) переносится на старшую (8-ую) позицию. Таким образом, циклически сдвинув число 8′b10001101 на 4 позиции вправо, получим 8′b11011000.
Код программы:
`timescale 1 ns / 1 ps
module main (
input wire rst,
input wire start,
output reg [7:0] out
);
integer i;
always @(posedge rst, posedge start)
if (rst) begin
out = 8'b10001101;
i = 0;
end
else begin
i = 0;
while (i < 4) begin
out = {out[0], out[7:1]};
i = i + 1;
end
end
endmodule
В данном случае, имеется регистр [7:0] out, которому по сигналу сброса rst присваивается значение 8′b10001101. По фронту сигнала start выполняется цикл while до тех пор, пока истинно условие i < 4.
Цикл For
Цикл for называется циклом с параметром. При его использовании указывается начальное значение параметра, условие выхода из цикла и счетчик итераций. Счетчик, как и в цикле while используется с блокирующим присваиванием.
Синтаксис:
for (i = 0; i < N; i = i + 1) тело_цикла_1;
Или:
for (i = 0; i < N; i = i + 1) begin
тело цикла, оператор 1;
тело цикла, оператор 2;
...
тело цикла, оператор n;
end
В примере с циклом wire можно заменить строки:
i = 0;
while (i < 4) begin
out = {out[0], out[7:1]}; i = i + 1;
end
на:
for(i = 0; i < 4; i = i + 1)
out = {out[0], out[7:1]};
Результат симуляции будет аналогичен предыдущему примеру.
Цикл Repeat
Цикл repeat применяется, если какое-то действие необходимо выполнить фиксированное число раз.
Синтаксис:
repeat (число_итераций) begin
тело цикла, оператор 1;
тело цикла, оператор 2;
...
тело цикла, оператор n;
end
Число_итераций задается целым положительным числом. Для примера заменим участок кода:
for (i = 0; i < 4; i = i + 1)
out = {out[0], out[7:1]};
на:
repeat (3) out = {out[0], out[7:1]};
Цикл выполнится 3 раза, результат симуляции будет аналогичен предыдущему.
Цикл Forever
Цикл Forever является бесконечным циклом, поэтому при его использовании, необходимо указывать какие-либо временные параметры, иначе при моделировании данный цикл будет бесконечно выполняться на нулевом модельном времени.
Синтаксис:
forever тело цикла, оператор 1 ;
или:
forever begin
тело цикла, оператор 1;
тело цикла, оператор 2;
...
тело цикла, оператор n;
end
#verilog