컴파일러 지시어

 

'<키워드> 형식으로 사용한다. `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


신고
  1. 2017.10.27 12:04

    비밀댓글입니다