Verilog 데이터 타입 완벽 해설: 비트, 와이어, 레지스터, 4값 논리
Verilog 데이터 타입의 주 목적은 하드웨어 저장 요소(플립플롭의 비트)와 전송 요소(게이트 간 연결 와이어)를 모델링하는 것입니다.
4값 논리 시스템 (Value Set)
거의 모든 데이터 타입이 다음 4가지 값만 가집니다 (real, event 제외).
| 값 | 의미 |
0 | 로직 0, 거짓, 그라운드(0V) |
1 | 로직 1, 참, 전원 전압(Vdd, 0.8V~3V+) |
x / X | 알 수 없음 (0 또는 1일 수 있음). 불 대수의 'Don't Care'와 다름 |
z / Z | 고임피던스 (Hi-Z), 미연결 상태 |
시뮬레이터 파형에서 X는 보통 빨강, Z는 주황으로 표시됩니다.
넷(Nets) vs 변수(Variables)
하드웨어 구조가 다르고 값 할당/유지 방식이 다릅니다.
넷 (Nets) - 연결용
하드웨어 엔티티(게이트 등) 사이를 연결하며 자체적으로 값을 저장하지 않음. 드라이버(게이트 출력 또는 연속 할당)가 값을 구동함.
- 가장 흔한 타입:
wire (단일 드라이버 넷 연결용)
- 브레드보드의 전선과 유사
- 여러 비트를 묶어 벡터로 선언 가능:
wire [3:0] n0;
- 동일 이름 재선언 금지
변수 (Variables) - 저장용
데이터 저장 요소를 추상화하며 값을 유지함. 플립플롭이 대표적 예.
- 주 타입:
reg (프로시저럴 블록에서 할당 가능)
reg가 반드시 플립플롭으로 합성되는 것은 아님 (조합 논리에도 사용)
- 비트 폭 지정 가능:
reg [3:0] state;
기타 데이터 타입
| 타입 | 폭 | 용도 | 예시 |
integer | 32비트 | 범용 정수 변수, 카운터 등 | integer count; |
time | 64비트 unsigned | 시뮬레이션 시간 저장 | time end_time; |
realtime | 64비트 실수 | 부동소수점 시간 저장 | realtime rtime; |
real | 부동소수점 | 실수 연산 (합성 불가, 시뮬용) | real float = 12.344; |
문자열 저장
reg에 저장하며 폭은 문자 수 × 8비트 이상이어야 함. 부족하면 좌측 잘림, 남으면 좌측 0 패딩.
reg [8*11:1] str1 = "Hello World"; // 정확히 11바이트 → "Hello World"
reg [8*5:1] str2 = "Hello World"; // 5바이트만 → "World" (좌측 잘림)
reg [8*20:1] str3 = "Hello World"; // 20바이트 → " Hello World" (좌측 0 패딩)
시뮬레이션 예제
module testbench;
integer int_a;
real real_b;
time time_c;
initial begin
int_a = 32'hcafe_1234;
real_b = 0.1234567;
#20;
time_c = $time;
$display("int_a = 0x%0h", int_a); // 0xcafe1234
$display("real_b = %0.5f", real_b); // 0.12346
$display("time_c = %0t", time_c); // 20
end
endmodule