Почему всегда блокировка не реактивируется, когда в списке чувствительности есть переназначение логики

Сигнал driver_a переназначается в блоке Always обратно на 0, но почему блок Always не активируется и присваивает значение driver_b?

always @(driver_a) begin
driver_b = driver_a;
driver_a = 0;
end

initial begin
driver_a = 0; driver_b = 0;
#2 driver_a = 8'h8;
#2 driver_a = 8'hf;
end

В осциллограмме я ожидаю, что после того, как driver_a назначит его значение для driver_b, затем на следующей строке, когда driver_a будет присвоено значение 0, я бы ожидал, что блок Always снова активируется и присвоит значение 0 обратно в driver_b.

однако это не тот случай, форма волны, кажется, показывает, что как только driver_a получает 0 в блоке Always, блок Always не активируется и присваивает 0 обратно значению driver_b. Короче говоря, я ожидаю, что значение driver_b всегда останется 0, так как код в блоке Always выполняется за нулевое время симуляции.

Я приложил изображение полученного сигнала ниже

1 ответ

Решение

Потому что код интерпретируется как единый упорядоченный набор операторов. Это так же, как если бы вы написали

always begin
     @(driver_a)           // 1
     driver_b = driver_a;  // 2
     driver_a = 0;         // 3
end

Оператор //1 означает "Ожидание изменения driver_a". Оператор //2 означает "Измените driver_b на значение driver_a". Оператор //3 означает "Измените driver_a на 0".

Поскольку always Блок - это отдельный поток, который выполняет операторы в последовательном порядке, изменение //3 уже произошло, когда он возвращается к выполнению //1.

Другие вопросы по тегам