#8-1. 동기식 vs 비동기식, blocking vs non-blocking(수정중)

Verilog/Verilog HDL강의정리(KOCW) 2023. 7. 21. 13:04
반응형

이번 글에서는 잠시 강의에서 벗어나 동기식과 비동기식의 차이, blocking과 non-blocking의 차이에 대해서 알아보도록 하겠다.


1. Blocking vs Non-blocking

Blocking statement부터 먼저 알아보도록 하자
Blocking statement는 할당문이 여러개 있을 때, 하나의 할당문의 실행이 완료된 이후에 그 다음 할당문이 실행되는 방식을 blcoking statement라고 이야기한다. 이는 결국 할당문이 실행되고 있을 때, 다른 할당문이 Block 된다고 생각하면 이해가 좀 더 쉽겠다.(누군가를 막는 행위를 블로킹이라고도 한다.)

배구에서 블로킹, 공이 넘어오지 못하게 막는 행위

blocking statement는 = 을 활용하여 작성하며, 순차적으로 실행되는 프로그램에서 사용하게 된다.
예시를 살펴보자

initial begin
    rega = 0;	//rega에 0을 할당
    regb[3] = 1; //regb의 3비트자리에 1을 할당(regb[3:0]이라고 가정)
    regc[3:5] = 7; //regc 의 3~5 비트자리에 7을 할당
    mema[address] = 8'hff; //mema의 해당하는 주소에 8비트 16진법 ff를 할당(실제로는 1111_1111)
    {carry, acc} = rega+regb; // carry, acc를 합친 비트에 rega+regb 값을 할당
end

위 코드는 rega=0부터 순차적으로 실행되게 되며, 한 할당문이 끝나기 전에 다른 할당문이 실행되지 않는다.
다음으로는 Non- blocking statement에 대해 살펴보면
Non-blocking 의 경우 blocking 없이 코드가 실행되는 방식이다. 이 할당문들은 우변이 동시에 평가된 후, 문장의 나열 순서 혹은 delay에 따라 좌변에 값에 할당되게 된다. 즉, 여러개의 할당문이 동시에 신호를 감지한 후 좌변에 할당되는 방식이라고 생각하면 되겠다.
차이점을 알아보기 위해 할당문의 비교 예시를 확인해보도록 하겠다.
 

10ns 의 클럭을 갖는 blocking/non-blocking statement

왼쪽의 코드는 10ns의 클럭을 설정한 후 , non- blocking statement를 활용한 구문
오른쪽의 코드는 동일한 클럭 상황에서, blocking statement를 활용한 구문이다.
non-blocking의 경우 a, b의 값이 동시에 바뀌게 된다. 따라서, a, b 의 값이 서로 동시에 0과 1을 전환하게 되고
반대로 blocking을 통해 할당문을 사용하게 되면, a에 먼저 b의 값이 할당 된후, 새로운 a값이 그다음 실행문인 b=a에서 적용되어, 결국 한 클럭 안에서 a와 b의 값이 같아지는 상황이 발생하게 된다.

2. Synchronous(동기식) vs Asynchronous(비동기식)

이번엔 동기식과 비동기식의 차이점에 대해서 알아본다. 일단 간단하개 동기식은 clock에 의해서만 다음 always구문이 동작하여 값을 바꾼다고 생각하면 되겠고, 비동기식의 경우 clock외에 reset등의 요소 역시 always구문을 동작하게끔 만드는 방식이라 할 수 있겠다. 즉, 동기식에서는 무조건 clock에 의해서만 다음 사이클과 값들이 넘어가지먼, 비동기식에서는 clock과 대체적으로 reset등에 의해 다음 값이 전달되는 것이다. 코드를 통해 알아보도록 하겠다.




===================회로도 들어갈 자리==================

반응형