Verilog 문법 마스터: 렉시컬 규칙, 연산자, 숫자 형식, 식별자 총정리
Verilog의 렉시컬 관례는 C와 유사합니다. 토큰 스트림으로 구성되며, 토큰은 주석, 키워드, 숫자, 문자열, 공백 등이 될 수 있습니다. 모든 문장은 세미콜론(;)으로 끝나야 하며, 대소문자 구분(case-sensitive)됩니다.
주석
- 한 줄 주석:
//부터 줄 끝까지
- 여러 줄 주석:
/* ... */ (중첩 불가)
- 한 줄 주석은 여러 줄 주석 안에 중첩 가능
// 한 줄 주석
integer a; // 변수 선언 후 주석
/* 여러 줄
주석 */
/* /* 중첩 불가 */ */ // 에러
/* // 이건 괜찮음 */ // 정상
공백(Whitespace)
스페이스, 탭, 줄바꿈, 폼피드는 토큰을 구분하는 역할 외에는 무시됩니다. 단, 문자열 내 공백은 보존됩니다.
module dut;
reg [8*6:1] name = "Hello!"; // 앞쪽 공백 무시
reg [8*6:1] addr = "Earth "; // 문자열 내 공백 보존 → "Earth "
endmodule
연산자 종류
| 유형 | 예시 | 설명 |
| 단항(Unary) | ~y | 피연산자 왼쪽에 위치 |
| 이항(Binary) | y | z | 두 피연산자 사이에 위치 |
| 삼항/조건(Conditional) | (y>5) ? w : z | ?:로 세 피연산자 구분 |
숫자 형식 (Number Format)
기본은 10진수. 다른 진법 사용 시 [크기]'[기수][값] 형식 사용.
크기 지정(Sized)
3'b010 // 3비트 2진수 (값 2)
3'd2 // 3비트 10진수 (값 2)
8'h70 // 8비트 16진수 0x70 (10진수 112)
9'h1FA // 9비트 16진수 0x1FA (10진수 506)
4'hA = 4'd10 = 4'b1010 = 4'o12 // 모두 10진수 10
32'hFACE_47B2 // 언더스코어로 가독성 향상
- 크기: 비트 수 (10진수로만 표기)
- 기수:
'b/'B(2진), 'd/'D(10진), 'h/'H(16진), 'o/'O(8진)
- 16진수에서 대소문자 모두 허용, 언더스코어 사용 가능
크기 미지정(Unsized)
integer a = 5423; // 10진수, 시뮬레이터/머신에 따라 비트 폭 결정(보통 32비트)
integer a = 'h1AD7; // 크기 미지정 → 32비트로 패딩되어 32'h0000_1AD7 저장
음수 표현
-6'd3 // 6비트 2의 보수 표현 (-3)
-6'sd9 // 부호 있는 연산용
8'd-4 // 불법: 기수와 값 사이에 마이너스 불가
문자열
큰따옴표(" ")로 감싸며 여러 줄로 분할 불가. 문자당 1바이트.
"Hello World!" // 12바이트
"x + z" // 5바이트
"How are you?" // 여러 줄 분할 시 에러
식별자 (Identifiers)
영문자, 숫자, 언더스코어(_), 달러($) 조합. 숫자나 $로 시작 불가. 대소문자 구분.
integer var_a; // 유효
integer $var_a; // 무효: $로 시작
integer v$ar_a; // 유효: 중간에 $ 허용
integer 2var; // 무효: 숫자로 시작
integer var23_g; // 유효
integer 23; // 무효: 숫자만으로 구성
키워드 (Keywords)
언어 구문 예약어. 모두 소문자. 주요 키워드: module, endmodule, input, output, inout, wire, reg, always, initial, assign, if, else, case, for, while, parameter, localparam, posedge, negedge 등.
Verilog 표준 개정 이력
- IEEE 1364-1995: 최초 표준 (Verilog-1995)
- IEEE 1364-2001: ANSI C 스타일 포트 선언, generate 블록, 구문 개선
- IEEE 1364-2005: SystemVerilog 기반 통합 전 마지막 순수 Verilog 표준
- 현재는 IEEE 1800 (SystemVerilog)이 통합 표준으로 사용됨