Verilog 연산자 총정리: 산술·관계·등가·논리·비트와이즈·시프트
디지털 회로에서 데이터 처리는 필수입니다. 합성 도구가 적절한 하드웨어로 매핑할 수 있는 Verilog 연산자들을 카테고리별로 정리합니다.
산술 연산자 (Arithmetic)
| 연산자 | 설명 | 비고 |
a + b | 덧셈 | |
a - b | 뺄셈 | |
a * b | 곱셈 | DSP 블록 매핑 가능 |
a / b | 나눗셈 | b=0 시 결과 x, 합성 비용 큼 |
a % b | 나머지 | b=0 시 x |
a ** b | 거듭제곱 | 피연산자 중 실수 있으면 결과 실수, b=0 시 1 |
module des;
reg [7:0] d1, d2;
initial begin
d1 = 45; d2 = 9;
$display("Add=%d Sub=%d Mul=%d Div=%d Mod=%d Pow=%d",
d1+d2, d1-d2, d1*d2, d1/d2, d1%d2, d2**2);
end
endmodule
// 출력: Add=54 Sub=36 Mul=149 Div=5 Mod=0 Pow=81
관계 연산자 (Relational)
결과: 참=1, 거짓=0. 피연산자에 x/z 포함 시 x. 산술 연산자보다 우선순위 낮음.
| 연산자 | 설명 |
a < b | a가 b보다 작음 |
a > b | a가 b보다 큼 |
a <= b | a가 b 이하 |
a >= b | a가 b 이상 |
등가 연산자 (Equality)
관계 연산자보다 우선순위 낮음. 논리 등가(==, !=)는 x/z 포함 시 x 반환. 케이스 등가(===, !==)는 x/z도 비트 단위 비교해 항상 0/1 반환.
| 연산자 | 설명 | 특징 |
a === b | 케이스 등가 | x/z 포함 비교, 항상 알려진 값 |
a !== b | 케이스 부등가 | x/z 포함 비교, 항상 알려진 값 |
a == b | 논리 등가 | x/z 시 결과 x |
a != b | 논리 부등가 | x/z 시 결과 x |
data1 = 'b101x; data2 = 'b1011; data1 === data2 → 0
data1 = 'b101x; data2 = 'b101x; data1 === data2 → 1
data1 = 'b101z; data2 = 'b1z00; data1 !== data2 → 1
논리 연산자 (Logical)
피연산자 0이 아니면 참(1), 0이면 거짓(0). x 포함 시 결과 x (단, 0 && x → 0, 1 || x → 1 단락 평가 아님 — Verilog는 항상 평가).
| 연산자 | 설명 |
a && b | 논리 AND (둘 다 참이면 1) |
a || b | 논리 OR (둘 중 하나 참이면 1) |
!a | 논리 NOT (0↔1 변환, x는 x 유지) |
data1=0, data2=4: data1 && data2 → 0
data1=x, data2=3: data1 && data2 → x
data1=z, data2=5: data1 && data2 → 1 (z는 비제로로 취급)
!4 → 0, !0 → 1
비트와이즈 연산자 (Bitwise)
비트 단위 연산. 합성 시 게이트 레벨로 직접 매핑.
| & (AND) | 0 | 1 | x | z |
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | x | x |
| x | 0 | x | x | x |
| z | 0 | x | x | x |
| | (OR) | 0 | 1 | x | z |
| 0 | 0 | 1 | x | x |
| 1 | 1 | 1 | 1 | 1 |
| x | x | 1 | x | x |
| z | x | 1 | x | x |
기타: ^ (XOR), ~^/^~ (XNOR), ~ (NOT).
시프트 연산자 (Shift)
| 종류 | 연산자 | 동작 |
| 논리 시프트 | <<, >> | 빈 자리에 0 채움 |
| 산술 시프트 | <<<, >> | 부호 비트 확장 (signed 타입일 때) |
data = 8'h80 (1000_0000);
data >> 1 = 0100_0000 (논리)
data >>> 1 = 1100_0000 (산술, 부호 비트 1 확장)
Verilog-2001부터 >>는 피연산자가 signed면 산술 시프트, unsigned면 논리 시프트로 동작. 명시적 >> 사용 권장.
연산자 우선순위 (높은 → 낮은)
+ - ! ~ (단항)
* / %
+ - (이항)
<< >> <<< >>>
< <= > >=
== != === !==
& (비트 AND)
^ ^~ ~^ (XOR/XNOR)
| (비트 OR)
&& (논리 AND)
|| (논리 OR)
?: (조건)
복잡한 표현식엔 괄호로 명시적 그룹화 권장.