오늘부터 이틀간 Verilog HDL 기초에 관해 IDEC강의를 충남대학교 유효영 교수님께서 진행해 주셨다.
오전동안에는 HDL의 소개와 역사, 전자공학에서 IC칩을 바라보는 관점에 대해 소개 하셨으며
오후부터 본격적으로 HDL에 관해 문법, 작성법에 대해 강의가 진행되었다.
오늘 배운 내용을 되짚어보자.
Verilog HDL
!= Hard & Difficult Language
== Hardware Description Language
강의 초반에 농담식으로 hdl의 뜻을 비유해 주셨다.
사실 나도 처음에 hdl언어를 봤을때 그동안 봐왔던 C, C++, Python언어와 구조도 다를 뿐더러 읽는 방법도 상당히 어려워서 겁부터 났던 기억이 있다.
hdl이 위의 언어와 다른 근본적이 이유가 있었다.
바로 하드웨어를 기술하기 위해 그에 맞는 언어가 필요했고 우리가 알던 High Level 언어로 표현을 할 수 없었기 때문이다.
더 자세히 설명하자면 우리가 C언어로 코드를 작성하면 순차적으로, line by line으로 프로그램이 진행된다.
그러나 하드웨어는 AND, OR, NOT 게이트가 이용되며 이는 한꺼번에, 동시다발적으로 신호가 in, out이 된다.
따라서 이런 동시다발적인 게이트를 표현하기 위해 hdl언어가 탄생되었다.
IC 칩을 바라보는 반도체 / 전자공학 관점
그동안 전자공학과에서 회로이론, 전자회로, 논리회로, 컴퓨터구조, hdl등 많은 하드웨어 관련된 수업이 있지만 왜 배워야 하는지, 실제 반도체에서 어떻게 쓰이는지 모르는 상태로 공부를 해왔다.
그러나 다음 사진과 설명을 보고 방향성을 찾았으며 진로 설계에 많은 도움이 되었다.
- Device Level : 반도체 소자를 설계하는 단계, 이쪽 분야는 오늘날 전자공학보다는 반도체 공학과에서 공정, 소자관련 수업에서 자세히 다룬다.
- Circuit Level : 트렌지스터 기반의 아날로그 회로를 설계하는 단계이다. 회로이론, 전자회로가 중요하다.
- Gate Level : 논리게이트를 활용하여 디지털 회로를 설계하는 단계. 논리회로
- Register Transfer Level : 레지스터 간 데이터의 흐름과 논리연산 모델링을 통해 회로를 설계하는 단계.
- System Level : 전체 시스템 설계를 위해 시스템 모듈 및 인터페이스를 모델링하는 단계
Module & Instance
hdl은 크게 모듈과 인스턴스 두개로만 기술하는 나름 심플(?)한 언어이다.
Module
모듈은 C언어에서 함수와 비슷한 개념이라고 생각하면 된다.
함수와 비슷하게 특정 모듈을 만들어서 모듈 이름을 만들고 매개변수(input, output)를 넣어주고 모듈 내부에서 어떻게 동작할건지 구성해주면 된다.
간단하게 문법 규칙은 다음과 같다.
1. 'module' 로 시작해서 'endmodule'로 끝난다.
2. module 옆에 모듈 이름을 작성한다. ex) module T_FF
3. 모듈 이름 옆에 매개변수를 작성하는데 input과 output으로만 구성된다.
module T_FF(q, clock, reset); //T_FF이라는 모듈 이름과 q라는 output, clock과 res라는 input
.
.
<모듈 동작코드>
.
.
endmodule
Instance
인스턴스는 모듈에서 찍어낸 대상(객체)라고 생각하면 된다.
hdl을 기술하다보면 module에서 instance를 호출하는 경우가 있는데 이를 module instantiation이라고 한다.
예시는 다음과 같다.
module ripple_carry_counter(q, clk, reset);
output [3:0] q; // 모듈 정의, q라는 output 4개
input clk, reset;
T_FF tff0 (q[0], clk, reset); // T_FF모듈 instantiation, output으로 q[0], input으로 clk와 reset사용
T_FF tff1 (q[1], q[0], reset); // T_FF모듈 instantiation, output으로 q[1], input으로 q[0]와 reset사용
T_FF tff2 (q[2], q[1], reset); // T_FF모듈 instantiation
T_FF tff3 (q[3], q[2], reset); // T_FF모듈 instantiation
endmodule
module T_FF(q, clk, reset);
output q; // 모듈 정의
input clk, reset;
wire d;
D_FF dff0 (q, d, clk, reset); // D_FF모듈 instantiation
not n1 (d, q);
endmodule
여기서 주의할점은 모듈 내부에 모듈을 또 만들 수는 없다.
'연수 | 교육' 카테고리의 다른 글
[교육] 차량용 이더넷 통신 (0) | 2023.07.27 |
---|---|
[IDEC] 임베디드 프로세서 구조의 이해 2일차(수료) (0) | 2022.01.15 |
[IDEC] 임베디드 프로세서 구조의 이해 1일차 (0) | 2022.01.13 |