Понимание стратифицированной очереди событий Verilog - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь понять, как работает алгоритм планирования Verilog. В приведенном ниже примере выводится 0, xxxx, а не 1010. Мне не понятно почему. Если я поставлю задержку перед $display, она выдаст 1010.

module test;
  reg [3:0] t_var;
  initial begin
    t_var <= 4'b1010;
    $display("%0t, %b", $realtime, t_var);
  end
endmodule

Тот же вывод, 0, xxxx, для приведенного ниже примера:

module test;
  reg [3:0] t_var;
  wire [3:0] y;
  assign y = ~t_var;
  initial begin
    t_var = 4'b1010;
    $display("%0t, %b, %b", $realtime, t_var, y);
  end
endmodule

На основеВ примерах, похоже, что неблокирующее назначение и непрерывное назначение представляют собой оба двухэтапных процесса, в которых RHS оценивается на текущем временном шаге, а LHS запланировано на следующее времяшаг (если задержка не указана) или более поздний шаг (если указана задержка).

Может ли кто-нибудь подтвердить и объяснить мне пошаговое описание алгоритма, приведенного ниже (от Клиффорда Каммингса), как оно применимо к приведенным выше примерам?

Спасибо!

enter image description here

1 Ответ

2 голосов
/ 20 октября 2019

Вы правы, говоря, что неблокирующее назначение (NBA) и непрерывное назначение (CA) действуют как двухэтапные процессы, потому что они есть. Проблема в том, что вы называете «следующий шаг по времени» - это не прогресс во времени;это итерация цикла while () без опережающего времени. Обычно это называется дельта-шаг .

При использовании NBA LHS назначается как событие обновления NBA, но сразу после этого $display является следующим активным событием, которое нужно выполнить. Он печатает значение y до того, как события обновления NBA смогут выполнить. Как только вы вводите задержку, NBA имеет шанс выполнить перед переходом к следующему событию.

При использовании CA вы создаете отдельный процесс, который активируется каждый раз, когда RHS меняет свое назначение. на LHS в том же активном регионе. initial и CA - два независимых процесса, и порядок между операторами в активной области недетерминирован. Итак, видите ли вы старое неинициализированное значение y или обновленное значение y, это условие гонки. И вы увидите различия между симуляторами в зависимости от того, как они оптимизируют этот код.

...