Инструкции циклов
Циклы допускаются только в пределах процедурных блоков. Verilog предусматривает четыре инструкции для циклов, подобных инструкциям в других языках:
- forever
- repeat
- while
- for
Цикл forever
Цикл forever выполняется бесконечно. Обычно его используют в блоках инициализации.
Синтаксис : forever < инструкции >
В циклах forever следует обращать внимание на следующее: если там есть тайминговые конструкции, симуляция может зависнуть. Следующий код показывает, как это может произойти. В коде есть тайминг в цикле forever.
Пример "холостой" тактовый генератор
Verilog Code:
module forever_example (); reg clk; initial begin #1 clk = 0; forever begin #5 clk = ! clk; end end initial begin $monitor ("Time = %d clk = %b",$time, clk); #100 $finish; end endmodule
Цикл repeat
Цикл repeat выполняется фиксированное число < повторов > раз:
Синтксис: repeat (< повторов >) < инструкции >
Пример - repeat
Verilog Code:
module repeat_example(); reg [3:0] opcode; reg [15:0] data; reg temp; always @ (opcode or data) begin if (opcode == 10) begin // Perform rotate repeat (8) begin #1 temp = data[15]; data = data << 1; data[0] = temp; end end end // Simple test code initial begin $display (" TEMP DATA"); $monitor (" %b %b ",temp, data); #1 data = 18'hF0; #1 opcode = 10; #10 opcode = 0; #1 $finish; end endmodule
Цикл while
Цикл while выполняется до достижения истинности условия в нем. Он полностью аналогичен while в других языках программирования.
Синтксис: while (< выражение >) < инструкции >
Пример - while
Verilog Code:
module while_example(); reg [5:0] loc; reg [7:0] data; always @ (data or loc) begin loc = 0; // If Data is 0, then loc is 32 (invalid value) if (data == 0) begin loc = 32; end else begin while (data[0] == 0) begin loc = loc + 1; data = data >> 1; end end $display ("DATA = %b LOCATION = %d",data,loc); end initial begin #1 data = 8'b11; #1 data = 8'b100; #1 data = 8'b1000; #1 data = 8'b1000_0000; #1 data = 8'b0; #1 $finish; end endmodule
Цикл for
Цикл for аналогичен такому же циклу в других языках программирования.
- Выполняется < начальное присваивание > однократно в начале цикла.
- Выполняется цикл до вычисления истинности < выражения >.
- Все инструкции в цикле выполняются с каждым проходом.
Синтаксис: for (< начальное присваивание >; < выражение >, < шаг цикла >) < инструкции >
Примечание: Verilog не использует оператора инкремента ++ как в языке C++.
Пример - for
Verilog Code:
module for_example(); integer i; reg [7:0] ram [0:255]; initial begin for (i = 0; i < 256; i = i + 1) begin #1 $display(" Address = %g Data = %h",i,ram[i]); ram[i] <= 0; // Initialize the RAM with 0 #1 $display(" Address = %g Data = %h",i,ram[i]); end #1 $finish; end endmodule