Управление потоком в Verilog: IF-ELSE, Case, циклы и не только
Реализация поведения оборудования невозможна без условных операторов и механизмов управления логикой. Verilog предоставляет набор блоков управления потоком для этих целей.
if-else-if
Этот условный оператор решает, выполнять ли определенные операторы. Он очень похож на if-else-if в C. Если выражение истинно, выполняется первый оператор. Если ложно и существует else, выполняется часть else.
// if без else
if (expression) [statement]
// if с else
if (expression) [statement] else [statement]
// Несколько операторов — в begin/end
if (expression) begin [multiple statements] end
else begin [multiple statements] end
// if-else-if цепочка
if (expression) [statement]
else if (expression) [statement]
else [statement]
Часть else опциональна. Пропуск else во вложенных if может вызывать путаницу. Чтобы избежать этого, всегда ассоциируйте else с ближайшим предшествующим if, у которого нет else, или заключайте операторы в begin-end. Последний else обрабатывает случай «ни одно условие не выполнилось» (default).
Нажмите здесь для подробностей об if-else-if
Циклы позволяют выполнять один или несколько операторов в блоке заданное число раз. В Verilog есть четыре типа циклов.
Цикл forever
Выполняет операторы в блоке бесконечно.
forever [statement]
forever begin [multiple statements] end
Пример
module my_design;
initial begin
forever begin
$display ("Это будет печататься вечно, симуляция может зависнуть...");
end
end
endmodule
Simulation Log
ncsim> run This will be printed forever, simulation can hang ... This will be printed forever, simulation can hang ... ... This will be printed forever, simulation can hang ... Result reached the maximum of 5000 lines. Killing process.
Цикл repeat
Выполняет операторы фиксированное число раз. Если выражение оценивается в X или Z, оно считается нулем и цикл не выполняется.
repeat ([num_of_times]) begin [statements] end
repeat ([num_of_times]) @ ([some_event]) begin [statements] end
Пример
module my_design;
initial begin
repeat(4) begin
$display("Это новая итерация ...");
end
end
endmodule
Simulation Log
ncsim> run This is a new iteration ... This is a new iteration ... This is a new iteration ... This is a new iteration ... ncsim: *W,RNQUIE: Simulation is complete.
Цикл while
Выполняет операторы, пока выражение истинно, и завершается, когда условие становится ложным. Если условие ложно с начала, операторы не выполняются ни разу.
while (expression) begin [statements] end
Пример
module my_design;
integer i = 5;
initial begin
while (i > 0) begin
$display ("Итерация#%0d", i);
i = i - 1;
end
end
endmodule
Simulation Log
ncsim> run Iteration#5 Iteration#4 Iteration#3 Iteration#2 Iteration#1 ncsim: *W,RNQUIE: Simulation is complete.
Цикл for
for ( initial_assignment; condition; increment_variable) begin [statements] end
Управляет операторами трехшаговым процессом:
- Инициализация счетчика цикла
- Оценка выражения, обычно с участием счетчика
- Инкремент счетчика, чтобы выражение стало ложным и цикл завершился
Пример
module my_design;
integer i = 5;
initial begin
for (i = 0; i < 5; i = i + 1) begin
$display ("Loop #%0d", i);
end
end
endmodule
Simulation Log
ncsim> run Loop #0 Loop #1 Loop #2 Loop #3 Loop #4 ncsim: *W,RNQUIE: Simulation is complete.
Нажмите здесь для подробностей о циклах for.
Verilog
- Выражения, операторы и блоки в C#: подробное руководство с примерами
- Понимание выражений, операторов и блоков в Java
- Освоение Verilog: полное руководство по проектированию цифровых схем
- Освоение конкатенации в Verilog: практическое руководство
- Понимание назначений в Verilog: типы, синтаксис и лучшие практики
- Блокирующие и неблокирующие назначения в Verilog: ключевые различия
- Управление потоком в Verilog: IF-ELSE, Case, циклы и не только
- Мастерство функций в Verilog для эффективного RTL дизайна
- Понимание задач (Tasks) в Verilog: отличия от функций, синтаксис и применение
- Управление задержками в Verilog: техники таймингов и лучшие практики