Blocking (=) : Blocking 구문을 포함하면 다음 구문의 실행은 현재의 Blocking 구문이 완료될 때까지 차단(Blocking)됩니다. 즉, 순차적으로 실행됩니다.
ex) Blocking
inital begin
a = #10 b;
c = #5 a;
end
Non-Blocking (<=) : Non-Blocking 구문끼리 동시에 실행됩니다. 이 특징을 활용해 병렬 동작을 모델링할 수 있습니다.
ex) Non-Blocking
initial begin
a <= #10 b;
c <= #5 a
end
Blocking, Non-Blocking Statements 코딩 시 유의점
1. 다른 프로세스에서 같은 변수에 대해 동시에(동일한 시간 단계에서) 여러 할당을 피해야 합니다.
ex)
initial #10 a = 1'b0;
initial #10 a = 1'b1;
Verilog에서는 여러 프로세스가 동시에 실행될 수 있습니다. 각 프로세스는 독립적으로 동작하며, 프로세스 내에서 변수에 대한 할당이 발생할 수 있습니다. 같은 시간 단계에서 여러 프로세스에서 같은 변수에 대해 동시에 값을 할당하면 결과가 예측 불가능하고 모호해지는 문제가 발생할 수 있습니다.
2. Verilog에서 동일한 프로세스 내에서 같은 변수에 동시에(동일한 시간 단계에서) 여러 개의 할당이 발생하면 마지막 할당의 결과만 해당 변수의 값에 반영됩니다.
ex)
initial begin
a = 1'b0;
a = 1'b1; // Last value of a
end
initial begin
a <= #10 1'b1;
a <= #10 1'b0; // Last value of a
end
3. Verilog에서 동일한 시간 단계(time step) 내에서, Blocking 할당문이 Non-Blocking 할당문보다 먼저 실행됩니다.
이는 시뮬레이션의 특성 때문인데 Blocking 할당문이 나타난 순서대로 할당문을 실행하기 때문에, Blocking 할당문이 먼저 실행되어 해당 값이 바로 반영됩니다. 다음에 Non-Blocking 할당문이 실행되어 스케줄링만 이루어집니다.
그래서 Blocking 할당문은 동일한 시간 단계 내에서 가장 마지막에 할당된 값으로 결과가 결정되며, Non-Blocking 할당문은 해당 시간 단계에서 스케줄링만 이루어집니다.
ex)
initial #10 a = 1'b0; // 1st
initial #10 a <= 1'b1; // 2nd
4. 위와 같은 특성으로 인해 같은 Procedural block 안에 Blocking과 Non-Blocking 구문은 동시에 사용하지 않습니다.
특성
1. Procedural Block들은 병렬 동작하므로 구문 실행 순서가 보장되지 않아 Race Condition이 발생할 수 있습니다.
이를 피하기 위해서는 구문간에 적절한 동기화 기법을 사용하거나, 우선순위를 지정하여 실행 순서를 제어하는 방법을 사용해야 합니다. 또한, 모든 구문들이 동일한 변수에 동시에 업데이트를 수행하는 것을 피하고, 변수 업데이트를 단일 프로세서 블록에서 처리하는 것이 좋습니다.
2. Non-Blocking 구문은 같은 변수에 대해 서로 다른 타이밍에 적용될 수 있습니다.
Continuous 구문과는 달리, Non-Blocking 구문은 이전 할당된 값을 취소하거나 덮어쓰지 않고 예정된 구문을 실행합니다.