728x90
자료형
자료형
- verilog에서 허용되는 자료형은 net, reg, parameter가 있으며, 이들 자료형은 4가지의 논리값(0, 1, x, z)을 갖음.
- 네트(net)자료형은 소자(장치)간의 물리적인 연결을 나타내기 위해 사용, 논리값을 저장할 수 없다.
- 레지스터(register) 자료형은 프로그래밍의 변수와 같은 역할, 다른 논리값이 할당되기 전까지 이전 논리값을 유지할 수 있음.
- 파라미터(parameter)는 상수 혹은 결과가 상수가 되는 식을 정의하는 자료형, 보통 상수값을 설정할 때 사용
- Verilog의 자료형
자료형 | 용도 |
net형 | 소자 간의 물리적 연결 |
reg형 | 값을 임시로 저장할 수 있는 변수 |
parameter | 상수로 선언되는 데이터 |
- verilog의 논리값
논리값 | 의미 |
0 | 논리적 0, 거짓 상태, 하드웨어적으로 접지(GND) |
1 | 논리적 1, 참 상태, 하드웨어적으로 전원 전압(VDD) |
x | 알 수 없는 논리값 |
z | High 임피던스, 플로팅 상태 |
net형
net형이란?
- net는 소자간의 물리적인 연결을 표현하는데 사용하는 자료형이다.
- 각 장치의 입력 및 출력 연결을 의미하며, 연속적인 값을 갖는다.
net형의 특징
- 네트값이 변하게 되면 새로운 값을 전달하게 된다.
- 네트 자료형에는 신호가 저장되지 않는다.
- wire와 net이라는 용어는 보통 같은 의미로 사용되며 기본값은 z(High 임피던스)이다.
- net은 유도된 출력값을 갖게 되며, 만약 유도되는 값이 없으면 z값을 갖는다.
- 네트 자료형의 크기를 정하는 범위를 지정하지 않으면 기본적으로 1비트 net으로 선언
- 1비트보다 큰 크기를 가질 때 자료현 선언 시 범위를 지정해야 하며 시뮬레이션을 위해 지연을 정의할 수 있다.
- 자료형 선언과 함께 초기값(합성 안됨)을 할당 할 수 있다.
- 네트 자료형 중 wire은 게이트나 모듈의 출력을 도선(wire)을 이용하여 연결할 때 사용한다.
- 정리된 예약어에 의해 정의된다. (wire)
net형의 예시
- a, b, cin, s1, c1, c2, sum, cout은 실제 회로에서 각 장치(device)의 입력 및 출력 연결을 의미
- 네트 a와 b는 U0에 해당하는 xor 게이트의 입력에 연결되어 있으며 네트 s1은 U0의 출력으로 연결되어 있다.
- a와 b 가 변하게 되면 s1은 xor 게이트 U0에 의해 유도(drive)된 출력을 연속적으로 갖게 된다.
- 이러한 표현을 위해 네트 자료형은 항상 연속 할당문(continous assignment statement)인 assign문을 사용하여 할당
net 자료형
- wire : 논리적 행동(회로 동작)이나 기능 없이 단순한 연결에 사용
- tri : wire와 같으며 3상태(tri-state)로 High 임피던스 상태가 더 있음
- supply0 : net을 접지(GND)에 연결
- supply1 : net을 전원(VDD)에 연결
- tri0 : net을 저항성 풀다운(pull down)에 의해 접지에 연결
- tri1 : net을 저항성 풀업(pull up)에 의해 전원에 연결
- wand : 여러 디바이스 출력을 선으로 연결하여 and 기능을 하도록 함. wired-and(open collect logic)의 하드웨어 구현을 모델링하기 위해 사용
- wor : 여러 디바이스 출력을 선으로 연결하여 or기능을 하도록 함. wired-or(emitter coupled logic)의 하드웨어 구현을 모델링하기 위해 사용
- triand : wand와 같으며 3상태로 high 임피던스 상태가 더 있음.
- trior : wor와 같으며 3상태로 High 임피던스 상태가 더 있음.
- trireg : 물리적인 net에 저장되는 전하를 모델링
net형의 사용 예
- 사용 예
wire a, b; //왼쪽 회로에서 네트 a와 b를 wire로 선언
wire c; //왼쪽 회로에서 네트 c를 wire로 선언
assign c = a & b; //a와 b라는 wire의 and된 값을 c에 할당함
wire x, y; //1비트 크기의 네트 x와 y를 wire로 선언
wire [3:0] x, y; //4비트 크기의 네트 x와 y를 wire로 선언
wire [1:0] x, [3:0] y; //오류, 크기가 다른 네트 선언 시 줄을 나누어 각각 선언
wire enable = 1'b0; //1비트 크기의 네트 enable을 wire로 선언과 동시에 초기값을 0으로 할당
- 신호가 wire로 선언되는 3가지 규칙
- [규칙 1] assign문에서 좌변 할당 신호는 wire로 선언, 좌변 할당 신호가 port신호인 경우는 wire 선언을 생략해도 됨.
- [규칙 2] 게이트 프리미티브의 출력신호는 wire로 선언됨, 게이트 프리미티브의 출력 신호가 port신호이거나 1비트 wire인 경우는 생략 가능
- [규칙 3] 구조적 모델링 방법으로 설계 시 정의된 모듈을 호출하는 경우, 정의된 모듈의 출력신호는 wire 선언됨.해당 신호가 포트(외부 출력) 신호이거나 1bit wire인 경우 wire 선언 생략 가능
레지스터(reg)형
레지스터(reg)형이란?
- 변수(variable) 자료형이라고도 함.
- C언어 프로그래밍 등에서 사용하는 변수와 유사한 개념을 갖는 일종의 변수로 사용
레지스터(reg)형의 특징
- 네트와는 달리 새로운 값이 할당될 때까지 현재의 값을 유지할 수 있는 자료형
- 레지스터 자료형의 기본 초기값은 x(unknown)
- 네트와 마찬가지로 레지스터의 크기를 정하는 범위를 지정할 수 있다. 크기를 지정하지 않으면 기본적으로 1비트 레지스터로 선언
- 시뮬레이션에서 사용하는 real, realtime으로 정의되는 자료형의 초기값은 0.0을 갖는다.
- 레지스터 자료형은 always문이나 initial문 내부에서 절차적 할당문(procedural assignment statement)을 사용하여 논리값이 할당되며, 다음 할당이 이루어질 때까지 값이 유지
- 레지스터 자료형은 플립플롭 등 논리값은 저장하는 소자를 모델링할 떄 주로 사용
- 논리값 저장이 이루어지지 않는 조합논리회로의 모델링에서도 사용
- 정리된 예약어에 의해 정의(선언)(reg, integer..)
- verilog에서의 레지스터 자료형과 실제 회로의 플립플롭(flip-flop)으로 구현된 레지스터는 용어가 같지만, 저장 소자를 지칭하는 하드웨어 레지스터와 달리 verilog의 레지스터는 단지 변수의 의미이므로 혼동하지 말아야 함.
verilog에서 레지스터(reg) 자료형
- reg : 크기를 가지나 부호가 없는 정수를 갖는 변수로 실제 설계에서 사용
- integer : 부호있는 32비트 크기의 정수를 갖는 변수(산술 연산 시 결과가 2의 보수로 출력)로 합성 가능, 시뮬레이션에서 주로 사용
- real : 부호있는 실수값을 갖는 변수로 시뮬레이션에서만 사용
- time : 부호없는 64비트 크기의 정수를 갖는 변수로 시뮬레이션에서만 사용
reg형의 사용 예
- 사용 예
reg q, q_; //1비트 크기의 레지스터 q와 q_를 선언
reg [3:0] x, y; //4비트 크기의 레지스터 x와 y를 선언
reg [1:0] x, [3:0] y; //오류, 크기가 다른 레지스터 선언 시 줄을 나누어 각각 선언
- 신호가 reg로 선언되는 3가지 규칙
[규칙 1] initial 문의 좌변 할당 신호인 경우 reg 선언
reg a, b; //비트 폭에 관계없이 reg 선언은 생략 불가
...
initial begin
a = 1'b0; b = 1'b1;
end
[규칙 2] always문의 좌변 할당 신호인 경우 reg 선언
reg y; //비트 폭에 관계없이 reg 선언은 생략 불가
...
always @ (a or b)
y = a & b;
[규칙 3] function, task의 좌변 할당 신호인 경우 reg 선언. function의 경우 function_name, task의 출력 변수의 경우 default로 reg이므로 reg 선언 불필요
파라미터(parameter)
파라미터(parameter)란?
- 파라미터는 모듈 내의 상수 값을 정의하는데 사용
파라미터(parameter)의 특징
- 할당된 값은 변하지 않는다.
- 회로에서 포트의 비트 수나 초기값 등을 지정할 수 있다.
- 범위가 지정되지 않을 경우 할당한 상수 값에 적합한 크기의 비트 수를 기본값으로 갖게 된다.
- 단, 신호의 값(신호의 비트 수와 구분 필요)을 정의할 때 비트 수를 정의하는 데는 사용할 수 없다.
- 각 모듈에서 정의된 파라미터 값은 컴파일 시 개별적으로 처리되므로 모듈 별로 조정할 수 있다.
- 파라미터는 예약어 parameter를 사용하여 선언
파라미터(parameter) 사용 예
- 사용 예
parameter X = 4'h5, Y = 4'h7 //X와 Y의 값을 각각 4비트 16진수의 5와 7로 정의
parameter AVG = (X + Y) / 2; //AVG를 X와 Y의 식에 의한 상수 결과로 정의
parameter WIDTH = 32, DEPTH = 1024; //WIDTH와 DEPTH의 값을 상수로 정의
parameter SIZE = 12; //SIZE의 값을 상수 12로 정의
parameter A = SIZE'b1010; //문법 오류, 신호 값의 비트 수 정의 불가
이 글은 "따라하면서 배우는 디지털 시스템 설계 및 응용 with Verilog HDL"을 기반으로 작성했음을 알립니다.
'verilog > 이론' 카테고리의 다른 글
[verilog] verilog의 연산자(1)(산술연산자, 논리연산자, 비트단위 논리연산자) (2) | 2023.11.15 |
---|---|
[verilog] 벡터(vector)와 배열(array) (0) | 2023.11.13 |
[verilog] verilog의 어휘요소(여백, 주석, 연산자, 식별어, 예약어) (0) | 2023.11.06 |
[verilog] 모듈(module)과 테스트 벤치(testbench) (0) | 2023.11.02 |
[verilog] Verilog HDL과 설계 (0) | 2023.09.27 |