Почему всегда блокировка не реактивируется, когда в списке чувствительности есть переназначение логики
Сигнал 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.