Добавление Verilog неожиданно приводит к х - PullRequest
0 голосов
/ 26 сентября 2019

Выход этого исполняемого файла равен x, пока вы не удалите d из назначения c.Выход ххх х.Когда d удалено из присвоения, вывод будет таким, как ожидалось, «2 3 4 5».

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Оба выхода действительны, у вас есть состояние гонки.

Непрерывный оператор assign - это параллельный процесс, который ожидает изменения сигналов на RHS, затем оценивает выражение и выполняет назначение.

Блок initial - это еще один параллельный процесс.Когда вы процедурно делаете назначения каждому сигналу, планировщик может свободно переходить к другому процессу и выполнять его, ... или он может продолжать выполнять операторы до достижения задержки блокировки, или он не завершается.

Если так, многие инструменты in-line непрерывно присваивают в качестве оптимизации, выполняя их только тогда, когда на lhs ссылаются.Это может быть то, что происходит здесь, когда вы удаляете d из rhs.

1 голос
/ 27 сентября 2019

Ваша проблема в понимании симуляции verilog.Это управляемый событиями поток.

В вашем случае присваивание 'c' происходит при изменении любого ввода в оператор assign .Но изменение будет обнаружено только после выполнения несинхронного блока в вашем начальном блоке.И этот кусок закончился последним утверждением.

Таким образом, в результате все ваши $ display (c) покажут значение 'c', существовавшее до того, как начальный блок начнет выполнение.Чтобы увидеть обновления, вам нужно подождать, пока код сможет распространиться.Простым примером будет следующий:

initial begin
  d = 0;
  a = 1;
  b = 1;
  #1 $display(c);
  a = 2;
  b = 1;
  #1 $display(c);
  a = 2;
  b = 2;
  #1 $display(c);
  a = 2;
  b = 3;
  d = 3;
  #1 $display(c);
end

Добавление # 1 перед каждым отображением $ позволит изменениям распространяться и отображать ожидаемые результаты.

В интерпретациикод как твой.Обратите внимание, что исходный блок имеет a, b и d в качестве вывода.В последовательном коде без конструкций контроля времени он просто переназначает значения этих выходов.Для семантики моделирования имеют значение только последние присвоенные значения, которые должны инициировать событие.Однако, похоже, что некоторые симуляторы могут интерпретировать это по-разному и инициировать события всякий раз, когда значение изменяется.Это зависит от реализации симулятора в этом случае.Например, как я заметил, VCS запускает события для каждого изменения, но только в некоторых случаях.NC не запускает эти события.

Полагаю, вы можете интерпретировать поведение симуляции как undefined для этого вида кода.Чтобы сделать его детерминированным, используйте правильные элементы управления временем, как в примере выше.

...