본문 바로가기
Language/Verilog & SV

[Verilog] Blocking(=) vs Nonblocking(<=)

by VIR&US 2023. 7. 19.
반응형

목차


Blocking assignments (BA)

always 블록 내에서 실행 순서를 제어하기 위해 사용합니다.

  • 현재 명령문이 실행될 때까지 다음 명령문의 실행을 차단합니다.
  • 앞선 명령문이 실행되고 나서 뒷선 명령문들이 차례대로 실행됩니다.
assume a = b = 0 initially;
a = 1; //executed first
b = a; //executed second

 

a = 1, b = 1

Nonblocking assignments (NBA)

always 블록 내에서 실행 순서를 제어하기 위해 사용합니다.

  • 모든 문장의 RHS가 먼저 결정된 다음 LHS가 함께 할당됩니다.
  • NBA는 동시 또는 병렬로 명령문을 실행합니다.
assume a = b = 0 initially;
a ​<= 1; //executed first
b <= a; //executed second

 

a = 1, b = 0

Example

module non_block1;
        reg a, b, c, d, e, f;
        //blocking assignments

        initial begin
               a = #10 1; // a will be 1 at time 10
               b = #2 0; // b will be 0 at time 12
               c = #4 1; // c will be 1 at time 16
        end

        //non-blocking assignments. Runs concurrently
        initial begin
               d <= #10 1; // d will be 1 at time 10
               e <= #2 0; // e will be 0 at time 2
               f <= #4 1; // f will be 1 at time 4
        end

endmodule

Guideline

  • Sequential logic를 모델링할 때 Nonblocking 할당을 사용하세요.
  • latch를 모델링할 때 Nonblocking 할당을 사용하세요.
  • Combinational logic를 모델링할 때 항상 Blocking 할당을 사용하세요.
  • 동일한 always 블록 내에서 Sequential 및 Combinational logic를 모두 모델링할 때 Nonblocking 할당을 사용하세요.
  • 동일한 always 블록에서 Blocking 및 Nonblocking 할당을 혼합하지 마세요.
  • 두 개 이상의 always 블록에서 동일한 변수에 할당하지 마세요.
  • Nonblocking 할당을 사용하여 할당된 값을 표시하려면 $strobe를 사용하세요.
  • #0 지연을 사용하여 할당하지 마세요. 합성불가능합니다. (non-synthesizable)
728x90
반응형

'Language > Verilog & SV' 카테고리의 다른 글

[Verilog] Full-adder, Ripple-carry adder  (0) 2023.07.20
[Verilog] Clock generator  (0) 2023.07.20
[Verilog] Parameter  (0) 2023.07.19
[System Verilog] 'break' and 'continue'  (0) 2023.07.19
[Verilog] D F/F  (0) 2023.07.19