Kim Seon Deok
[Verilog] Operator 본문
산술 연산자
기호 | 기능 |
+ | 더하기 |
- | 빼기 |
* | 곱하기 |
/ | 나누기 몫 |
% | 나누기 나머지 |
** | 거듭제곱 |
피연산자 비트에 x나 z가 있을 경우 전체 결과값은 x이다.
나누기와 나머지 연산에서 두번째 피연산자가 0이면 결과값은 x이다.
나머지 연산자의 결과값은 첫번째 피연산자의 부호를 따른다.
관계 연산자
식 | 의미 |
a < b | a가 b보다 작다 |
a > b | a가 b보다 크다 |
a <= b | a가 b보다 작거나 크다 |
a >= b | a가 b보다 크거나 같다 |
피연산자 비트에 x나 z가 있을 경우 전체 결과값은 x이다.
두 연산자의 비트 수가 다르면 비트수가 작은 피연산자의 msb쪽에 0을 채우고 판단한다.
피연산자 중 하나가 실수형이면 다른 피연산자가 실수형으로 변환된 후 비교된다
연산 결과는 1이나 0이다.
등가 연산자
식 | 의미 |
a === b | a 와 b는 같다 (x와 z가 포함된 일치) |
a !== b | a 와 b는 같지 않다. (x와 z가 포함된 불일치) |
a == b | a 와 b는 같다 (결과가 x가 될 수 있음) |
a != b | a 와 b는 같지 않다. (결과가 x가 될 수 있음) |
===, !===는 simulation에서만 사용되고 합성에서는 지원되지 않을 수 있다.
연산 결과는 1이나 0이다.
논리 연산자
식 | 의미 |
a && b | and |
a | | b | or |
!a | not |
비트 연산자
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 |
not
~ | 0 |
0 | 1 |
1 | 0 |
x | x |
z | x |
두 연산자의 비트 수가 다르면 비트수가 작은 피연산자의 msb쪽에 0을 채우고 판단한다.
(a~^b)는 허용되지만 (a~&b)와 (a~|b)는 허용되지 않는다. ~(a&b)와 ~(a|b)는 허용된다.
xor = ^
xnor = ~^
축약 연산자
reg [7:0] cnt ;
assign parity = ^cnt ; // 축약연산자 사용
assign parity = cnt[7]^cnt[6]^cnt[5]^cnt[4]^cnt[3]^cnt[2]^cnt[1]^cnt[0] ; // 비트 연산자 사용
피연산자의 단위 비트들에 적용되어 1비트의 결과값을 생성
시프트 연산자
- 논리 시프트
<< : 좌측 피연산자를 왼쪽으로 시프트하고 비어있는 비트에 0을 채움
>> : 좌측 피연산자를 오른쪽으로 시프트하고 비어있는 비트에 0을 채움
- 산술 시프트
<<< : 좌측 피연산자를 왼쪽으로 시프트하고 비어있는 비트에 0을 채움
>>> : 좌측 피연산자를 오른쪽으로 시프트하고 비어있는 비트에 좌측 피연산자의 MSB을 채움
a = 4'b1100
b = a >> 1 // 4b'0110
c = a << 1 // 4'b1000
d = a << 2 // 4'b0000
조건 연산자
조건 ::= expression1 ? expression2 : expression3 |
expression1이 참이면 expression2가 좌변의 변수에 할당
expression1이 거짓이면 expression3이 좌변의 변수에 할당
wire [15:0] busa,data;
assign busa = drive_busa ? data : 16'bz ; // drive_busa가 참이면 data, 거짓이면 16'bz
결합 및 반복 연산자
중괄호 { }에 의해 묶인 두 개 이상의 표현이 갖는 비트들을 결합
결합되는 피연산자들은 각각의 크기를 결정할 수 있어야 결합이 가능하다.
비트폭이 일치하지 않는 변수의 연산이나 대입이 허용된다
우변의 비트폭이 작은 경우 우변의 MSB에 0을 붙여 연산
좌변의 비트폭이 작은 경우 MSB누락되어 저장
wire [15:0] addr_bus ;
wire [7:0] addr_h, addr_l ;
assign addr_bus = {addr_h, addr_l} ;// addr_bus 8비트를 addr_h와 addr_bus 8비트를 addr_l에 결합
{a{b}}
b 를 a 회 반복. 반복횟수는 x,z가 아니어야 함
{b,{3,{a,b}} // {b, a,b,a,b,a,b}
'Verilog' 카테고리의 다른 글
[Verilog] Concurrent assignment (0) | 2022.12.08 |
---|---|
[Verilog] Gate level modeling (0) | 2022.12.08 |
[Verilog] Logic status, Data type (0) | 2022.12.08 |
[Verilog] 주석, 수 표현 , 문자열, 식별자 (0) | 2022.12.06 |
[Verilog] Verilog HDL Overview (0) | 2022.12.06 |