연산자 (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

/*
여러 줄 주석
하나
둘
셋
*/



 

 

신고
  1. neo 2013.10.11 17:39 신고

    좋은내용이네요. 퍼갑니다.

  2. High 2016.04.11 22:08 신고

    축소연산에서 ~x = 1b'1 이 아닌가요?

  3. eun 2016.10.18 15:33 신고

    조건에 대해 만족하면 동작하는 문법에서
    ~? ~ : ~ 형태로 생긴 문법 아시나요?ㅠㅠ