ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Verilog] 합성가능한 Verilog를 위한 Nonblocking assign 잘 사용하기
    Tech/Verilog 2013. 10. 7. 22:53

    Verilog를 사용하다보면, C나 Java 등을 다루면서 써왔던 순차적 기술 방식과 다르게 동시에 동작하는 기술 방식 때문에 당황하게 된다. 특히나, Blocking과 Non-blocking 이라는 2가지 대입문이 존재하기 때문에 어디에 뭘 써야하나 고민될 때가 많다.


    특히, Verilog는 코드 흐름상으로는 말이 되더라도 나중에 Digital circuit으로 합성하면 동작하지 않는 경우도 많아서 상당히 골치아프다. 제대로 이해하기 위해서는 Verilog가 어떻게 digital circuit으로 구현되는지 따져가면서 공부하는게 가장 좋지만, 꼭 그렇게 세부적으로 하지 않더라도 합성가능한 Digital Circuit을 가능하게 하는 몇가지 Rule of Thumb이 있다. 이를 잘 소개한 Article이 있는데, 꽤 유명하니 Verilog를 쓴다면 한번쯤 정독해볼만 하다.


    Clifford E. Cummings, “Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!”, SNUG(Synopsys User Group) 2000 User Paper, section-MC1(1st paper), March 2000.


    합성가능한 Verilog를 작성하는 8가지 Guideline

    위에서 소개한 Article에서는 8가지 Verilog 작성 가이드라인을 제안하고 있다.

    1. When modeling sequential logic, use nonblocking assignments.: Sequential Logic (Flip-flop이 포함된 회로) 을 작성할 때는, <= 로 대입하는 Nonblocking assigment을 사용하자.
    2. When modeling latches, use nonblocking assigments.: Latch를 작성할 때에도 <=로 대입하자. 즉, 메모리로 활용될 수 있는 block은 모두 <=로 작성하면 편하다.
    3. When modeling combinational logic with an always block, use blocking assignments.: always @로 combinational logic (memory-less logic)을 만들 때에는 =를 사용해서 대입하자.
    4. When modeling both sequential and combinational logic within the same always block, use nonblocking assigments.: 같은 always 문안에서 sequential logic과 combinational logic을 함께 기술할 계획이라면 <=를 사용한 nonblocking 대입으로 통일하자.
    5. Do nit mix blocking and nonblocking assigment in the same always block.: 하나의 always 안에서는 blocking (= 대입) 과 nonblocking(<= 대입)을 혼용해서 쓰지 말자.
    6. Do not make assignments to the same variable from more than one always block.: 하나의 변수에 대해 여러 개의 always에서 대입하도록 작성하지 말자.
    7. Use $strobe to display values that have been assigned using nonblocking assignments.: nonblocking (<=)으로 대입된 변수를 simulation에서 확인하고자 할 때에는 $strobe를 이용해서 출력하자.
    8. Do not make assignment using #0 delays.: Simulation 시, zero-delay를 주지 말자. Verilog Simulation의 Event Queue에 해당하는 포스팅을 차후에 할 예정이지만 간단히 설명하면, 흔히 많은 이들이 #0을 이용해서 대입하면 time step의 가장 마지막에 assignment를 수행하도록 queuing 것이라 생각하지만, 실제로는 inactive events queue에 들어가게 된다. 즉, 같은 time step에서 non-blocking 보다 먼저 실행된다. 해당 time step의 최종 값을 보고싶다면, 굳이 #0 $display … 같은 걸 쓰지 말고, $strobe를 쓰자.


    댓글

Copyright 2022 JY