2016-11-08 23 views
1

Этот вопрос касается макросов системы verilog.
У меня есть модуль верхнего модуля, подмодуль и суб-модуль. суб-модуль, созданный в субмодуле, созданный в верхнем модуле.Сфера действия `define macros

Если я определяю макрос `define abc в модуле югу, будет код, написанный в `ifndef abc компилируется в модуль верхнего модуля/суб-суб

ответ

0

Если вы не используете +define+... в вашей команде компиляции, макрос define вступают в силу в зависимости от порядка компиляции. Как только он будет скомпилирован, он будет принят любой последующей строкой кодов или файлов до тех пор, пока не будет выполнено соответствующее значение undef.

Скажите, в вашем случае, порядок компиляции: subsub.v, sub.v, top.v (согласно имени вашего модуля).

Предполагая, что define abc находится на первой линии sub.v, этот abc эффективен в любой последующей строке sub.v, а также оставшийся файл, который в данном случае является top.v, но не subsub.v.

Чтобы ответить на ваш вопрос, любые коды в пределах ifndef abc в top.v НЕ будут скомпилированы. С другой стороны, ifndef abc в subsub.v будет скомпилирован.

Example here

2

Объем `define макросов и большинство других директив компилятора является блокомсборника. Блок компиляции представляет собой поток исходного текста, который анализирует компилятор. Макрос определяется в точке, которая появляется в блоке компиляции и видна с этого момента.

Области, определенные модулями и другими пространствами имен, не имеют значения, поскольку макросы предварительно обработаны до того, как распознается синтаксис Verilog или SystemVerilog. Это означает, что у вас никогда не может быть конкретного управления макросами.

Существует различие между тем, как Verilog и SystemVerilog определяют блок компиляции.

В Verilog каждый блок компиляции является этапом компиляции или одним вызовом инструмента, который компилирует исходный код. Некоторые инструменты имеют только один шаг компиляции, требующий, чтобы вы скомпилировали весь исходный код за один шаг. Другие инструменты (например, Modelsim) позволяют вам скомпилировать ваш код отдельными шагами. A `define макрос на одном этапе компиляции не виден ни в каких других этапах компиляции, если вы не переформулируете его.

SystemVerilog добавляет возможность обрабатывать каждый файл в командной строке компилятора как отдельный блок компиляции. Это необходимо, потому что SystemVerilog позволяет вам определять такие вещи, как typedefs и функции вне модуля. Сохранение каждого файла отдельным модулем компиляции предотвращает коллизии имен. (Это поведение единицы компиляции одинаково в C/C++).

Из-за того, что люди смешивают устаревший код Verilog с SystemVerilog, некоторые инструменты позволяют вам выбирать поведение Verilog или SystemVerilog модуля компиляции.