공부하면서 Verilog 코드를 보게 되면 수식을 a = b가 아닌 a <= b로 쓰여진 부분이 상당히 많습니다.

이는 할당(Assignment)와 관련해서 Blocking과 Non-Blocking이라는 것이 존재하기 때문인데요.

Blocking하면 농구에서의 블로킹과 같이 무엇을 막는다는 의미가 떠오릅니다.

Blocking Assignment는 여러줄의 할당하는 문장이 있을 때, 한 줄이 실행되고 할당되기 이전에
다음줄이 실행되는 것을 막기 때문에 Blocking이라는 이름이 붙었는데요. 

이 의미에 대해서는 포스트를 써가면서 설명을 해보도록 할게요.


- Blocking Assignment

앞서 잠깐 말했듯이 Blocking이라는 것은 여러줄의 할당문이 있을 때, 다른 줄의 할당문으로 넘어가는 것을 막는 것입니다.

always @(posedge clk or negedge rst_n) begin
  b = a;
  c = b;
  d = c;
end

만약 위와 같은 Code가 있다고 가정해볼게요.

Testbench를 구성해서 a=1, b=2, c=3, d=4가 들어갔다고도 가정해보죠.

그러면 결과가 어떻게 될까요?

 

위와 같이 여러줄의 할당문이 존재하고 =을 사용해서 Blocking Assignment를 했다면
첫번째 줄인 b=a;가 처리되기 이전에 c=b;나 d=c;가 실행되지 않습니다.

또 b=a;가 처리되고 c=b;가 처리되기 이전에 d=c;가 실행되지 않고요.

 

따라서 첫번째 줄 b=a;가 실행되어 b에 a의 값이 들어가 b=1이 되고

그 다음에 c=b;가 실행되어 c에 b의 값이 들어가게 되는데 위의 과정에서 b=1이 되었기 때문에 c=1이 됩니다.

d도 마찬가지로 c의 값이 들어가게 되어 d=1이 되게 되고

최종적으로 a=b=c=d=1의 결과가 나타나게 되겠습니다.

 

위 모든 과정은 한 clock의 상승 엣지에서 일어나게 되고 이걸 clock과 함께 그림으로 표현해보면 다음과 같아요.

Blocking Assignment


- Non-Blocking Assignment

반대로 Non-Blocking Assignment는 동시 실행이라고 생각하면 편한데요.

always @(posedge clk or negedge rst_n) begin
  b <= a;
  c <= b;
  d <= c;
end

앞서 봤던 코드가 동일하게 존재하고 단지 =을 <=으로 바꿔 Non-Blocking Assignment를 해줬다고 해볼게요.

Non-Blocking은 동시 실행이라고 했죠.

따라서 b <= a; c <= b; d <= c;가 병렬적으로 동시에 실행됩니다. 

 

그러면 첫번째 Clock 상승 엣지에서는 어떻게 될까요?

b <= a : b에 a의 값 1이 들어가서 b = 1이 됩니다.

c <= b : c에 b의 값이 들어가는데 b <= a와 동시에 실행되기 때문에 이때 b에는 a의 값 1이 들어온 상태가 아닌 초기값 2가 있죠. 따라서 c = 2가 됩니다.

d <= c : c <= b과정과 마찬가지 이유로 d에는 c의 초기값 3이 들어가서 d = 3이 됩니다.

 

두번째 Clock 상승 엣지에서는요?

b <= a : 앞서 첫번째 Clock 상승 엣지에서 b는 1이 됐습니다. a = b = 1

c <= b : c에 b의 값이 들어가는데 이때는 b의 값이 1인 상태이기 때문에 c = 1이 됩니다.

d <= c : c <= b와 동타임에 실행이 되기 때문에 실행된 시점에서 c는 b=1값을 받은 상태가 아닌 첫번째 Clock에서 2가 된 상태기 때문에 이때도 d = 2가 됩니다.

 

세번째 Clock 상승 엣지에서는 이제 예상이 되시죠?

b <= a : 앞서 첫번째 Clock 상승 엣지에서 b는 1이 됐습니다. b = a = 1

c <= b : 앞서 두번째 Clock 상승 엣지에서 c는 1이 됐습니다. c = b = 1

d <= c : 세번째 Clock 상승 엣지 시점에서 c는 1값을 가지고 있기 때문에 d에 c의 값 1이 들어가서 d=1이 됩니다.

 

Non-Blocking도 그림으로 표현해보면 다음과 같습니다.

Non-Blocking Assignment

 


Blocking과 Non-Blocking의 차이가 좀 설명이 됐을까요?

Verilog 코드를 보다보면 always @() begin~end 구문 안에서 Non-Blocking Assignment를 쓰는 것이 일반적인데요.

위를 천천히 보시면 느낄 수 있듯이 Non-Blocking 같은 경우에는 모든 할당문이 동시에 실행이 되기 때문에
오히려 한 클럭씩 순차적으로 진행된다는 느낌이 존재하죠.

 

이러한 이유로 clock과 관련한 sensitive list를 사용하는 always 문에서 Non-Blocking(<=)이 훨씬 많이 사용됩니다. 

아무래도 설계자가 always @(posedge clk or negedge rst_n)과 같은 구문을 사용하는 이유는
Clock에 동기화를 시켜서 순차회로를 만들 목적인데 이 목적에 더 잘 부합하는 것이 Non-Blocking Assignment이기 때문이겠네요.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기