본문 바로가기

Study/Verilog

Verilog : 연산자

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

이 포스팅은 제 개인적인 공부를 저장 및 복습하기 위해서 올리는 글입니다. 개인적인 정리기 때문에 저의 잘못된 이해가 섞여있을수도 있는 점 알려드립니다. 너무 맹신하지는 말아 주시기 바랍니다. 



연산자 (operator)

비트에 관한 연산자 (Bitwise Operator)

 

각 비트에 대해서 각각 연산이 가해지지 때문에 비트에 관한 연산자 (bitwise operator)라고 한다. 각각의 논리 기능을 하는 게이트로 합성된다.

 

함수

연산자

NOT

~

AND

&

OR

|

XOR

^

XNOR

~^ 혹은 ^~

 

wire [3:0] a, b, c;

wire [3:0] d_and, e_and, d_or, e_or, d_xor, e_xor;

assign a = 4’b1010;

assign b = 4’b1100;

assign c = 4’bxzxz;

assign d_and = a & b;     //d_and=4’b1000

assign e_and = b & c;     // e_and0=4’bxx00 1과 x나 z와 1비트 단위로 and하면 x가 되고 0과 x나 z와 and하면 모두 0

assign d_or = a | b;         // d_or=4’b1110

assign e_or = b & c;         //e_or=4’11xx 1과 x나 z와 1비트 단위로 or하면 1이 되고 0과 x나 z와 or하면 모두 x

assign d_xor = a ^ b;        //d_xor=4’b0110

assign e_xor = b ^ c;        //e_xor=4’bxxxx  1이나 0가 x나 z와 xor하면 모두 x이기 때문이다.

 

관계 (relational) 연산자

 

관계 연산자 (relational operator)의 연산 결과가 참이면 1‘b1이고 거짓이면 1’b0이 된다. 마지막 2가지 경우를 제외하고 피연산자 어느 하나가 xz를 가질 때 연산 결과는 1’bx가 된다.

 

함수

연산자

ab보다 작다

a<b

ab보다 작거나 같다

a<=b

ab보다 크다

a>b

ab보다 크거나 같다

a>=b

ab가 같다

a==b

ab가 같지 않다

a!=b

ab가 같다 (xz를 포함하여 비교)

a === b

zb가 같지 않다 (xz를 포함하여 비교)

a !== b

논리 (Logical) 연산자

 

논리 연산자 (logical operator)는 논리 조건을 표현하는데 사용된다. 1‘b01’b1로 표현되고 xz를 포함한 연산 결과는 1’bx가 된다. 논리 연산 결과가 참이면 1이고 거짓이면 0이다.

 

함수

연산자

OR

||

AND

&&

NOT

!

 

산술 (Arithmetic) 연산자

 

이항 (binary) 산술 연산자 (Arithmetic operator)+ (더하기), - (빼기), * (곱하기), / (나누기), % (모듈러스)가 있고 단항 (unary) 산술 연산자는 부호를 나타내는데 사용되는 +가 있다. 정수 나눗셈은 소수점 이하 자리를 짤라 버린다. 모듈러스 연산자는 두 수의 나눗셈을 한 뒤 나머지를 몫으로 취하는데 왼쪽 피연산자의 부호를 취한다. 예를 들어 10 / -5의 결과는 2이고 10 % -5의 결과는 0이며 10 % 3의 결과는 1이다.

 

축소 (Reduction) 연산자

 

축소 연산자 (reduction operator)는 단항 연산자이다. 한 개의 피연산자에 작용하여 한 비트의 결과를 생성한다. 단항 NANDNOR 축소연산자ANDNOR 연산을 행한 후 결과에 NOT 연산을 행한다. 솔직히 필자로 잘 모르겠는 부분이다.

 

함수

연산자

AND

&

NAND

~&

OR

|

NOR

~|

XOR

^

XNOR

~^ 혹은 ^~

 

이동 (shift) 연산자

 

이동 연산자 (shift operator)는 왼쪽 피연산자에 오른쪽 피연산자에 나오는 값만큼의 비트를 이동시킨다. 비워진 비트 위치에는 논리적 이동 (logical shift)일 때는 0으로 채워지고 산술적 이동 (arithmetic shift)일 때는 왼쪽 방향 이동일 때는 마찬가지로 비트 위치에 0으로 채워지나 오른쪽 방향일 때는 MSB(most significant bit)의 부호로 채워진다.  MSB(most significant bit)는 가장 왼쪽 비트를 의미한다. 백터부분 참고.

 

연산자

의미

x<<1

왼쪽으로 논리적으로 한 비트 이동

x>>1

오른쪽으로 논리적으로 한 비트 이동

x<<<1

왼쪽으로 산술적으로 한 비트 이동

x>>>1

오른쪽으로 산술적으로 한 비트 이동

 

병합 (Concatenation) 연산자

 

병합 연산자 (concatenation operator)는 여는 중괄호 ({)로 시작해서 피연산자들을 쉼표로 분리하고 마지막에 닫는 중괄호 (})로 닫는다. 예로 들어 {4’b1100, 2’b01}6‘b11_0001이 된다. 크기가 없는 숫자는 피연산자로 사용될 수 없다.

 

반복 (Replication) 연산자

 

반복 연산자 (replication operator)는 피연산자의 비트들을 반복하기 위해 사용한다. 예로 들어 {3{c, d}}{c, d}를 세 번 반복하여 {c, d, c, d, c, d}가 된다.

 

조건 (Conditional) 연산자

 

조건 연산자 (conditional operator)c언어에 있는 연산자를 그대로 차용하여 왔다. 사용 예는 다음과 같다.

 

<identifier> = (<condition>)?<expression1>:<expression2>

 

예를 들어 assign out = (enable)? in : 1’bz3상태 버퍼를 모델링 할 수 있다. enable이 참이면 inout을 구동하고 enable이 거짓이면 고저항 상태 값(1‘bz 말하는 듯)out에 나온다.

 

연산자의 우선 순위 (Priority)

 

연산자의 우선 순위 (Priority)는 다음과 같다.

 

연산의 우선순위

기호

단항 연산자; 곱하기, 나누기, 모듈러스

+,-,!,~;*,/,%

더하기, 빼기; 이동

+, -; <<, >>, <<<, >>>

관계 연산자

<,>,<=,>=,==,!=,===,!===

축소 연산자

&, ~&, |, ~|, ^, ~^

논리 연산자

&&, ||

조건 연산자

?: