프로그래밍/Verilog

베릴로그 문법 (1) 기본 구성

베린이 2024. 6. 10. 13:35
반응형

이 글에서는 verilog 기본 문법을 살펴보겠습니다. 먼저 알아야 할 것은 한 문장의 끝은 세미콜론(;)으로 마무리해야 한다는 겁니다.

 

- Verilog 기본 문법

module module_name (port_list);
  
  //선언 
  reg reg_name;
  wire wire_name;
  parameter parameter_name;
  
  //회로 설명 part
  인스턴스화
  always 문
  initial 문
  function, task 정의
  assign 문
    
endmodule

 

하나하나 알아볼까요?

 

1. 모듈 선언

module: 기본 설계 단위입니다. module - endmodule, 한 파일에 여러 개의 module이 들어갈 수 있지만 한 개의 module만 작성하는 것을 추천합니다.

port_list: 해당 회로에 input port와 output port를 정의해 줍니다. input과 output port가 없으면 비워도 됩니다. ()

 

2. 자료형, 상수 선언

베릴로그 자료형은 크게 2가지로 나뉩니다.(Net, register)

- Net

Net은 하드웨어 간의 단순한 물리적 연결입니다, 따라서 연속 할당(assign 문)에 사용됩니다. Net의 종류에는 wire, wand, wor 등이 있지만 실무에서 wire 말고 다른 net을 본 적은 없으므로 저는 wire만 사용하겠습니다.

- Register

Variable 자료형으로 절차적 할당(=, <=)에 사용됩니다. Register의 종류에는 reg, integer, real 등이 있지만 reg를 주로 사용합니다.

reg: 플립플롭이나 래치 같은 저장소자를 모델링할 수 있습니다.

 

마지막으로 parameter를 통해 상수를 선언할 수 있습니다.

 

3. 회로 설명

실제 회로의 기능이나 동작하는 방식, timing이 기술됩니다. 인스턴스화를 통해 회로의 구조를 기술할 수 있고 inital문, always문 등을 통해 회로 동작을 기술합니다.

여기서 인스턴스화는 이미 완성된 모듈은 서브 모듈로 가져오는 것을 말합니다.

 

회로 설명에서 사용되는 구문에는 크게 2가지가 있는데 논리 합성에 사용되느냐, 되지 않느냐로 나눌 수 있습니다. 논리 합성이 되는 구문은 하드웨어 설계에, 합성되지 않는 구문은 시뮬레이션에 사용된다고 보시면 됩니다. 

논리합성 Simulation
assign
if ~ else
case
always 등
테스트벤치의 회로 설명
시스템 task ($display, $finish 등)

 

마지막으로 주의할 점은, 선언된 자료형과 상수만 사용해야 한다는 것입니다. 그렇지 않을 경우, syntax error가 발생합니다.

 

4. 주석

//: 이후로는 해당 라인 끝까지 주석처리됩니다.

/* ~ */: 구간 주석

reg a; //이후로는 주석처리
reg b;

//wire f만 선언됨
wire /*c;
wire d;
wire e;
wire */ f;