глобальная константа в Verilog - PullRequest
0 голосов
/ 15 мая 2011

Я хочу создать глобальную константу, которая будет видна всем модулям.Я пробовал разные способы объявить переменную в верхнем модуле.Однако другие модули не распознают его.

В моем верхнем модуле у меня есть следующее:

`define MODELSIM 0

Когда я нахожусь в Xilinx, я установлю MODELSIM на 0. Когда я 'm в Modelsim, я установлю его на 1.

В других модулях в других файлах у меня будет следующее:

  if(MODELSIM)

, так что разные вещи будут происходить в зависимости от того,м в Моделсим или Силинкс.

Ответы [ 3 ]

4 голосов
/ 16 мая 2011

Есть несколько вещей, о которых нужно знать.Прежде всего, начнем с простого: ссылки на макросы препроцессора в verilog должны начинаться с обратного кавычки, т.е.определить MODELSIM в первом скомпилированном файле, это определение будет применяться ко всем последующим файлам.Однако я считаю, что Modelsim компилирует каждый файл в отдельном модуле компиляции, поэтому безопаснее всего создать заголовок mydesign.vh с вашими определениями макросов и `include в каждом файле verilog.`define работает на уровне исходного текста.Нет связи между `define и конкретным модулем, и нет возможности получить доступ к `define по объему.

Несколько стилистических заметок:

  1. Если выпытаются провести различие между симуляцией и синтезом, для этого стандартно используется макрос SYNTHESIS.Многие инструменты синтеза будут определять его автоматически.Будьте осторожны с тем, чтобы сделать условия обусловленными синтезом.Поскольку это намеренно приводит к тому, что ваша симуляция отличается от вашего синтезированного результата, это простой способ выстрелить себе в ногу.

  2. Для простых флагов может быть лучше использовать значения 1/ undef, а не 1/0.Определение нуля может привести к проблемам, если вы позже напишите `ifdef MACRO.

3 голосов
/ 15 мая 2011

Для синтезируемого кода не существует такой вещи, как глобальная переменная. Вы должны направлять любые такие сигналы через ваш дизайн.

2 голосов
/ 15 мая 2011

Просто добавьте к имени модуля верхнего уровня префикс.

module top;
  integer myglobalvar;
endmodule

module any;
  initial $display(top.myglobalvar);
endmodule
...