오늘 끝나면
HDL과 FPGA
- ✓HDL과 FPGA의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 HDL과이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
시각 회로를 HDL로 — testbench로 검증 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
반도체 설계 · 39
HDL과
FPGA
지금까지 회로를 그림으로 봤다.
HDL은 그 회로를 글로 적는다. 하드웨어를 코드로 적는다.
FPGA는 그 코드를 재구성 가능한 칩에 올려 진짜로 돌린다.
하드웨어를 코드로, HDL
지금까지 게이트·가산기·ALU를 그림으로 그렸다. 칩 한 장에 수십억 게이트면 손으로 못 그린다.
그래서 회로를 글로 적는다. 이 글을 HDL(Hardware Description Language)이라 한다.
대표는 Verilog와 VHDL이다. 둘 다 회로를 묘사하는 언어다.
중요한 건 HDL이 보통 프로그램과 다르다는 점이다.
소프트웨어 코드는 위에서 아래로 한 줄씩 실행된다.
HDL은 실행이 아니라 회로를 묘사한다. 적은 게이트들이 동시에 존재하고 동시에 동작한다.
xor g0 (x1, a, b)한 줄은 “XOR 게이트 하나가 a·b를 받아 x1을 낸다”는 부품 선언이다.
| 게이트 | HDL 배선 | 뜻 |
|---|---|---|
| XOR g0 | a, b → x1 | 두 입력을 XOR |
| XOR g1 | x1, cin → sum | 결과를 한 번 더 XOR해 Sum |
| AND g2 | x1, cin → a1 | 받아올림 후보 1 |
| AND g3 | a, b → a2 | 받아올림 후보 2 |
| OR g4 | a1, a2 → cout | 둘 중 하나면 Carry |
합성, 코드가 게이트 그물이 된다
HDL을 실제 게이트로 바꿔주는 도구가 합성기(synthesizer)다.
합성은 HDL을 읽어 실제 게이트와 배선의 그물(netlist)로 옮긴다.
a + b 같은 식을 보면 가산기 회로를 깔고, 조건문을 보면 멀티플렉서를 깐다.
이게 소프트웨어 컴파일과 닮았지만 결과물이 다르다.
컴파일은 코드를 실행할 명령으로 바꾼다.
합성은 코드를 실제 회로로 바꾼다. 그 회로를 칩에 새기거나 FPGA에 올린다.
그래서 같은 HDL이 ASIC으로도, FPGA로도 갈 수 있다.
assign sum = a ^ b ^ cin;
synthesize
XOR · AND · OR + 배선
FPGA에 올리기, 재구성 가능한 칩
합성한 회로를 진짜로 돌리려면 칩이 있어야 한다. ASIC은 한 번 새기면 못 바꾼다. 비싸고 느리다.
FPGA(Field-Programmable Gate Array)는 다르다.
미리 깔린 LUT(look-up table) 수만 개와 그 사이를 잇는 스위치 격자로 채워진 칩이다.
LUT는 작은 진리표다. 내용을 바꾸면 어떤 게이트든 흉내 낸다.
내 HDL을 합성해 “어느 LUT에 무슨 표를 넣고 어느 스위치를 켤지”를 정한 게 비트스트림이다.
이 비트스트림을 FPGA에 부으면 격자가 내 회로 모양으로 재배선된다. 그 순간 칩이 내 설계로 동작한다.
다른 비트스트림을 부으면 같은 칩이 다른 회로가 된다. 이게 “field-programmable”, 현장에서 다시 프로그래밍된다는 뜻이다.
진한 칸 = 비트스트림이 내 회로로 채운 LUT · 흐린 칸은 비어 있다
직접 HDL을 보고 testbench로 검증한다
왼쪽은 1비트 전가산기의 시각 회로, 가운데는 같은 회로의 Verilog HDL이다. 게이트 한 줄이 코드 한 줄이다.
아래는 testbench다. 입력 벡터(a·b·cin)를 하나씩 넣어 출력이 맞는지 확인하는 검증 코드다. 1을 내는 게이트 줄이 회로와 HDL에서 함께 진해진다.
8개 벡터를 전수 돌려 진리표가 채워지고 모두 PASS면, 이 HDL이 전가산기로 정확히 동작함이 증명된다.
이렇게 검증된 full_adder HDL이 최종 MyChip의 16비트 가산기 한 칸으로 들어간다.
module full_adder(input a, b, cin,output sum, cout);wire x1, a1, a2;xor g0 (x1, a, b);xor g1 (sum, x1, cin);and g2 (a1, x1, cin);and g3 (a2, a, b);or g4 (cout, a1, a2);endmodule
RUN하면 1을 내는 게이트 줄이 회로와 함께 강조된다
| a | b | cin | sum | cout | |
|---|---|---|---|---|---|
| 아직 검증한 벡터가 없다 · RUN을 눌러 한 줄씩 채운다 | |||||
testbench, 칩을 만들기 전에 코드로 확인한다
FPGA에 올리거나 실리콘을 깎는 건 비싸다. 그 전에 설계가 맞는지 코드로 확인해야 한다.
testbench는 검증 전용 HDL이다. 실제 칩에 들어가진 않는다.
검증 대상(DUT, design under test)에 입력 자극을 차례로 넣고, 나온 출력을 미리 정한 기댓값과 비교한다.
다르면 그 자리에서 FAIL을 외친다. 버그를 칩이 아니라 화면에서 잡는다.
회로를 코드로 적으니(HDL) 코드로 검증할 수 있고(testbench), 검증된 코드를 재구성 가능한 칩에 올려 진짜로 돌린다(FPGA).
설계와 실물 사이의 다리가 이 세 가지다.
Q. FPGA가 ASIC과 결정적으로 다른 특징은?
정답은 회로를 다시 구성(프로그래밍)할 수 있는 칩이라는 점이다.ASIC은 한 번 게이트를 새기면 못 바꾼다. FPGA는 LUT와 스위치 격자로 채워져 있어, 새 비트스트림을 부으면 같은 칩이 다른 회로가 된다.
그래서 설계를 빠르게 올려보고 고치는 데 쓴다. field-programmable, 현장에서 재프로그래밍된다.
| a b cin | 나온 sum cout | 기댓값 | 판정 |
|---|---|---|---|
| 0 0 0 | 0 0 | 0 0 | PASS |
| 1 0 0 | 1 0 | 1 0 | PASS |
| 1 1 0 | 0 1 | 0 1 | PASS |
| 1 1 1 | 1 1 | 1 1 | PASS |