본문 바로가기

Study/Verilog

Verilog의 기본 : 숫자표현, 자료형, 벡터, 배열, 문자열

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

  이 포스팅은 제 개인적인 공부를 저장 및 복습하기 위해서 올리는 글입니다. 개인적인 정리기 때문에 저의 잘못된 이해가 섞여있을수도 있는 점 알려드립니다. 너무 맹신하지는 말아 주시기 바랍니다. 


숫자 표현


기본적으로 <비트 수> <진수> <(value)> 로 표현한다.

<비트 수>에는 10진수 숫자로만 써야하며, 숫자의 크기를 말한다.

<진수>에는 b,B 2진수를, o, O8진수, d, D10진수를, h, H16진수를 표현한다.

예를 들면 다음과 같다.

 

7'b1111001 7비트 2진수 1111001

 

11'd2047 11비트 10진수 2047

 

17'h12a1 17비트 16진수 12a1

 

<비트 수>를 표현하지 않을 수 도 있는데

그럴 경우 일반적으로 32비트 숫자가 된다.


 예를들면  

2011147 32비트 10진수 2011147

'h113a 32비트 16진수 113a

 (진수가 없으면 기본적으로 10진수)


자료형 (Data Type)

 

always문이나 If문에 데이터를 사용하기 위해선 보통 reg를 통해 할당된 데이터가 있어야 되고 보통 output으로 부터 할당된다.

 

부품간의 구조적 연결 net

net 자료형

wire, tri : 선을 서로 연결할 때 사용, net에 사용(tri는 여러개의 드라이버를 가짐)

wor, trior : OR 연산하는 wire (여러 개의 드라이버를 갖는다. OR게이트니 여러개를 가질 수 밖에)

wand, triand : AND 연산하는 WIRE (마찬가지로 여러 개의 드라이버를 갖는다.)

tri0, tri1 : tri와 같지만 아무것도 인가되지 않으면 (z,z가 인가될때) 0(pull-down)1(pull-up)이 된다.

supply0, supply1 : 전압공급기의 세기로 0(ground), 1(Vdd)를 나타냄.

trireg : 삼상콘덴서출력이다. 구동되지 않을 때 과거 값을 유지한다. (삼상콘덴서에 사용되기 위해서 tri가 여러개의 드라이버를 가질때 사용되고 regalways문이나 if문에 사용하기 위한 저장공간이기 때문에 trireg라 사용되는 게 아닐까)

tri0

0

1

x

z

0

0

x

x

0

1

x

1

x

1

x

x

x

x

x

z

0

1

x

0

wire [7:0] a; //a라는 포트에 0부터 7까지 8개의 공간을 할당

tri tristate_buffer; //tristate_buffer라는 공간 할당

wand #5 sig_1; // 5(ms) 시간 후 and 연산을 하는 sig_1을 출력

trireg (small) t; // 삼상 콘덴서 출력을 (small정도의 신호강도, 전하 세기) 하는 t라는 포트를 할당함

wor (strong1, weak0) wire_or; //OR연산을 하는 포트 wire_or를 할당하고 1일때는 strong1의 세기 0일때는 weak0 세기를 가짐.

trior (pull1, weak0) [3:0] #(5:3:4) vect;

 

레지스터(register)는 데이터를 저장하는데 사용되는 변수이다. 다른 데이터가 할당될 때까지 저장된 값을 유지한다. reg을 밴열로 나타내면 메모리를 모델링할 수 있다. 절차적 블록(procedural block)에서 변수 (variable)로 사용될 수 있고 절차적 블록 내에서 신호에 값을 할당하려면 register 자료형이 요구된다. (절차적 블록은 initial이나 always로 시작)


데이터 저장 register

레지스터 자료형

역할

reg

일반적으로 사용하는 레지스터 (부호 없는 변수)

integer

정수 표현을 하는 레지스터, signed 형태 사용가능 [부호 있는 변수 (32비트)] (음,양으로 32비트씩 활당된 듯)

time

시뮬레이션 시간을 저장하는 레지스터 [부호 없는 정수 (64비트)] (부호가 없어서 양수로만 64비트가 활당된듯)

real

실수 표현을 하는 레지스터

 reg가 제일 많이 쓰인다.

 

벡터 (vector)

 

벡터란 n비트 폭을 가진 하나의 원소를 말한다.

net (부품간 구조적 연결)reg (데이터 저장) Data Type(자료형)은 여러개의 비트를 가진 벡터로 선언할 수 있다.

<데이터 타입(date_type)> [최상위 비트(range1)>:최하위 비트(range2)] <변수 명(identifier)> 으로 선언한다.

<range1>에서 <range2> 범위의 선 폭을 갖는 벡터 신호 <identifier>가 선언된다. [높은 수:낮은 수] 또는 [낮은 수:높은 수] 둘 다 나타낼 수 있으며, 항상 왼쪽에 있는 것이 최상위 비트를 나타낸다. 예로 들어 reg [8:0] bus로 선언하면 9 비트 신호의 가장 왼쪽(range1)MSB(most significant bit)이고 가장 오른쪽(range2)LSB(least significant bit)가 된다. 만약 reg[0:8] bus라고 선언하면 반대로 가장 오른쪽(range2)MSB이고 가장 왼쪽(range)LSB이다

(비트 폭을 따로 선언하지 않으면 1비트 스칼라이다.)

 

 wire [15:0] wire_tt; // 15비트 wire_tt 선언

 wire [3:0] wire_t1, wire_t2, wire_t3; // 3개의 wire_t1~3을 각각 4비트로 선언

 reg [0:15] reg_test; // 16비트 폭을 가진 벡터 레지스터

 

배열 (array)

 

배열은 1비트 또는 n비트를 가지는 여러 원소를 말한다.

 

reg, integer, time, 벡터 레지스터 데이터 타입의 배열을 선언할 수 있다.

<데이터 타입(data_type)><벡터 데이터 비트 폭(range1)>:(range2)]><배열 이름(identifier)>[ 변수의 개수()를 의미<range11>:<range12>]

으로 선언한다.

(벡터 레지스터의 배열은 data_type뒤에 선언되고 일반 배열은 식별자 뒤에 선언된다.)

 

* 예시 (identifier 뒤에 선언 됬으므로 변수(일반배열)의 배열이다.)

1 integer rebas_test [0:3]; // 4개의 rebas_test 변수의 배열

2 reg rebas [15:0]; // 16개의 rebas 레지스터 변수의 배열

3 reg [5:0] arr_test [0:9]; // 10개의 arr_test 변수의 배열, 각 변수는 6비트 폭을 가짐

4 integer abc [3:0][3:0]; // 사용할 수 없는 표현. 다차원 배열은 사용 불가능

 

2차원 배열은

<data_type> <identifier> [<range11>:<range12>] [<range21>:<range22>]

 

벡터 (vector)2차원 배열은 다음과 같이 나타낸다.

 

<data_type> [<range1>:<range2>] <identifier> [<range11>:<range12>] [<range21> : <range22>]

 

배열 전체나 일부분은 단일 할당에 의해서 값을 받을 수 없으며 수식에서 사용될 수 없다. ROM (read-only memory), RAM (random access memory), 및 레지스터 파일(register file)을 모델링 할 때 사용된다.

 

문자열 (string)

문자열(string)은 더블 인용 문자(“)로 둘러 싸여 있는 한 줄에 담긴 일련의 문자들이다. 각 문자는 ASCII(American standard code for information interchange) 코드로 표현된다. 문자열을 저장하기 위해서 문자열과 같거나 더 긴 register를 선언하여 저장하여야 한다. 문자열의 끝을 나타내는 종료 문자는 사용되지 않는다. 여기서도 자리 수가 남으면 0으로 채워 확장한다. 문자열 내에 다음과 같은 특수 문자들이 있을 수 있다. 도피 열(escape sequence)로 나타낸다.

문자

\n

새줄 (newline) 문자 (개행 문자)

\t

(tab) 문자

\\

백슬래시(\)문자

\“

더블 인용 문자(“)

\ddd

세 자리의 8진수로 나타내어지는 ASCII 문자

%%

% 문자

큰 따옴표를 사용하며, 하나의 라인에 써야한다.

문자열은 한 문자당 1바이트(8비트)의 크기를 가지므로, 레지스터를 선언할 때 비트 수를 고려하여 선언해야 한다.

특수 문자는 역슬래시(\)를 사용하여 출력할 수 있다.

 

)

module string_example()

// Declare 17 bytes to store a string.

reg [8*17:0] string;

 

initial begin

string = “an example string”;

$display(“%s\n”, string);

end

 

endmodule

 

다음은 문자열을 사용하는 예이다. 여기서 문자열 내에 있는 %sregister 자료형인 변수에 있는 문자열로 치환하라는 뜻이다. 이 외에 register 자료형에 대해서 %b는 이진수를, %08진수를, %는 십진수를, %h16진수를 문자열로 변환하여 치환하라는 뜻이다. 실수에 대하여 %f10진 고정 소숫점 표기 (fixed-pointnotation), %e는 과학적 표기(scientific notation), 그리고 %g는 이들 둘 중에 짧은 형식으로 문자열로 변화하라는 뜻이다. %t는 시물레이션 시간 (simulation time)을 넘겨주는 시스템 함수 $time (정수 시간을 넘겨준다) 또는 $realtime (실수시간을 넘겨준다)의 결과를 문자열로 변환하라는 뜻이다. 이외 %Md은 현재의 모듈명(module name)을 변환하라는 뜻이다.

'Study > Verilog' 카테고리의 다른 글

Verilog : UDP (user-defined primitve)  (0) 2017.05.05
Verilog : 게이트  (0) 2017.04.28
Verilog : 연산자  (2) 2017.04.28
Verilog : 모듈가져오기  (0) 2017.04.28
Veriliog : 상수 선언, 모듈, 포트  (0) 2017.04.28