Когда эти блоки будут выполнены? - PullRequest
0 голосов
/ 02 октября 2018

1) Когда будет выполнен этот процедурный блок?

output a;reg a;

always@(a)
begin
// Do something...
end

В C это будет выполняться, когда «a» имеет значение ненулевое .

2) Когда это утверждение if будет верным?

if(!a)
begin
// Do something...
end

Я пришел из C и на самом деле запутался в Verilog.

1 Ответ

0 голосов
/ 03 октября 2018

verilog - симулятор с 4 состояниями, что означает, что любой бит в переменной может иметь одно из 4 значений: 0, 1, x и z.'x' выражает неизвестное значение, и все переменные в verilog инициализируются в это значение в начале.

сейчас, если a инициализируется в x, следующие операторы всегда будут неудачными:

if (a) -> because x cannot be true (in verilog)
if (!a) -> false, because !x is also unknown and is x;

Вы должны проверить Verilog симуляции с 4 состояниями и арифметические правила.

Всегда блокировать, с другой стороны, будет ждать, пока значение 'a' не изменится, например, с 'x' на '0'.

always @(a) ...

Итак, пока вы не присвоите a значение '1', оператор 'if' не будет выполнен, и блок не будет выполняться, пока вы не измените значение 'a' на что-то отличное от 'Икс'.Инициализация этих переменных обычно выполняется в коде тестового стенда, скажем, в начальном блоке.Например,

 initial #10 a = 1; // initialize 'a' to '1' after 10 time units. 

Поскольку вы пришли из 'c', существует большая разница в концепции языка.Verilog - это параллельный язык программирования, это означает, что все процедурные блоки выполняются преимущественно параллельно. начальные блоки и всегда блоки являются процедурными блоками.Операции в стороне блока выполняются последовательно, но два разных блока выполняются параллельно.События и задержки вызывают упреждение.

...