신호가 어떤 성질을 가지는지 나타냄
값을 연결만하는 자료형으로, Net type에 속한다. 연결선으로 생각하면 된다.
driver ────[wire]──── 목적지
(소스) (전달만) (받는 곳)
소스가 1 → wire도 1 → 목적지도 1
소스가 0 → wire도 0 → 목적지도 0
소스 없음 → wire는 z (부유 상태)
wire 타입의 동작은 위와 같이, 소스가 변하면 wire의 값도 그 즉시 변한다.
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으로 값을 연결하거나, 선언과 동시에 값을 연결한다.
값을 저장하는 자료형으로, Variable Type에 속한다.
// reg지만 조합논리로 합성됨 (플립플롭 아님!)
reg y;
always @(*) begin
y = a & b; // 클럭 없음 → 조합논리
end``` // reg이고 순차논리로 합성됨 (플립플롭)
reg q;
always @(posedge clk) begin
q <= d; // 클럭 있음 → 플립플롭
end여러 비트를 묶은 신호
1비트짜리 신호를 스칼라(Scalar)라하고, 여러 비트를 묶은 것을 벡터(Vector)라고한다.
스칼라: ─────○ (1비트)
벡터: ═════○ (여러 비트 묶음)
[7:0]
wire [MSB:LSB] 변수명;
reg [MSB:LSB] 변수명;
wire [7:0] byte_data //8비트 (bit7-0)
은 아래와 같은 벡터를 생성한다.
byte_data [7:0]
┌───┬───┬───┬───┬───┬───┬───┬───┐
│ 7 │ 6 │ 5 │ 4 │ 3 │ 2 │ 1 │ 0 │ ← 비트 인덱스
└───┴───┴───┴───┴───┴───┴───┴───┘
MSB LSB
(최상위) (최하위)
아래와 같이 벡터를 이루는 비트에 개별적으로 접근할 수 있다.
wire [7:0] data;
data[7] // 1비트: 최상위 비트만
data[3:0] // 4비트: 하위 4비트
data[7:4] // 4비트: 상위 4비트
Verilog는 변수를 unsigned 또는 signed로 설정할 수 있다.
Verilog에서 신호는 기본적으로 unsigned이나, signed라는 키워드를 붙이면, signed로 사용할 수 있다.
변수가 signed냐, unsigned냐에 따라서 같은 2진수와 10진수의 매핑이 달라진다
-> 따라서 숫자의 의미가 달라져버린다.
wire [7:0] unsigned_val; // unsigned (기본)
wire signed [7:0] signed_val; // signed 명시
예를들어, 아래와 같이
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냐에 따라서 값이 달라지는 것을 확인할 수 있다.
- 논리 시프트 = 비트 시프트만 수행하는 것
- 산술 시프트 = 비트 시프트 + 부호확장까지 수행하는 것
논리 우시프트 (>>): 우 shift 후, 빈 자리에 0 채움
1100_0000 >> 2 = 0011_0000
산술 우시프트 (>>>): 우 shift 후, 빈 자리를 비트 확장함
1100_0000 >>> 2 = 1111_0000
↑↑
가장 앞 비트(1)로 채움
논리 시프트는 logical shift만 수행한다,
반면 산술 시프트는 logicial shift + sign enxtension을 수행하므로,
부호를 유지한채로, 숫자의 크기만 (1/2)^2 이 된다.
Verilog에는 4가지 상태가 존재한다.
앞서 공부한 wire과 reg는 항상 이 4가지 상태 중 하나에 속한다.
wire와 reg를 초기화하지 않으면 각각 어떤 상태에 속하게될까?
z이다.x이다.