Verilog 공식 문서: 개념, 예제, 실습
예제 중심의 간결한 Verilog 레퍼런스. 개념을 읽고 코드를 본 뒤 Coddy 여정에서 직접 연습하세요.
Verilog 가이드 학습 시작하기시작하기
- Verilog이란?Verilog이 무엇인지, 어디에 쓰이는지, 일반 프로그래밍 언어와 어떻게 다른지, 그리고 40년이 지난 지금도 디지털 설계자들이 왜 여전히 Verilog을 찾는지 쉽게 설명합니다.
- 하드웨어 vs 소프트웨어소프트웨어 언어를 거쳐 온 사람에게 Verilog이 낯설게 느껴지는 이유 - 기본이 concurrency, 시간이 1급 시민, 그리고 문장이 순서대로 실행되지 않는다는 점.
- Verilog 설치Icarus Verilog과 GTKWave를 설치해 로컬에서 Verilog을 컴파일하고 시뮬레이션하는 방법. 설치를 건너뛰고 브라우저 에디터를 써도 이 문서를 따라가기에 충분합니다.
- 첫 모듈 만들기처음부터 완전한 Verilog 모듈을 작성해 봅니다 - 선언, 포트, 작은 조합 논리, 그리고 그것을 구동하는 testbench까지. 브라우저에서 바로 실행 가능합니다.
- 주석Verilog에서 한 줄과 여러 줄 주석을 쓰는 방법, 그리고 모듈이 커져도 가독성을 유지하기 위해 디지털 설계자들이 사용하는 문서화 패턴.
데이터 타입과 숫자
- wire와 regVerilog의 두 핵심 데이터 타입 - 연속 연결을 위한 `wire`와 procedural 저장을 위한 `reg` - 그리고 둘 사이에서 항상 선택할 수 있는 규칙.
- Vector와 Array`[7:0]`로 멀티 비트 신호를 선언하고 슬라이스하고 결합하는 방법, 그리고 packed vector와 memory array의 차이.
- Parameter`parameter`와 `localparam`으로 컴파일 시점 상수를 정의하고, 너비와 깊이를 매개변수화하며, 모듈 인스턴스화 시 값을 오버라이드하는 방법.
- Number LiteralVerilog의 상수 표기법: sized vs unsized, `'b` `'h` `'d` `'o` base, 부호 있는 숫자, 가독성을 위한 underscore, 그리고 초보자를 무는 함정들.
- X와 Z 값Verilog 신호는 2개가 아니라 4개의 가능한 값을 가집니다. `x`(unknown)와 `z`(high-impedance)가 시뮬레이션에서 실제로 무엇을 의미하는지, 그리고 어떻게 디버그할지 알아봅니다.
연산자
모듈과 구조
- Module Port모듈 포트(input, output, inout)를 선언하는 방법, ANSI 스타일 포트 목록, 그리고 output이 wire여야 하는지 reg여야 하는지의 판단 기준.
- Module Instantiation모듈을 다른 모듈 안에서 인스턴스화하는 방법, named와 positional 포트 연결의 차이, 그리고 실제 설계를 만들 때 쓰는 다중 인스턴스 패턴들.
- Continuous Assignment`assign`이 어떻게 동작하는지 - 그것이 기술하는 항상 참인 관계, 무엇을 구동할 수 있고 없는지, 그리고 procedural 코드와 비교해 어떤 패턴에 빛을 발하는지.
절차적 블록
- Always 블록`always` 블록이 어떻게 동작하는지, 조합 `always @(*)`와 clocked `always @(posedge clk)`의 차이, 그리고 각각이 어떤 하드웨어를 만드는지 결정하는 규칙.
- Initial 블록`initial` 블록이 `always`와 어떻게 다른지, 왜 시뮬레이션 전용인지, 그리고 자극, waveform 설정, 로그 헤더 등 그것이 쓰이는 흔한 패턴들.
- Blocking vs Non-blocking초보 Verilog에서 가장 헷갈리는 주제. `always` 블록 안에서 `=`와 `<=`가 실제로 무엇을 의미하는지, 그리고 대부분의 race condition을 막아 주는 규칙.
제어 흐름
- If-Else`always` 블록 안에서 `if`/`else`가 어떻게 동작하는지, 초보자를 잡는 latch 함정, 그리고 `else if` 체인이 만들어 내는 priority encoder 하드웨어.
- Case 문깔끔한 다중 분기 디코딩을 위한 `case`의 동작 방식, 절대 빠뜨리면 안 되는 `default`, 그리고 `case`, `casex`, `casez`의 차이.
- For 루프Verilog의 `for` 루프가 소프트웨어 사촌과 어떻게 다른지 - 런타임에 반복 실행되지 않고 synthesizer가 병렬 하드웨어로 unroll합니다.
순차 논리와 FSM
테스트벤치와 시뮬레이션
- Testbench 기초Verilog testbench 작성법 - 클럭 생성, reset 시퀀스, 자극, 관찰, 그리고 모든 시뮬레이션을 구동하는 표준 골격.
- Display와 Monitor`$display`, `$write`, `$monitor`가 어떻게 동작하는지 - 쓰게 될 format specifier, 그 차이, 그리고 각각이 맞는 도구일 때.
- Dumpfile과 VCDtestbench에 VCD 파형 출력을 추가하는 법 - `$dumpfile`, `$dumpvars`, 스코프 선택, 그리고 결과 파일을 GTKWave 또는 브라우저 에디터에서 보는 법.
- Timescale과 Delays`` `timescale `` 지시문이 어떻게 `#delay`의 단위를 설정하는지, 파일 간 서로 다른 단위 결합 규칙, 그리고 delay가 clocked logic과 상호작용하는 방식.