베릴로그의 자료형은 우선 크게 넷(Nets)과 레지스터(Registers)로 나누어진다.
- 넷(Nets)
넷은 하드웨어 요소 사이의 물리적 연결을 추상화한 것으로, 물리적인 연결 선이므로 특정 값을 저장할 수는 없다.
따라서 연속적인 할당에 사용된다.
넷은 키워드가 아니라 wire, wand, wor, tri, triand, trior, trireg 등의 집합을 나타낸다.
넷은 다음과 같이 벡터를 사용해서 크기를 지정할 수 있다.
wire [7:0] bus; //8비트 넷 변수 bus
크기를 지정하지 않는다면 기본적으로 1비트 넷이 된다.
넷의 기본값은 z(하이 임피던스)이며 유도되는 출력값을 갖게 된다.(유도되는 값이 없으면 z)
- 레지스터(Registers)
레지스터는 다른 논리값이 들어오기 전까지 그 값을 유지한다.
이름 때문에 혼동이 일어날 수 있으나 실제 F/F으로 만들어지는 하드웨어의 레지스터와 다른 것이다.
넷과는 다르게 신호의 유도를 필요로 하지 않으며, 절차적 할당에 사용한다.
레지스터 데이터형은 키워드 reg에 의해 정의되며, 역시 벡터로 크기를 지정할 수 있고 기본 크기는 1비트이다.
signed를 사용하여 부호 있는 변수로 선언할 수 있다.
reg signed [63:0] m; //64비트 부호 있는 레지스터 m
베릴로그에서는 또한 레지스터 데이터형으로 integer, real, time 데이터형을 지원한다.
- integer
수를 다루기 위한 일반적인 범용 레지스터 데이터형으로, 대신 reg를 사용해도 되지만 reg의 경우 음수를 저장할 수 없는 반면 interger는 가능하다.
integer의 기본 폭(비트 수)은 지정된 호스트 기계의 워드 크기와 같고, 최소 32비트(4바이트)이다.
- real
real의 기본값은 0이며, 범위 선언을 사용할 수 없다.
실수를 정수에 대입할 때에는 가장 가까운 정수로 변환된다.
- time
time은 시뮬레이션 시간을 저장하기 위해 사용한다.
time 레지스터 데이터형의 폭은 기계에 따라 지정되나 최소 64비트이다.
시스템 함수 $time은 현재의 시뮬레이션 시간을 얻기 위해 사용된다.
여러 비트를 다루기 위해 벡터와 배열을 사용할 수 있다.
벡터와 배열은 혼동되는 개념이므로 먼저 간단하게 정의를 통해 비교를 해보자면,
- 벡터: n비트 폭을 갖는 하나의 요소
- 배열: 1비트, 혹은 그 이상의 비트를 갖는 여러 요소들
배열은 우리가 C나 C++등에서 사용하는 배열과 거의 같은 의미이다.
- 벡터
reg나 wire는 여러 비트폭을 갖는 벡터로 선언될 수 있다.
앞에서 언급했듯이,
reg [0:40] virtural_addr; //41비트 폭을 가진 벡터 레지스터
다음과 같이 선언하여 레지스터를 여러 비트폭을 갖는 벡터로 선언할 수 있다.
벡터는 [높은수:낮은수] 또는 [낮은수:높은수]로 나타낼 수 있으며, 왼쪽에 있는 것이 최상위 비트(msb)를 의미한다.
벡터는 일부 범위의 비트만 선택하여 나타낼 수 있다.
wire [31:0] busA;
busA[7]; //busA의 7번 비트
또한 다음 형식을 사용하여 가변적으로 벡터를 부분 선택할 수 있다.
- [<시작 비트>+:폭] : 시작 비트에서 증가하는 부분 선택
- [<시작 비트>-:폭] : 시작 비트에서 감소하는 부분 선택
- 배열
reg, integer, real, time, realtime, 벡터 레지스터, 넷 등의 자료형에 대해 배열을 생성할 수 있다.
베릴로그의 배열은 일반적인 프로그래밍 언어에서와 유사하다. 또한 다차원 배열을 지원한다.
wire [7:0] w_array [5:0]; //8비트 벡터 넷에 대한 크기 6의 배열
베릴로그에서는 상수를 정의하기 위해 parameter 키워드를 사용할 수 있다.
- parameter
parameter는 변수로 사용될 수 없으며, 컴파일 시 개별적으로 대치된다.
모듈을 인스턴스화 하거나, defparam 문장을 사용하여 parameter의 값을 바꿀 수 있다.
localparam으로 정의되는 로컬 parameter는 defparam등으로 값을 변경할 수 없다.
따라서 값이 변해서는 안되는 경우에 사용된다.
- 문자열
문자열은 reg에 저장될 수 있다.
문자 하나는 1바이트(8비트)를 차지한다.
C에서와 마찬가지로 이스케이프 시퀀스를 사용할 수 있다.
reg [8*18:1] string_value; //18바이트의 폭을 갖는 레지스터
initial
string_value = "Hello Verilog World!"; //문자열 저장
reference: Samir Palnitkar - Verilog HDL 2판
'EE > Verilog' 카테고리의 다른 글
[Verilog] 게이트 수준 모델링 (0) | 2023.01.06 |
---|---|
[Verilog] 포트(Ports)와 포트 연결 규칙 (0) | 2023.01.05 |
[Verilog] 모듈의 구성 요소 (0) | 2023.01.05 |
[Verilog] 컴파일러 지시어 (0) | 2023.01.03 |
[Verilog] System task (0) | 2023.01.03 |