+ 컴파일러 지시어
'<키워드> 형식으로 사용한다. `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 |
if (조건) begin |
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