[Verilog 문법] 1.2. 데이터 타입

YUN·2026년 1월 21일

디지털 회로 설계

목록 보기
3/20
post-thumbnail

데이터 타입

신호가 어떤 성질을 가지는지 나타냄

1. wire

값을 연결만하는 자료형으로, Net type에 속한다. 연결선으로 생각하면 된다.

(1) 특징

  • 값을 저장하지 않고 연결만 한다. 즉, 연속 할당이다.
  • 연결된 소스의 값을 그대로 전달
  • 소스가 없으면 고임피던스(High-Z) 상태

(2) 동작

  driver ────[wire]──── 목적지
   (소스)    (전달만)    (받는 곳)
   
  소스가 1 → wire도 1 → 목적지도 1
  소스가 0 → wire도 0 → 목적지도 0
  소스 없음 → wire는 z (부유 상태)

wire 타입의 동작은 위와 같이, 소스가 변하면 wire의 값도 그 즉시 변한다.

(3) 사용법

wire a;           // 1비트 wire
wire [7:0] bus;   // 8비트 wire

위와 같이 wire 타입의 연결선을 선언할 수 있다.

wire y;
assign y = a & b;   // ✅ assign으로 y에 a & b를 연결
wire y = a & b;     // ✅ 선언과 동시에 할당도 가능

wire 타입의 연결선은 assign으로 값을 연결하거나, 선언과 동시에 값을 연결한다.

2. reg

값을 저장하는 자료형으로, Variable Type에 속한다.

(1) 특징

  • 값을 저장함
  • 새 값이 할당될 때까지 이전 값을 유지한다.
    • 반면, wire는 새 값을 연결하지않더라도 기존에 연결된 값이 바뀌면 바로 값이 바뀐다
  • procedural block (always, intial) 안에서만 값을 할당할 수 있다.
  • reg는 보통 플립플롭을 만들때 사용된다. 그러나 reg가 항상 플립플롭인 것은 아니다.
    •   // reg지만 조합논리로 합성됨 (플립플롭 아님!)
      reg y;
      always @(*) begin
          y = a & b;    // 클럭 없음 → 조합논리
      end```  
    • sensitivity list가 *이면 -> 입력이 바뀌면 항상 실행되므로 조합논리 처럼 동작한다
    • // reg이고 순차논리로 합성됨 (플립플롭)
      reg q;
      always @(posedge clk) begin
        q <= d;       // 클럭 있음 → 플립플롭
      end
    • sensitivity list이 clk 이면 -> 클럭의 변화가 발생할때마다 실행되므로 순차 논리로 동작한다

3. 벡터

여러 비트를 묶은 신호

1비트짜리 신호를 스칼라(Scalar)라하고, 여러 비트를 묶은 것을 벡터(Vector)라고한다.

스칼라:  ─────○      (1비트)

벡터:    ═════○      (여러 비트 묶음)
        [7:0]

(1) 벡터 선언 문법

wire [MSB:LSB] 변수명;
reg [MSB:LSB] 변수명;

(2) 예시

wire [7:0] byte_data //8비트 (bit7-0)

은 아래와 같은 벡터를 생성한다.

  byte_data [7:0]
  
  ┌───┬───┬───┬───┬───┬───┬───┬───┐
  │ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │  ← 비트 인덱스
  └───┴───┴───┴───┴───┴───┴───┴───┘
   MSB                         LSB
  (최상위)                    (최하위)

(3) 비트 접근

아래와 같이 벡터를 이루는 비트에 개별적으로 접근할 수 있다.

wire [7:0] data;
data[7]    // 1비트: 최상위 비트만
data[3:0]  // 4비트: 하위 4비트
data[7:4]  // 4비트: 상위 4비트

4. signed/unsigned

Verilog는 변수를 unsigned 또는 signed로 설정할 수 있다.

Verilog에서 신호는 기본적으로 unsigned이나, signed라는 키워드를 붙이면, signed로 사용할 수 있다.

(1) 특징

변수가 signed냐, unsigned냐에 따라서 같은 2진수와 10진수의 매핑이 달라진다

-> 따라서 숫자의 의미가 달라져버린다.

(2) 문법

wire [7:0] unsigned_val;         // unsigned (기본)
wire signed [7:0] signed_val;    // signed 명시

(3) 예시

예를들어, 아래와 같이

unsigned 해석 
  1111_1111 = 128+64+32+16+8+4+2+1 = 255

signed 해석 (2의 보수):
  1111_1111 → MSB가 1이면 음수
            → 반전 후 +1: 0000_0001 = 1
            → 결과: -1

signed냐, unsigned냐에 따라서 값이 달라지는 것을 확인할 수 있다.

5. 산술 시프트 / 논리 시프트

  • 논리 시프트 = 비트 시프트만 수행하는 것
  • 산술 시프트 = 비트 시프트 + 부호확장까지 수행하는 것

(1) 예시

논리 우시프트 (>>): 우 shift 후, 빈 자리에 0 채움
  1100_0000 >> 2 = 0011_0000

산술 우시프트 (>>>): 우 shift 후, 빈 자리를 비트 확장함
  1100_0000 >>> 2 = 1111_0000
                    ↑↑
                 가장 앞 비트(1)로 채움

논리 시프트는 logical shift만 수행한다,

반면 산술 시프트는 logicial shift + sign enxtension을 수행하므로,

부호를 유지한채로, 숫자의 크기만 (1/2)^2 이 된다.

wire, reg 와 4가지 상태

Verilog에는 4가지 상태가 존재한다.

앞서 공부한 wire과 reg는 항상 이 4가지 상태 중 하나에 속한다.

  • 0: 논리 0
  • 1: 논리 1
  • X: Unknown(미정, 즉 0,1중 어느쪽인지 모름)
  • Z: high-impedance(하이임피던스, 떠 있음)

wire와 reg를 초기화하지 않으면 각각 어떤 상태에 속하게될까?

  • wire에 아무 것도 연결 x면 -> z이다.
  • reg에 아무 것도 저장 x면 -> x이다.
profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글