Когда симулятор выполняет r2 <= @(posedge clk) r2 + 1
, он выполняет следующие шаги:
- Оценка
r2 + 1
- запланировать событие обновления неблокирующего назначения (NBA), которое будет выполнено на следующем этапе clk
Когда симулятор выполняет @(posedge clk) r2 <= r2 + 1
, он выполняет следующие шаги:
- приостановить процесс
always
и запланировать его возобновление на следующем этапе clk
- когда процесс возобновится, выполните
r2 <= r2 + 1
NBA, выполнив следующие действия:
- оценка
r2 + 1
- запланировать событие обновления NBA на текущее время
Первая форма анализируется как неблокирующее присвоение и выполняется в нулевое время. Задержка применяется только к событию обновления, генерируемому при выполнении NBA. Вторая форма анализируется как элемент управления задержкой операторов, за которым следует NBA. Он не выполняется в нулевое время, поскольку задержка применяется к выполнению оператора, а не только к событию обновления.
Первая форма представляет собой бесконечный цикл, поскольку тело цикла while
выполняется за нулевое время, а события, которые будут увеличивать r2
, запланированы на будущее время.
Со второй формой вы все равно захотите быть осторожнее с граничными условиями, когда цикл завершается. После планирования обновления, в котором для r2
установлено значение n + 1
, условие будет оцениваться как истинное еще раз до применения этого обновления.