Документация по Verilog
Краткий справочник по Verilog с примерами. Прочитай концепцию, посмотри код, а затем потренируйся в курсе Coddy.
Начать пошаговый курс по VerilogПервые шаги
- Что такое Verilog?Простое введение в Verilog: что это такое, для чего он нужен, чем отличается от обычного языка программирования и почему разработчики цифровых схем продолжают использовать его уже 40 лет.
- Hardware vs SoftwareПочему Verilog кажется дезориентирующим после софтовых языков: параллельность по умолчанию, время как первоклассное понятие и операторы, которые выполняются не по порядку.
- Установка VerilogУстановка Icarus Verilog и GTKWave, чтобы компилировать и симулировать Verilog локально. Или пропусти установку и используй редактор в браузере - для этих документов работает и то, и то.
- Первый moduleНапиши свой первый полный module на Verilog с нуля - объявление, ports, кусок комбинационной логики и testbench, который его дёргает. Запускается прямо в браузере.
- КомментарииКак писать однострочные и многострочные комментарии в Verilog, плюс паттерны документирования, которые цифровые разработчики используют, чтобы модули оставались читаемыми по мере роста.
Типы данных и числа
- Wire и RegДва главных типа данных в Verilog - `wire` для непрерывных соединений и `reg` для процедурного хранилища - и правило, как выбирать между ними каждый раз.
- Векторы и массивыКак объявлять многобитные сигналы через `[7:0]`, нарезать их, объединять и в чём разница между packed-вектором и memory-массивом.
- ParametersКак использовать `parameter` и `localparam` для задания compile-time констант, параметризации ширин и глубин и override значений при instantiation module.
- Числовые литералыКак Verilog записывает константы: sized vs unsized, базы `'b` `'h` `'d` `'o`, знаковые числа, подчёркивания для читаемости и засады, которые ловят новичков.
- Значения X и ZУ сигналов Verilog четыре возможных значения, а не два. Что на самом деле значат `x` (unknown) и `z` (high-impedance) в симуляции, и как их отлаживать.
Операторы
- ОператорыБазовые операторы в Verilog - арифметика, сравнение, логические и conditional `?:` - с правилами и засадами по разной ширине и signedness.
- Bitwise & ReductionBit-level операторы Verilog - побитовые AND/OR/XOR, инвертирующие формы и reduction-операторы, которые схлопывают весь вектор в один бит.
- Concatenation & ReplicationКак склеивать сигналы через `{}` и копировать паттерн N раз через `{N{...}}` - незаменимые операторы Verilog для построения широких шин из кусочков.
Модули и структура
- Module PortsКак объявлять ports module - input, output и inout - ANSI-стиль port list и когда output должен быть `wire`, а когда `reg`.
- Module InstantiationКак инстанцировать один module внутри другого, разница между именованными и позиционными соединениями ports и паттерны нескольких instance, которые ты будешь использовать в реальных проектах.
- Continuous AssignmentКак работает `assign` - отношение, истинное всегда, что он может и не может приводить, и паттерны, в которых он блистает по сравнению с процедурным кодом.
Процедурные блоки
- Always BlockКак работают `always`-блоки, разница между комбинационным `always @(*)` и тактируемым `always @(posedge clk)` и правила, которые решают, какое железо получится.
- Initial BlockЧем `initial`-блоки отличаются от `always`, почему они существуют только в симуляции, и частые паттерны - стимулы, настройка waveform, заголовки логов - для которых их используют.
- Blocking vs Non-blockingСамая путающая тема для новичков в Verilog. Что на самом деле значат `=` и `<=` внутри `always`-блока и правило, предотвращающее большинство race conditions.
Поток управления
- If-ElseКак работает `if`/`else` внутри `always`-блока, latch-ловушка, в которую попадают новички, и priority-encoder-железо, которое получается из цепочек `else if`.
- Case StatementКак работает `case` для чистого multi-way декодирования, `default`, который никогда не стоит пропускать, и различия между `case`, `casex` и `casez`.
- For LoopsЧем `for`-циклы Verilog отличаются от софтовых родственников - синтезатор разворачивает их в параллельное железо, а не выполняет итеративно в runtime.
Последовательная логика и КА
- Clocked LogicКак строить регистры, счётчики, shift-регистры и pipelines из тактируемых `always`-блоков - рабочая лошадка любого синхронного цифрового проекта.
- Finite State MachinesКак писать Verilog FSM так, как делают профи: тактируемый state-регистр, комбинационный блок next-state и чистое разделение, которое легко читать и синтезировать.
Тестбенчи и моделирование
- Testbench BasicsКак написать Verilog-testbench - генерация clock, reset-последовательность, стимулы, наблюдение и стандартный скелет, который ведёт каждую симуляцию.
- Display & MonitorКак работают `$display`, `$write` и `$monitor` - format specifiers, разница между ними и когда какой инструмент правильный.
- Dumpfile & VCDКак добавить VCD-вывод waveform в testbench - `$dumpfile`, `$dumpvars`, выбор scope и как смотреть получившийся файл в GTKWave или редакторе в браузере.
- Timescale & DelaysКак директива `` `timescale `` задаёт единицу `#delay`, правила комбинирования разных единиц через файлы и как задержки взаимодействуют с тактируемой логикой.