+ 연산자 (operator)
연산자는 산술 연산자, 관계 연산자, 논리 연산자, 시프트 연산자 등이 있으며 값을 연산하는 것에 사용한다.
구분 |
연산자 |
의미 |
산술 연산자 |
+ |
덧셈 |
- |
뺄셈 | |
% |
나머지 | |
* |
곱셈 | |
/ |
나눗셈 | |
관계 연산자 |
== |
같다 |
!= |
같지 않다 | |
> |
크다 | |
>= |
크거나 같다 | |
< |
작다 | |
<= |
작거나 같다 | |
논리 연산자 |
&& |
논리적 AND |
|| |
논리적 OR | |
! |
논리적 NOT | |
& |
비트 AND | |
| |
비트 OR | |
~ |
비트 NOT | |
^ |
비트 XOR | |
^~, ~^ |
비트 XNOR | |
시프트 연산자 |
>> |
오른쪽 Shift |
<< |
왼쪽 Shift | |
기타 |
{ } |
결합 연산 |
? : |
3항 조건 연산 |
산술 연산자는 크게 단항 연산자와 이항 연산자로 나뉜다.
단항 연산자는 + 와 - 가 있다. + 로 양수를 나타내고, - 로 음수를 나타내는 부호 역할을 한다.
이항 연산자는 +, -, *, /, % 가 있다. 여기서 + 와 - 는 덧셈과 뺄셈을 나타낸다.
* 예시
reg x, y; wire result; x = 2'b0101; // 5 y = 2'b0001; // 1 assign result = x + y; // result = 2'b0110 assign result = x - y; // result = 2'b1000 assign result = x * y; // result = 2'b0101 assign result = x / y; // result = 2'b0101 assign result = x % y; // result = 2'b0000
논리 연산자는 Logical AND (&&), Logical OR (||), Logical NOT (!) 이 있다.
논리적 거짓(false)은 0, 논리적 참(true)은 1, x는 결과에 상관없는 값(dc; don't care) 이다.
또한 비트 단위 연산자가 있으며 여기에는 Bitwise AND (&), Bitwise OR (|), Bitwise XOR (^), Bitwise XNOR (^~, ~^), Bitwise NOT (~)가 있다. Bitwise NOT (~)과 Logical NOT (!) 연산자는 단항 연산자이며, 나머지는 두 개의 피연산자를 가지고 연산하는 이항 연산자이다.
AND (&), NAND (~&), OR (|), NOR (~|), XOR (^)을 단항 연산자처럼 사용할 수 있는데, 이 때는 축소 연산을 수행한다. 오른쪽 비트에서부터 왼쪽 비트 순으로 연산한다.
* 예시
// 논리 연산 x = 2'b00; y = 2'b01; z = 2'b0x; (x == 1) || (y == 1); // (거짓) || (참) 이므로 결과 값은 1 (x == 1) && (y == 1); // (거짓) && (참) 이므로 결과 값은 0 (x == 1) || z; // 결과 값은 x // 비트 연산 x = 4'b1101; y = 4'b1001; z = 4'b1xxz; ~x; // 결과 값은 4'b0010 x & y; // 결과 값은 4'b1001 x ^ y; // 결과 값은 4'b0100 x ^~ y; // 결과 값은 4'b1011 y | z; // 결과 값은 4'b1xx1 ~z; // 결과 값은 4'b0xxx // 축소 연산 x = 4'b11011; &x // (1 & 1 & 0 & 1 & 1) 결과 값은 1'b0 ~&x // (1 ~& 1 ~& 0 ~& 1 ~& 1) 결과 값은 1'b0
관계 연산자는 두 수식과의 관계를 나타내는 연산자이다.
크다 (>), 작다 (<), 크거나 같다 (>=), 작거나 같다 (<=)의 4가지 연산자가 있다.
수식의 결과가 참이면 논리 값 1 (true)을, 거짓이면 논리 값 0 (false)을 반환하고, x나 z 값을 가진다면 x를 반환한다.
또한 같다 (==), 같지 않다 (!=), 케이스 등가 연산자 (===), 케이스 부정등가 연산자(!==)가 있다.
마찬가지로 연산 결과가 참이면 1을, 거짓이면 0을 반환한다.
케이스 연산자는 x나 z값도 비트 단위로 비교하여 결과에 따라 1 또는 0 의 값을 반환한다.
* 예시
x = 4'b1111; y = 4'b1010; z = 4'b0xxx; x < y; // 거짓. 결과 값은 0 x >= y; // 참. 결과 값은 1 x < z; // 결과 값은 x x = 4'b11xx; y = 4'b11xz; x === y; // 결과 값은 0
시프트 연산자는 비트를 왼쪽이나 오른쪽으로 이동시키는 연산자이다. 오른쪽 shift (>>), 왼쪽 shift (<<)가 있다.
shift로 생기는 오버플로우나 언더플로우된 비트는 0으로 채워진다.
* 예시
module shift; reg [3:0] start, result; initial begin start = 1'b1; result = (start << 1); end endmodule // 결과 값(result)은 2'b0010
조건 연산자는 3항 연산자라고도 하며, 조건식의 참/거짓 여부에 따라 대입 연산의 위치가 달라진다.
<조건식> ? <참 조건> : <거짓 조건> 의 형식이다.
* 예시
wire [9:0] result = isTrue ? data : 10'd1000; /* isTrue가 1 (true)이면, data 값을 result에 전달 isTrue가 0 (false)이면, 10'd1000값을 result에 전달 isTrue가 x (don't care)면, x 값을 result에 전달 */
+ 연산자 우선순위 (operator priority)
C와 마찬가지로 베릴로그에도 연산자의 우선순위가 있다. 그 순서도 C와 비슷하다.
우선순위 |
구분 |
연산자 |
↑ 높음
낮음 ↓ |
단항 연산자 (Unary) |
+, -, !, ~ |
이항 연산자 (Multiplication, Devision, Module) |
*, /, % | |
이항 연산자 (Add, Subtract) |
+, - | |
시프트 연산자 |
>>, << | |
관계 연산자 |
<, <=, >, >= | |
3항 조건 연산자 |
? : |
+ 자료형 (data type)
데이터 값에는 4개의 논리 값과 8개의 신호강도를 지원한다. 논리 값으로 회로의 상태를 나타낸다.
하이 임피던스에 대한 내용은 여기를 참고한다.
논리값 수준 |
회로의 상태 |
0 |
논리적 0 (false) |
1 |
논리적 1 (true) |
x |
알 수 없는 값 |
z |
하이 임피던스 (high impedance, hi-z) |
신호강도는 신호의 우선순위를 정하여, 신호들 간의 충돌을 막아주는 역할을 한다.
상태 |
신호 |
형 |
↑ 강도 높음
강도 낮음 ↓ |
supply |
흐름 |
strong |
흐름 | |
pull |
흐름 | |
large |
저장 | |
weak |
흐름 | |
medium |
저장 | |
small |
저장 | |
highz |
하이 임피던스 |
+ 넷 (net)
넷은 하드웨어 요소 사이의 연결을 나타낸다.
연결된 장치(device) 값으로 출력 값을 갖게되고, 기본적인 값(default)은 z이다.
기본적으로 <키워드> <변수 명> <변수 값> 으로 나타낸다.
키워드 |
정의 |
wire, tri |
일반적인 net에 사용 |
wor, trior |
OR 연산을 하는 wire |
wand, triand |
AND 연산을 하는 wire |
trireg |
값을 저장하는 net에 사용 |
tri1 |
net에 아무 것도 인가되지 않으면 1 |
tri0 |
net에 아무 것도 인가되지 않으면 0 |
supply1 |
Vdd를 나타냄 |
supply0 |
Ground를 나타냄 |
* net 사용 예시
// 인버터(inverter)와 NOR 게이트 사이를 연결 module connection(y_out, A, B) output y_out; input A, B; wire y1; not (y1, B); nor (y_out, A, y1);
+ 주석 (comment)
주석은 개발자들이 코드를 쉽게 알아보게 하기 위해 있는 텍스트이다. 문법은 C와 같다.
한줄 주석은 // 로 시작하며, 여러 줄 주석은 /* */ 이다.
* 예시
always @ (*) begin // 한줄 주석 end /* 여러 줄 주석 하나 둘 셋 */