Я читал, что макросы подстановки текста имеют глобальную область действия в «verilog». Как работает SystemVerilog? Я хочу использовать 2 разных определения одного и того же текстового макроса в 2 разных файлах SystemVerilog — это нормально?
Systemverilog: макрос подстановки текста
Ответы (2)
В SystemVerilog определения макросов ограничены областью действия единицы компиляции, но то, что это, зависит от конфигурации инструмента. Из спецификации:
Точный механизм определения того, какие файлы составляют единицу компиляции, зависит от инструмента. Однако совместимые инструменты должны предоставлять модели использования, которые допускают оба следующих случая:
а) Все файлы в данной командной строке компиляции составляют единую единицу компиляции (в этом случае объявления в этих файлах доступны в соответствии с обычными правилами видимости для всего набора файлов).
б) Каждый файл является отдельной единицей компиляции (в этом случае объявления в каждой области видимости единицы компиляции доступны только в соответствующем файле).
Поэтому, если вы используете многофайловые единицы компиляции (-mfcu
для Modelsim), возникнут коллизии, поскольку пространство имен макросов будет иметь глобальную область действия. Однако спецификация явно разрешает переопределение, поэтому в этом случае вы можете не получить ошибку (или предупреждение), если только ваш инструмент не поддерживает это.
Пространство имен текстового макроса является глобальным в пределах единицы компиляции. Поскольку имена текстовых макросов вводятся и используются с начальным символом ‘, они остаются однозначными с любым другим пространством имен. Имена текстовых макросов определяются в линейном порядке появления в наборе входных файлов, составляющих единицу компиляции. Последующие определения с тем же именем переопределяют предыдущие определения баланса входных файлов.
В зависимости от того, как вы используете макросы, вы можете рассмотреть возможность использования вместо них параметров. Параметры — это, по существу, константы, область действия которых более ограничена, чем директивы препроцессора. Их также можно использовать для выборочного экземпляра кода с использованием конструкций генерации.
Вы можете бесплатно получить спецификацию SV здесь.
Если желаемый макрос имеет похожую структуру/формат, то вы можете использовать макрос с аргументами. См. 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