Грабли препроцессора Verilog HDL

Небольшая заметка о том, как работают include и define в Verilog HDL.   Вопреки ожиданиям, они работают совершенно иначе, чем в большинства языков программирования. В маленьком проекте с этим можно не столкнуться, но в более или менее большом проекте, где есть лицензированные/скаченные с OpenCores блоки от этого поведения можно очень больно огрести. (Я долго искал подходящую картинку, но лучше этой не нашел)

TL;DR: Определенные однажды макросы глобальны, и передаются из одного файла в другой в том порядке, в котором файлы передаются компилятору/синтезатору.

(далее…)