4. 연산자 Operator

기본적으로 C에서 사용하는 연산자를 따라가는 편이다.

그렇다해도 나는 Verilog 사용자가 C를 보면서 공부하는건 아닌거 같아서 따로 정리하고자 한다.

 

[Relational Operations : 비교 연산자]

메인으로 사용되는 표현식

< A < B A가 B보다 작은가?
> A > B A가 B보다 큰가?
>= A >= B A가 B보다 크거나 같은가?
<= A <= B A가 B보다 작거나 같은가?

해당 연산은 비교 연산자(Relation Operations)로 1: 참, 0: 거짓, X : Unknown으로 셋 중 하나가 나오게 된다.

) 이 중 하나라도 X 혹은 Z 비트가 존재한다면 나오게 되는 값은 무엇인가?

=> X가 반환된다. X이든 Z이든 내가 비교하려는 대상이 명확하지 않기 때문이다.

 

[Arithmetic Operations : 산술 연산자]

* C = A * B
+ Sum = A + B
- Diff = A - B
** Pow = A ** B 제곱(A의 B승)
/ C = A / B 나누기(int<정수> 형)
% AmodB = A % B 모듈러(나머지)

(**, /, %) 연산자는 일반적으로 회로 기술하는데 사용하지 않는다. 만일 필요하다고 한다면, 제곱을 하는, 나눗셈을 하는, 나머지 연산을 하는 회로를 직접 구현할 필요가 있다. Why? 합성의 대상이 되지 않는다.

 

[Logical Operations : 논리 연산자]

&& A && B A  그리고 B가 참인가?
|| A || B A 혹은 B가 참인가?
! if (!A) C= B A가 참이 아니라면 B는 C에 할당된다.

[Equality & Identity Operations]

C == A Logical Equality
C === A Literal Equality Considering 4-Value Logic
C != A logical Inequality
C !== A Literal Inequality 4-Value Logic

단, (===) 연산자는 합성이 불가능하다.

이 연산자가 어떻게 작용되는지는 아래 예제를 보자.

 

module Operator;

reg	[4:0]	A;
reg	[4:0]	B;

initial	begin
		A	=	5'h1x; // A = 5'b1_xxxx;
        B	=	5'h1x; // B = 5'b1_xxxx;
        $display("%b", A==B); // X
        $display("%b", A===B); // 1
end

endmodule

 

== 연산자는 x부분을 파악할 수 없으니 x가 나오게 될 것이고, ===연산자는 말 그대로 비교를 하는 것이기 때문에 1이 나오게 된다.

 

[Bitwise & Reduction Operations]

& B = &A A의 모든 비트를 AND 연산해 B에 할당
| B = |A OR 연산
^ B = ^A XOR 연산

 

 

[미안하다. 사실 이거 작성하려고 이렇게 관심을 끌었다.]

EX)

~| {a[0], ~{3{a[1]}}, ^{a[2], a[3]}}

Verilog에서 { _ , _ } 중괄호는 어떠한 역할을 하는가? 라는 것을 정리하려고 위 연산자를 이렇게 주저리주저리 썼다.

결론부터 말하자면, 콤마(,)로 이어진 것을 접합해준다.

 

'무슨 개소리냐'라고 넘길 것이 아니라 차근차근 살펴보자.

a[0]은 어떠한 연산자도 붙어있지 않기 때문에 그냥 와이어라고 생각한다.

다음 a[1]은 3배임을 알 수 있기 때문에 3개의 Gate를 만들고 (~)가 있기 때문에 not을 붙인다.

a[2]와 a[3]은 중괄호로 묶여있기 때문에 이를 하나로 묶어주는데 (^:XOR)를 확인하고 XOR로 묶는다.

마지막으로 이 Gate가 전부 중괄호 안에 묶여있기 때문에 하나로 합치는데 이 때 (|:OR)를 확인하고 OR로 묶고 이를 다시 (~) not을 붙이면 해당 예제는 끝이 난다.

연산자는 당장 구글에 쳐봐도 어떻게 사용하는지 나오기 때문에 간단하게 표만 만들어 사용 방법만 작성하였지만,

해당 { _, _ } 중괄호는 여러 번 사용해봐야 숙지가 된다.

 

[Shift & Other Operations]

<< a<<1 shift left a by 1 bit
>> a>>1 shift right a by 1 bit
<<< b<<<1 arithmetic shift by 1
>>> b>>>1 arithmetic shift by 1
?: c = sel ? a : b sel이 참일 때, c = a, 거짓일 때, c = b
{} {co, sum} = a + b + ci
{{}} b = {3{a}} replicate N times