EE/Verilog HDL

[verilog HDL] Syntax 2. Data types

아이스얼그레이 2022. 2. 22. 17:53

verilog에서 사용되는 data type에 관한 포스팅입니다.

 

verilog에는 SW 설계에서 쓰이지 않는 Net과 Register라는 data type이 있습니다.

 

1. Net

Net은 HW사이의 연결을 기술할 때 쓰는 data type입니다. 1bit z value가 default값입니다. Net은 data type을 나타내는 말이고 wire라는 keyword를 써서 사용합니다.

 

2. Register

데이터를 저장하는 data type입니다. 다른 값이 변수에 들어오기전까지 가지고 있는 값을 유지합니다.

reg라는 keyword를 사용해 기술하며, simulation상에서 assign을 통해 언제든지 바뀔 수 있습니다. 1bit z value가 default값입니다.

 

3. Vector

verilog에는 scalar와 vector라는 개념이 등장합니다. 수학에서 사용하는 scalar와 vector와는 그 의미가 사뭇 다릅니다.

verilog에서 scalar는 1bit data를 의미합니다. 그리고 vector는 Multiple bit width를 가진 data를 나타낼 때 사용합니다.

 

wire, reg, input, output 모두에 사용할 수 있으며 indexing은 0부터 시작합니다. 다음과 같이 data type과 data사이에 몇 bit인지 기술하여 사용합니다.

wire a; // scalar net variable
wire [7:0] bus; // 8bit net variable
wire [31:0] busA, busB, busC; // 3 variables with 32bit width

 

vector data의 각 bit를 호출할 때는 변수명 뒤에 [index] or [higher index : lower index]를 써서 사용합니다.

busA[7];
bus[2:0]; // 하위 3bit 호출
virtual_addr[0:1]; // 상위 2bit 호출

// index의 순서에 따라 MS, LS bit가 호출됩니다.

 

vector의 part를 선택하는 다른 syntax는 다음과 같습니다.

reg [255:0] data1;
reg [0:255] data2;
reg [7:0] byte;

byte = data1[31-:8]; // 31bit에서 시작해 1bit씩 감소해 8bit width만큼 byte에 저장
=> byte = data1[31:24]

byte = data1[24+:8]; // 24bit에서 시작해 1bit씩 증가해 8bit width만큼 byte에 저장
=> byte = data1[31:24]

byte = data2[31-:8]; // 31bit에서 시작해 1bit씩 감소해 8bit width만큼 byte에 저장
=> byte = data2[24:31]

byte = data2[24+:8]; // 24bit에서 시작해 1bit씩 증가해 8bit width만큼 byte에 저장
=> byte = data2[24:31]

 

4. Integer & Real

Integer, Real data type은 SW에서 사용되는 data type과 비슷하게 동작합니다. HW 설계에서는 module설계 시에는 거의 쓰이지 않고, testbench나 module debugging시 주로 사용됩니다.

 

verilog 내에서는 약어를 사용하지 않고 integer, real keyword를 통해 선언합니다.

 

5. Array

array는 여러 변수를 한 번에 나타낼 때 사용하는 data type입니다. vector와 헷갈리기 쉬운데 잘 구분해서 사용해야 합니다.

 

array는 reg, wire, integer, real 등 대부분의 data type에서 사용할 수 있습니다. 하지만 module 설계 시 input과 output에서는 사용할 수 없으니 이점에 유의해야 합니다.

 

vector는 n-bit width를 가진 하나의 data이고, array는 1bit 이상의 width를 가진 여러 개의 data입니다.

 

다음과 같이 변수명 뒤에 array의 개수를 나타냅니다.

reg [63:0] array_1 [15:0]; // 64bit width인 register를 16개 선언
wire [7:0] array_2 [5:0]; // 8bit width인 net을 6개 선언

 

array의 호출은 vertor의 호출과 유사합니다. 다만 array의 경우 indexing을 통해 n 번째 data를 불러오는 것은 가능하지만, 여러 개의 data를 한 번에 호출할 수는 없습니다.

 

6. Parameter

C/C++에서의 parameter와 비슷한 동작을 합니다. parameter type으로 선언된다면 변수명으로 사용할 수는 없고, module instance customizaion을 가능하게 합니다. 자세한 내용은 추후에 따로 다루겠습니다.