본문 바로가기
개발 Tools/Verilog HDL

Verilog HDL 자료형 (주석, 수의 표현, 상수 표현, 논리값 종류, 문자열, reg, wire, 식별자, vector, 메모리, 파라미터)

by 전컴반 2022. 2. 9.
반응형
논리 값 종류

 

논리 값으로는 0, 1, z, x가 존재한다. 0과 1은 기본적으로 알 테니 z와 x에 대해 알아보자

 

Tri-state

- 제3의 상태라고 하며 z라고 표시한다. high-impedance ( disconnected ) 즉. 아무것도 연결된 것이 없는 걸 말한다.

en이 0이면 다 끊어져서 z가 출력된다.

 

저작권침해의사없음

 

Unknown (또는 Don't care)

- x라고 표시하며 뭐가 출력될지 모르는 상태를 말한다. 예로는 아래와 같은 경우가 있다. 

 

저작권침해의사없음

 

주석

 

// : 한 줄 주석

/* */ : 부분 주석

 

저작권침해의사없음

 

수의 표현

 

표현방법으로는 아래와 같다.

<비트수>'<진수><값>

 

예를 들면, "16'b0000_1000_1000_0000"의 의미는 <16진수><b는 binary><이진 값>을 의미한다.

( '_'는 표현의 편리성을 위해 사용 가능하다 )

 

조금 더 자세히 보면

 

비트수 (size)

- 비트 크기를 나타내는데 생략 가능하다. default로 32비트다.

 

진수

- d는 10진수

h는 16진수

o는 8진수

b는 2진수

s는 부호가 있는 수

대문자를 사용해도 무방하다

 

- 내가 원하는 상수의 값을 적으면 된다.

MSD가 x, z인 경우 비트수만큼 확장된다. 무슨 말이냐, 예를 들어 4'bx라면 8'bxxxx와 같다. 즉, x가 4개 있다는 말이다. 간단히 쓰기 위한 것이다. 

 

몇 가지 예를 들어보자

 

 

4'b0101은 2진수 0101을 4비트에 나타내는 것이다.

 

12;H3aD는 16진수 3aD를 12비트로 나타내는 것이다. 16진수는 4비트로 표현되기 때문에 3aD를 적었다.

 

16'd255는 10진수로 255를 16비트로 나타내는 것이다. 필자는 이게 이해가 안 됐다. 10진수 255는 8개의 비트로 표현 가능하다. 근데 왜 16비트로 나타내라는 것인지 이해가 안 됐다. 여러 예를 찾아봐도 다 비트수에 맞게 값을 할당하는 것 같았다.

결론은 나머지 8개의 비트는 0으로 채워진다. 즉 16비트에 255를 표현하는 것인데 8비트로 표현 가능하니, 나머지 8비트는 0으로 채워진다. (== 0000000011111111)

 

어차피 다 2진수로 변환할 건데 왜 다른 진수를 쓰냐고 묻는다면, 그건 표현의 편리함 때문이다. 255를 11111111로 쓰는 건 불편하기 때문이다.

 

추가적으로 2’b0001_1111와 같은 표현은 뭘까? 오류가 뜬다. 2개의 비트에 2진수로 표현하려면 00, 01, 10, 11 중에 하나를 적어야 한다.

정리하면, 비트수에 맞게 값들이 할당된다는 걸 알아야 한다.

 

비트수가 없는 경우에는 32비트로 보고, 진수도 없다면 10진수로 본다. 아래 예를 보면 알 수 있다.

 

 

자동확장도 있는데, 맨 앞에 숫자가 0, z, x일 경우 비트수의 맞게 확장된다. 아래의 예를 보면 이해 가능하다.

 

 

 

문자열

 

문자열 변수는 reg를 사용한다. 아래서 더 자세히 알아보자,

비트수는 문자수 *8을 해야 한다.

예를 들면, "ABC"는 3개의 문자다. 따라서 3 * 8 =24 비트수로 정의돼야 한다. 이유는 ASCII코드가 8비트로 돼 있기 때문이다. 

 

식별자  ( indentifier )

 

키워드

- 예약어, ex) module, input...

 

시스템 태스크 (system task)

- $로 시작되는 예약어이다. 시뮬레이터를 위한 명령어이다. ex) $display, $stop...

 

컴파일러 지시자

- ` (back-tick)으로 시작하는 예약어이다. 작은따옴표와 헷갈리는데, 키보드 '~'에 있는 친구다. 

어떤 역할을 하냐면 c언어에서의 #과 똑같다. 컴파일러를 위한 명령어이다. ex) `define PI 3.14, `include lib.v

 

사용자 정의 변수

- 여러 프로그래밍 언어의 변수 규칙과 비슷하다

 

자료형

 

Net 자료형

- 소자 간의 물리적인 연결을 위해 사용한다, 어떤 값을 저장할 수 없다. 

ex) wire, tri,...

 

Variable 자료형

- 값을 저장하기 위해 사용한다. 그러니 순차 논리회로에서 주로 사용한다, 그럼 조합 논리회로에선 사용하지 않냐, 그건 또 아니다.

ex) reg, integer...

 

 

wire를 보면, 마치 c언어에서 함수를 위에 선언하고 아래서 사용하는 것과 유사하다. 값을 저장하지 않으니 조합 논리회로에서 주로 사용한다. 

 

 

reg를 보면, 저장 소자를 모델링하기 위해 사용한다. 즉, 조합 논리회로를 모델링하기 위해 사용한다.

 

 

vector 

 

여러 비트를 표현하기 위해 []를 사용하여 선언한다. 

아래의 예를 보면 선언할 때는 []가 앞에 있지만 사용할 때는 []가 뒤에 존재한다는 걸 기억해야 한다.

 

 

메모리

 

reg형의 1차원 배열이다. 메모리 전체를 하나의 단일 값으로 할당할 수 없다, 워드 단위로만 할당할 수 있고 비트 단위로 조작이 불가하다.

 

이게 무슨 말이냐면, 아래의 예를 보면 m사이즈의 메모리가 n개 있다고 볼 수 있다.

워드 단위로만 할당할 수 있다는 말은

mema [0] = 1

mema [n] = 10은 가능하다는 것이다.

 

비트 단위로 조작이 불가하다는 말은

mema [n][1] = 0은 불가하다는 것이다.

 

 

추가적으로 비트수 선언 없으면 1비트를 의미한다

 

파라미터 

 

특징적인 값을 저장한다.

parameter bit = 15;

parameter width = 300, length = 239처럼 가능

반응형

댓글