Systemverilog: макрос подстановки текста

Я читал, что макросы подстановки текста имеют глобальную область действия в «verilog». Как работает SystemVerilog? Я хочу использовать 2 разных определения одного и того же текстового макроса в 2 разных файлах SystemVerilog — это нормально?


person user2292757    schedule 20.04.2013    source источник


Ответы (2)


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

Точный механизм определения того, какие файлы составляют единицу компиляции, зависит от инструмента. Однако совместимые инструменты должны предоставлять модели использования, которые допускают оба следующих случая:

а) Все файлы в данной командной строке компиляции составляют единую единицу компиляции (в этом случае объявления в этих файлах доступны в соответствии с обычными правилами видимости для всего набора файлов).

б) Каждый файл является отдельной единицей компиляции (в этом случае объявления в каждой области видимости единицы компиляции доступны только в соответствующем файле).

Поэтому, если вы используете многофайловые единицы компиляции (-mfcu для Modelsim), возникнут коллизии, поскольку пространство имен макросов будет иметь глобальную область действия. Однако спецификация явно разрешает переопределение, поэтому в этом случае вы можете не получить ошибку (или предупреждение), если только ваш инструмент не поддерживает это.

Пространство имен текстового макроса является глобальным в пределах единицы компиляции. Поскольку имена текстовых макросов вводятся и используются с начальным символом ‘, они остаются однозначными с любым другим пространством имен. Имена текстовых макросов определяются в линейном порядке появления в наборе входных файлов, составляющих единицу компиляции. Последующие определения с тем же именем переопределяют предыдущие определения баланса входных файлов.

В зависимости от того, как вы используете макросы, вы можете рассмотреть возможность использования вместо них параметров. Параметры — это, по существу, константы, область действия которых более ограничена, чем директивы препроцессора. Их также можно использовать для выборочного экземпляра кода с использованием конструкций генерации.

Вы можете бесплатно получить спецификацию SV здесь.

person Community    schedule 20.04.2013
comment
Спасибо за подробный ответ. Я думаю, что код с выборочным экземпляром, использующий подход параметр/генерировать, должен быть синтаксически полным, чтобы избежать ошибки компиляции. Но с текстовыми макросами это может быть фрагмент, который будет компилироваться только при использовании в соответствующем контексте. Это способность, которая мне нужна. - person user2292757; 21.04.2013

Если желаемый макрос имеет похожую структуру/формат, то вы можете использовать макрос с аргументами. См. IEEE1800-2012, раздел 22.5.1.

`define myMacro(arg1,arg2) \
    prefix_``arg1 = arg2``_postfix 

Если нужное определение макроса находится исключительно в своем уважаемом файле и уникально, то можно сделать следующее. Все остальные файлы не будут иметь `mymacro, который можно было бы вызвать. `undef взят из Verilog, IEEE1364-1995, раздел 16.3.2, и включен в SystemVerilog. Вы можете прочитать больше о `undef в последней редакции; IEEE1800-2012, раздел 22.5.2.

файл1.sv:

`define mymacro abcd
/* SystemVerilog code */
`undef mymacro

файл2.sv:

`define mymacro wxyz
/* SystemVerilog code */
`undef mymacro
person Greg    schedule 23.04.2013