Menu

Verilog이란? 하드웨어 기술 언어(HDL) 입문 가이드

Verilog이 무엇인지, 어디에 쓰이는지, 일반 프로그래밍 언어와 어떻게 다른지, 그리고 40년이 지난 지금도 디지털 설계자들이 왜 여전히 Verilog을 찾는지 쉽게 설명합니다.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

회로를 기술하는 언어

Python, JavaScript, Go 같은 대부분의 언어는 CPU가 실행할 명령어 시퀀스를 기술합니다. 반면 Verilog은 회로 를 기술합니다. 어떤 wire가 있고, 어떤 register가 있으며, 신호가 그 사이에서 어떻게 흐르는지를 적어 내려갑니다. 그러면 시뮬레이터가 회로의 동작을 재현해 줄 수 있고, synthesis 도구는 똑같은 텍스트를 실제 칩의 게이트와 플립플롭으로 컴파일할 수 있습니다.

이게 한 줄짜리 정의입니다. 그 함의를 체득하는 데는 시간이 좀 걸립니다.

이 코드는 작은 프로그램처럼 보입니다. module, initial 블록, $display 시스템 태스크가 있습니다. Run을 누르면 hello from verilog이 출력됩니다. 하지만 내부적으로 시뮬레이터는 함수를 실행하고 있는 게 아닙니다. 시간이 흐르는 척하면서 회로를 한 걸음씩 전진시키고 있을 뿐입니다. 어디서나 $finish가 등장하는 이유가 그것입니다. 누군가는 시뮬레이터에게 멈추라고 말해 줘야 합니다.

"하드웨어 기술"이 진짜 의미하는 것

C의 한 줄은 program counter가 그 줄에 도달했을 때 실행됩니다. Verilog의 한 줄은 항상 존재하는 회로 조각을 기술합니다. 다음을 봅시다.

assign y = a & b;

이건 "y를 한 번 계산하라"가 아닙니다. "y라는 wire가 있고, 모든 시점에서 a AND b와 같다"는 뜻입니다. ab가 바뀌면 y도 즉시 따라갑니다. 한 모듈 안에 assign 문이 여러 개 있어도 그것들은 순차가 아니라, 회로의 서로 다른 부분을 병렬로 기술한 것입니다.

이게 Verilog을 정의하는 특징이자 모든 초보자 버그의 원천입니다. 여러분이 쓰는 대부분의 코드는 동시에 일어나는 일들을 기술하며, 순서가 있는 것처럼 보이는 몇 안 되는 구문들(initialalways 블록 내부)도 시뮬레이터가 그렇게 보이도록 흉내내는 것뿐입니다.

Verilog으로 무엇을 만드나

Verilog은 디지털 스택의 모든 계층에서 사용됩니다.

  • 조합 논리(combinational logic). 가산기, 멀티플렉서, 디코더, ALU 슬라이스 등 출력이 오직 현재 입력에만 의존하는 모든 것.
  • 순차 논리(sequential logic). 카운터, shift register, 유한 상태 머신 등 posedge clk으로 클럭이 공급되는 모든 것.
  • 프로세서 코어. 대학 강의의 숙제용 CPU부터 실제 실리콘에 탑재되는 오픈소스 RISC-V 코어까지, 그 RTL은 보통 Verilog이나 SystemVerilog로 작성됩니다.
  • FPGA 설계. Xilinx나 Intel FPGA에 올라가는 로직 - 네트워킹, 영상 처리, 임베디드 제어 - 의 대부분은 Verilog으로 작성됩니다.
  • ASIC. 휴대폰, 라우터, 자동차 안에 들어 있는 커스텀 칩의 프런트엔드 설계는 HDL로 작성되며, Verilog은 그중 두 가지 주요 선택지 중 하나입니다.

이걸 배우는 데 어떤 하드웨어도 필요하지 않습니다. 이 문서의 모든 코드는 브라우저 기반 시뮬레이터에서 실행됩니다.

시뮬레이션 vs Synthesis

Verilog을 "실행"하는 방법에는 두 가지가 있고, 둘은 다릅니다.

  • 시뮬레이션(Simulation) 은 회로의 동작을 소프트웨어로 재현합니다. 시뮬레이터(Icarus Verilog, Verilator, ModelSim, 상용 도구 등)가 여러분의 모듈과 testbench(입력을 구동하는 코드)를 읽어 텍스트 로그, 파형, pass/fail 리포트 같은 출력을 만들어 냅니다.
  • Synthesis 는 Verilog의 일부분 만을 받아 실제 게이트의 netlist로 컴파일합니다. 벤더 도구(Vivado, Quartus, 대기업의 design-compiler 류)가 이 매핑을 담당합니다. Synthesis용 Verilog은 추가 규칙을 지켜야 하며 - initial 블록이나 $display 호출은 실리콘에 존재하지 않습니다.

이 페이지의 브라우저 에디터는 시뮬레이션만 수행합니다. 실제 칩을 양산하거나 FPGA에 다운로드하기 전까지는 그걸로 충분합니다.

Verilog vs SystemVerilog

찾아보면 두 이름이 모두 보일 겁니다. SystemVerilog은 상위 집합입니다 - 모든 Verilog 구성 요소를 그대로 유지하면서 주로 검증을 위한 기능들(class, constrained-random testing, assertion, interface, 훨씬 풍부한 타입 시스템)을 추가했습니다. 이 문서에서 배우는 모든 내용은 SystemVerilog에서도 유효합니다. 실무에서는 두 이름이 섞여 쓰이며, 대부분의 도구가 둘 다 받아들이고 대부분의 파일 확장자는 .v입니다. 이 문서에서는 일관되게 "Verilog"이라고 부르겠습니다.

Verilog vs VHDL

둘 다 하드웨어 기술 언어이고 IEEE 표준이며, 1980년대부터 존재해 왔습니다. 차이는 다음과 같습니다.

  • 문법. Verilog은 C에서 유래했습니다 - 중괄호, 간결한 키워드, 느슨한 타입 규칙. VHDL은 Ada에서 유래했습니다 - 더 장황하고 타입에 훨씬 엄격합니다.
  • 지역적 분포. Verilog은 미국 기반 상용 설계에서 주로 쓰입니다. VHDL은 유럽, 국방 분야, 그리고 오래된 코드베이스에서 여전히 흔합니다.
  • 표현력. 표현할 수 있는 범위는 거의 같습니다. 팀이 무엇을 쓰는지에 따라 선택하면 됩니다.

HDL을 처음 배운다면 Verilog 쪽이 진입 장벽이 낮습니다. 문법이 작고 좀 더 관대하며, 온라인에서 찾을 수 있는 표준 예제 라이브러리가 더 큽니다.

이 문서에서는 Verilog을 어떻게 실행하나

아래 에디터는 내부적으로 Icarus Verilog(iverilog)을 사용합니다. 소스를 시뮬레이터로 컴파일해 샌드박스 안에서 실행합니다. Vivado 라이선스도, Quartus 설치도, FPGA 보드도 필요 없습니다. 모듈과 작은 testbench를 작성하고 Run을 누르면, 출력과 파형을 볼 수 있습니다.

완전한 4비트 카운터와 testbench입니다. counter 모듈이 design under test(DUT)이고, test 모듈이 클럭을 흔들고, reset을 풀고, 매 사이클마다 값을 출력합니다. 실행해 보면 count가 0부터 15까지 올라간 뒤 wrap되는 것을 볼 수 있습니다. Waveform 탭을 열면 같은 내용을 전압 전이로 확인할 수 있습니다.

다음에 볼 내용

이제 모듈을 작성하기 시작할 만한 배경 지식이 생겼습니다. 다음 문서인 하드웨어 vs 소프트웨어는 사고방식 전환에 좀 더 시간을 할애합니다. 새로 Verilog을 시작하는 사람들이 가장 크게 걸려 넘어지는 지점이기 때문입니다. 그다음에는 로컬 시뮬레이터 설치(선택 사항 - 브라우저로도 충분합니다), 첫 모듈 작성, 그리고 언어의 나머지 부분을 다룹니다.

서두르지 마세요. 문법은 작지만 사고방식 전환이 본격적인 작업입니다.

자주 묻는 질문

Verilog을 쉽게 말하면 무엇인가요?

Verilog은 디지털 회로를 텍스트로 기술하는 하드웨어 기술 언어(HDL, hardware description language)입니다. CPU가 실행할 명령어를 작성하는 대신, wire, register, gate가 어떻게 연결되어 있고 신호가 어떻게 흐르는지를 기술합니다. 시뮬레이터가 이 기술을 실행해 동작을 검증하고, synthesis 도구는 같은 코드를 실제 칩 레이아웃으로 변환할 수 있습니다.

Verilog은 어디에 사용되나요?

Verilog은 디지털 하드웨어를 설계하고 검증하는 데 쓰입니다. CPU, GPU, 네트워크 스위치, 메모리 컨트롤러, 신호 처리 블록, FPGA 설계 등 게이트와 플립플롭으로 만들어지는 모든 것이 대상입니다. 디지털 논리를 가르치거나 실제 실리콘이 만들어지기 전에 설계를 프로토타이핑할 때도 순수 시뮬레이션 환경에서 사용됩니다.

Verilog은 프로그래밍 언어인가요?

일반적인 의미의 프로그래밍 언어는 아닙니다. Verilog 코드는 CPU 명령어 시퀀스가 아니라 하드웨어 구조와 동작(신호, 게이트, 클럭 기반 저장소)을 기술합니다. 여러분이 작성한 많은 줄이 칩 위에서 동시에 일어나며, 한 줄씩 차례대로 실행되는 게 아닙니다. 이 사고방식의 전환이 소프트웨어에서 Verilog으로 넘어올 때 가장 큰 장벽입니다.

Verilog과 SystemVerilog의 차이는 무엇인가요?

SystemVerilog은 Verilog의 상위 집합(superset)입니다. Verilog의 모든 문법을 그대로 유지하면서 검증을 위한 기능들(class, constrained-random stimulus, assertion, interface, 더 풍부한 데이터 타입 등)을 추가했습니다. SystemVerilog을 받아들이는 도구는 일반 Verilog도 받아들입니다. 입문 단계에서는 둘이 거의 똑같아 보입니다.

Verilog과 VHDL의 차이는 무엇인가요?

Verilog과 VHDL은 같은 문제를 푸는 두 가지 하드웨어 기술 언어입니다. Verilog의 문법은 C에서 유래해 더 간결하고, VHDL은 Ada에서 유래해 더 장황하며 타입에 엄격합니다. 지역과 팀에 따라 사용 비중이 다른데 둘 다 살아 있고 모두 표준화되어 있습니다(Verilog/SystemVerilog은 IEEE 1364/1800, VHDL은 IEEE 1076).

Verilog은 배우기 어려운가요?

문법 자체는 작습니다 - C++보다도 작죠. 어려운 부분은 소프트웨어식 습관을 버리는 일입니다. Verilog에서는 대부분의 문장이 순차적으로 일어나는 게 아니라 동시에 일어나며, blocking 대 non-blocking 대입을 잘못 쓰면 회로 자체가 작동하지 않을 수도 있습니다. 첫 일주일은 어리둥절할 각오를 하시고, 그 뒤에 감이 옵니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기