-
디지털시스템: HDL언어란? HDL 언어 규칙에 대해서 알아보자!메모 및 기타 2020. 9. 11. 12:51
< HDL이란? >
HDL(Hardware Description Language)은 디지털 회로 및 혼합 신호를 표현하는 하드웨어 기술 언어이다.
FPGA나 집적회로 등의 전자공학 회로를 처리하는 설계 자동화에 사용한다.
C 프로그래밍 언어와 유사하며 abstract level 알고리즘을 그대로 HDL을 이용해 표현할 수 있다.
또한 Functional verification을 통해서 결과를 바로 확인할 수 있다.
HDL언어는 가장 흔하게 두 종류가 사용된다.
- Verilog HDL(일반적으로 베릴로그라고 부른다)
주로 기업에서 많이 사용한다고 한다.
- VHDL(very high-speed integrated circuits HDL)
< HDL 기반 설계 플로우(HDL-based Design Flow) >
1. Requirement
설계에 필요한 요구사항들을 확인한다.
2. Design Specification
설계사양을 확인한다.
Document/ high-level language code등을 확인하는 과정
3. Design formulation
설계 작업을 한다.
Boolean equation이나 block diagram을 만든다.
4. Design entry
HDL, Schematic(회로를 그린다.)
hdl을 다루는 것이 대부분
5. Functional Verification
기능이 잘 동작하는지 확인하는 단계
만약 문제가 생기면 Design entry로 돌아간다.
6. Synthesis
HDL로 작성한 내용을 boolean equation으로 바꾸어 확인하는 과정
synthesis가 가능하도록 코딩해야한다. 이를 RTL코드라고 한다.
7. Implementation
Boolean equation을 logic circuit으로 만드는 과정
8. Timing Verification
내가 원하는 timing을 맞추는지 검증하는 과정
9. Prototyping
FPGA나 ASIC에 protype하는 과정
FPGA나 ASIC은 프로그래밍을 할 수 있도록 만들어 놓은 반도체 칩으로
FPGA는 문제가 생기면 다시 코딩해서 문제를 해결할 수 있지만
ASIC은 처음부터 정해진 방식으로 사용되게 만들어져 있기 때문에
한번 만들어 놓으면 다시 바꾸어 사용할 수 없다.
여기서 HDL을 주로 다루는 과정은 4 ~ 6번이다.
< 하드웨어 모듈 >
모듈이란?
디지털 시스템의 가장 기본이 되는 단위
모듈은 크게 core circuit과 interface로 이루어져 있다.
- Core circuit은 internal 또는 body라 하며, 필요한 기능을 수행한다.
- Interface는 ports라고 부르며 입출력을 다룬다.
일반적으로 모듈 선언은 다음과 형식을 따른다
module module_name port list, port delcations parameters declarations of wires, regs, and other variables instantiation of lower level modules or primitives data flow statements always and initital blocks tasks and functions endmodule statement
(Instantiation은 다른 모듈을 가져와 사용한다는 것을 의미)
HDL을 이용해서 half-adder와 full-adder를 만들어보자
//반가산기 module half_adder(x, y, s, c); input x, y; //입력포트 output s, c; // 출력포트 xor xor1(s, x, y); // primitive의 파라미터는 출력 입력순으로 써준다. and and1(c, x, y); endmodule //반가산기를 이용한 전가산기 module full_adder(x, y, cin, s, cout); input x, y, cin; //입력포트 output s, cout; //출력포트 wire s1, c1, c2; //값을 임시로 저장할 공간 half_adder ha1(x, y, s1, c1); // 전에 만든 반가산기를 이용한다. half_adder ha2(.x(cin), .y(s1), .s(s), .c(c2)); // named association을 이용한 참조 or (cout, c1, c2); // 인스턴스 없이 이렇게도 가능 endmodule
< 언어 규칙(Lexical conventions) >
1. 변수 선언
베릴로그는 다음과 같이 c언어와 같은 변수 선언규칙을 따른다.
- 문자나 언더바(_)로 시작할 수 있고, 숫자나 $로 시작할 수 없다.
- 달러($)는 system task에서 가장 먼저 사용되는 문자이기 때문에 제일 먼저 사용할 수 없다.
가능한 변수 선언
mux_input123
_error_code_$five
_xyz$123
불가능한 변수 선언
123
2add
3_add
$_error_code
2. 화이트 스페이스
- /b : blank space
- /t : tabs
- /n : new line
3. 주석처리
- // : 한줄 주석처리
- /*... */ : 한줄 이상의 주석 처리
4. Sized number
<size>'<base format><number>의 형식을 따른다.
4'b1001- 4비트의 크기, 이진수 1001
-> 1001(2)
16'habcd - 16비트의 크기, 16진수 abcd
-> 1010101111001101(2)
5. Unsized number
'<base format><number>의 형식을 따른다.
2007 - 32비트 10진수
'habc - 32비트 16진수
6. x or z 값
x는 unknown (0과 1의 값을 갖지 않을때)
z는 high impedance 값(입력값이 없을 때)
그래서 디지털 시스템에서는 0, 1, x, z값을 가질 수 있다.
만약 2비트 수를 만든다고 하면 16가지의 경우의 수를 갖는다.
7. 음수
<size>'<base format><number>의 형식을 따른다.
-4'b1001 = 십진수로 -9를 의미
-16'habcd
8. "_" 와 " ? "
언더바는 숫자의 값에 영향을 주지 않는다.
- 1001_1011_1111 : _는 값에 영향을 주지 않는다. 100110111111와 같다.
물음표는 don'care 신호로 z와 같은 역할을한다.
- 100?101?11?1: 는 100z101z11z1와 같다.
9. Coding style
- 변수, 포트이름은 소문자로 쓴다.
- 상수나 user-defined변수는 대문자로 쓴다.
- 변수 이름은 의미있는 이름으로 정한다.
10. 베릴로그는 두가지의 데이터타입이 있다.
-Nets
하드웨어 로직 포인트를 연결하는 역할
단순히 연결하는 역할을 하기 때문에 값을 저장할 수는 없고
초기화해주지 않으면 기본적인 초기값 z를 갖는다.
주로 wire가 많이 사용된다.
-Variables
데이터를 저장하는 메모리 위치
값을 저장하는데 사용하고 초기값을 정해주지 않으면 초기값 x를 갖는다.
대표적으로 reg, integer, real가 있다.
두 변수 타입 다 어디에서든지 사용할 수 있다.
반응형'메모 및 기타' 카테고리의 다른 글
디지털 시스템: 베릴로그 문법정리 + Two's complement adder (0) 2020.09.17 디지털시스템: 모듈 모델링 방식? 베릴로그 시뮬레이션?, Test Bench란? (0) 2020.09.15 디지털 시스템: 디지털 시스템(Digital System)이란? (0) 2020.09.10 메모: 파이썬 알고리즘 1차 강의 메모 (0) 2020.08.20 Git: 깃허브(Github)로 협업하기 (0) 2020.08.08