EE/Verilog HDL

[verilog HDL] Syntax 1. module & instantiation

아이스얼그레이 2022. 2. 15. 16:52

verilog는 HW 설계를 목적으로 만들어진 언어이며, C, C++과 문법이 상당히 유사합니다.

 

verilog에서는 module이라는 개념이 매우 중요합니다. C에서 비유하자면 함수와 그 기능이 매우 흡사합니다. 구현하고자 하는 module을 verilog 파일로 작성하고, testbench(이하 tb)라는 파일을 작성해 그 module을 simulation 할 수 있습니다. 이때 tb 또한 verilog 문법을 따라서 작성합니다. verilog 코딩을 해보면 알 수 있지만, 사실 module 자체의 코딩은 그렇게 길지 않습니다. 오히려 tb를 작성하는데 많은 개발 시간을 할애하게 됩니다.

 

module의 instantiation이라는 개념이 있는데, 이는 4-bit Ripple carry counter의 예시를 통해 살펴보겠습니다.

 

4-bit RCC는 4개의 T Flip Flop로 구성되며, T Flip Flop는 1개의 inverter와 1개의 D Flip Flop으로 구성됩니다.

 

위는 RCC를 구현한 verilog 소스코드입니다. input 2개(clk, reset)과 output 4개를 선언하고, T_FF라는 모듈을 4번 instantiation합니다. 여기서 instantiation이란, 다른 verilog 파일의 module을 현재 module로 불러오는 것 입니다. 이때 선언된 각각의 module을 instance라고 부르며 보통 module명을 소문자로 바꿔 그 이름을 정합니다.

 

다음은 T_FF을 구현한 verilog 소스코드 입니다. 1개의 input, 1개의 output, 1개의 wire로 구성됩니다. wire와 reg의 구분은 따로 글을 만들어서 작성할 생각입니다.

 

D Flip Flop

T_FF module에서도 D_FF과 not gate를 instantiation 하였습니다. D_FF은 다른 verilog 파일에서 선언한 module이고 not gate는 verilog에서 지원하는 내장 module입니다.

 

뭔가 Tree 구조가 보이지 않나요? RCC부터 순차적으로 instatiation 한 것을 도식화하면 다음 그림과 같습니다.

 

Design Hierarchy of RCC

최상위 hierarchy에 RCC가 있고, T_FF가 그 아래 hierarchy에 있습니다. verilog 코딩은 이러한 hierarchy 설정이 중요합니다. 물론 한 verilog 파일에 hierarchy 없이 RCC를 짜는 것도 가능하긴 합니다. 하지만 그렇게 코드를 짜면 readability가 상당히 떨어집니다.

 

제가 배우고 있는 교수님이 매우 강조하는 부분입니다. 어떤 언어든 readability가 중요하다는 것입니다. 교수님이 실무경험이 있으셔서 강조하는 게 아닌가 싶습니다.

 

다시 돌아와서 이러한 hierarchy을 통한 Design Methodology에는 2가지가 있습니다. 바로 top-down 방식과 bottom-up 방식입니다. 이 Design Methodology은 비단 verilog 뿐 아니라 다른 언어에서도 통용되는 것으로 알고 있습니다.

 

영어 단어 그대로 top-down 방식은 최상위 hierarchy module을 먼저 설계하고 그에 필요한 하위 hierarchy module을 설계하는 방식입니다.

 

bottom-up 방식은 반대로 최하위 hierarchy module을 먼저 설계합니다. 그리고 그 module을 통해 상위 hierarchy module을 만들고, 마지막으로 최상위 hierarchy module을 만드는 방식입니다.

 

제가 공부하는 학부 레벨에서는 이러한 방식의 구분이 크게 중요하지는 않다고 합니다. 하지만 module의 구조가 커지고 코드가 길어지면 Design Methodology가 매우 중요해지니 꼭 알고 있어야 하는 개념입니다.

 

또한 instaintiation은 module끼리도 가능하며, tb에서도 할 수 있습니다.


​그리고 module의 가독성을 위해서는 다음과 같은 순서를 따라 설계하여야 합니다.

 

이 순서를 따르지 않는다 해도 컴파일 에러는 발생하지 않습니다. 하지만 코드가 길어지거나 협업을 할 때, 이 rule을 따르지 않는다면 debugging에 시간을 많이 뺏길 수도 있습니다.

 

1. Module name, Port list, Port Declaration, Parameter(optional) 정의

 

2. wire(output), reg(input), other variables 선언

 

3. Data flow statements(assign) 작성

 

4. Instantiation of lower level modules

 

5. always & initial statement(behabioral statement)

 

6. Tasks & functions(추후 기술)

 

7. endmodule statement

 

HW를 설계할 때는 실수를 줄이는 코딩 습관이 매우 중요하며, 이를 위해 가독성이 높은 코드를 짜는 게 중요합니다.