본문 바로가기

Programming/Verilog

Verilog HDL 문법 (컴파일러 지시어, 조건문, 다중 분기, 반복문)



+ 컴파일러 지시어


'<키워드> 형식으로 사용한다. `define 과 `include 와 `timescale 이 있다.

define은 텍스트 매크로를 정의하는 용도로 사용하며, `include는 다른 verilog 소스 파일을 현재 소스 파일에 추가하는 용도로 사용한다. 일반적으로 헤더파일을 포함시키는데 사용한다.

`timescale 은 모듈의 참조 시간 단위를 지정한다. `timescale <시간 단위>/<시간 정밀도> 형식으로 사용하며, 시간 단위는 시간 측정 단위이며, 시간 정밀도는 시뮬레이션에서 반올림된 지연의 정확도를 나타낸다.

 

* 예시


`define SIZE 10 // `SIZE 를 10으로 사용
`define END $stop // `END 를 $stop 으로 사용

`include headers.h

`timescale 150ns/1ns // 시간 단위는 150ns 정밀도는 1ns






+ 조건문 (if-else, case)


조건문은 키워드 if와 else로 구성된다. 조건문은 always 블록 안에서만 사용 가능하다.
조건문의 형식에는 아래와 같이 크게 3가지 형태가 있다. else는 반드시 if 가 있어야만 사용할 수 있다.

 

    if (조건) begin
        // 수식
    end 

    if (조건) begin
        // 수식
    end
    else begin
       // 수식
    end

    if (조건) begin

        // 수식

    end

    else if (조건) begin

        // 수식

    end

    else begin

        // 수식

    end

 

조건문의 수식에 한 줄만 쓴다면 begin end 를 쓸 필요가 없고, 여러 줄을 쓴다면 begin end 로 묶어야 한다. 이는 C언어의 중괄호 { } 역할과 같다. begin 은 반드시 end와 함께 사용해야 한다.
또한 조건문 안에 조건문을 사용하는 것도 가능하다.

 

* 예시


always @ (posedge clock) begin
   if (state == 0) begin
      if (flag == 1)
         setting = 1;
      state = 1;
   end
   else if (state == 1) begin
         setting = 0;
         state = 2;
   end
   else begin
      state = 0;
      setting = 0;
   end
end






+ 다중 분기 (case)


다중 분기 case 문은 많은 선택을 필요로 할때 사용하면 편하고, 가독성 또한 좋아질 수 있다.

키워드는 case, endcase, defulat 로 구성된다. 하나의 케이스에 여러 줄로 써야한다면 begin end 로 묶어야 한다.

그 외에 casex는 case 수식의 모든 x와 z값을 dc(don't care)로 다루며, casez는 case 수식의 모든 z값을 dc로 다룬다.
이들은 일반 case와 달리 x와 z비트가 아닌 부분만 비교할 수 있다.

 

* 예시


case(select)
   4'd0: state = 1;
   4'd1: state = 2;
   4'd2: state = 3;
   4'd3: state = 4;
   4'd4: state = 5;
   4'd5: begin
      state = 6;
      flag = 1;
   end
   default: state = 0;
endcase






+ 반복 구문 (Loop)


루프에는 while, for, repeat, forever 네 가지 형식의 루프 문이 있으며, initial 또는 always 블록 안에서만 사용할 수 있다.

while 은 키워드 while(수식)의 형태로 사용하며, 수식이 거짓이 될 때까지 계속 반복 수행한다.

for는 키워드 for(초기화; 종료 조건; 제어변수 증감) 형태로 사용한다.

repeat는 키워드 repeat(횟수) 형태로 사용하며, 횟수만큼 루프를 수행한다.

forever는 $finish를 만날 때까지 계속 수행하는 반복 구문이며, 항상 true인 while 루프와 같은 역할이다.

 

* 예시


while (count) begin
   count = count - 1;
   // ...
end

for(idx=0; idx=7; idx=idx+1) begin
   state = nextstate;
   // ...
end

repeat (count) begin
   mem[index] = 0;
   index = index + 1;
   // ...
end

forever begin
   #10 start = 1;
   #10 end = 1;
   $finish
end