[Verilog] Blocking vs Non-blocking

준치·2021년 12월 29일

[Verilog]

목록 보기
4/9

절차적 할당문의 두 가지 형태

Blocking문

Blocking문은 순차적 블록에 열거된 순서대로 수행된다. "=" 연산자를 사용한다.

reg 	   x, y, z;
reg [15:0] reg_a, reg_b;
integer    count;

// 모든 행위 수준 문장은 반드시 initial 또는 always블록 안에서 수행.
initial
begin
    x  		  = 0; // 스칼라 할당
    y 		  = 1;
    z 		  = 1;
    count	  = 0; // 정수 변수의 할당
    reg_a	  = 16'b0;
    reg_b	  = reg_a; // 벡터의 초기화
    
    #15 reg_a[2]     = 1'b1; // 지연을 가지고 있는 비트 선택 할당
    #10 reg_b[15:13] = {x, y, z}; // 벡터의 부분적 선택에 연결의 결과를 할당.
    count	     = count + 1; // 카운트 증가
end

blocking문의 특성에 따라 모든 문장은 begin-end내에서 순차적으로 수행된다.

  • reg_a[2] = 1'b1; : 단위시간 15에 수행된다.
  • reg_b[15:13] = {x, y, z}; : 단위시간 25에 수행된다.
  • count = count + 1; : 단위시간 25에 수행된다.

Non-blocking문

Non-blocking할당은 순차적 블록내 앞선 문장이 끝나지 않아도 할당 스케줄링을 할 수 있게 해 준다. "<=" 연산자를 이용한다. 관계 연산자와 헷갈리지 말자.

reg 	   x, y, z;
reg [15:0] reg_a, reg_b;
integer    count;

// 모든 행위 수준 문장은 반드시 initial 또는 always블록 안에서 수행.
initial
begin
    x  		  = 0; // 스칼라 할당
    y 		  = 1;
    z 		  = 1;
    count	  = 0; // 정수 변수의 할당
    reg_a	  = 16'b0;
    reg_b	  = reg_a; // 벡터의 초기화
    
    #15 reg_a[2]     <= 1'b1; // 지연을 가지고 있는 비트 선택 할당
    #10 reg_b[15:13] <= {x, y, z}; // 벡터의 부분적 선택에 연결의 결과를 할당.
    count	     <= count + 1; // 카운트 증가
end

값의 초기화는 순차적으로 진행되지만, 마지막 3개의 non-blocking문장은 다음과 같은 시뮬레이션 시간에 수행된다.

  • reg_a[2] = 1'b1; : 단위시간 15에 수행된다.
  • reg_b[15:13] = {x, y, z}; : 단위시간 10에 수행된다.
  • count = count + 1; : 지연 없이 단위시간 0에 수행된다.
    위 처럼 시뮬레이터는 한 non-blocking문장을 수행하고 마칠때까지 기다리지 않고 동시에 다음 문장을 연속적으로 스케줄한다.
    --같은 블록안에서 두가지를 혼용하지 않는것이 좋다.

디지털 설계에서 non-blocking문은 공통적인 사건 후에 동시에 데이터 전송이 일어나는 곳에서 사용한다. (ex. flip-flop과 같은 clk에 동기화되는 sequential logic)
단점으로는 시뮬레이터 성능을 하락시키고 메모리 사용량을 늘리는 것의 원인이 될 수도 있다.

profile
설계 엔지니어 지망생

0개의 댓글