Объявление функции Verilog в заголовочном файле

Когда я пытаюсь скомпилировать тестовую среду, которая включает файл заголовка, содержащий объявление функции, Icarus Verilog (стабильная версия 10.0) прерывает работу со следующей ошибкой:

mpeg.vh:133: error: function declarations must be contained within a module.

Эта ошибка вполне очевидна. Однако на самом деле файл заголовка включен внутри модуля (тестовой среды). Поскольку директиву include следует просто заменить текстом внутри соответствующего файла заголовка, объявление функции фактически содержится в модуле (вопреки утверждениям в сообщении об ошибке). Я использовал этот заголовочный файл раньше с Xilinx ISE (fuse / isim), который работал так, как задумано. Даже предупреждения не было.

Можно ли объявить функцию внутри файла заголовка (для последующего включения внутри модуля)?

Мне не удалось найти ответ на этот вопрос в Verilog LRM (IEEE 1364-2001, глава 10).

Пример:

test.vh:

function integer foo;
  input integer a;
begin
  foo = a;
end
endfunction

test.v:

module bar;
`include "test.vh"
endmodule

Позвоните в iverilog: iverilog -o test.o -Wall test.v test.vh


person andrsmllr    schedule 20.02.2016    source источник
comment
Похоже на проблему с инструментом. Часто я предпочитаю держать функцию clog2 в общей зоне. У вас есть обновленная версия iverilog?   -  person rahulcodesinverilog    schedule 20.02.2016
comment
При вызове только препроцессора с iverilog -E -o test.o -Wall test.v test.vh предварительно обработанный вывод показывает, что файл заголовка фактически включен дважды: один раз внутри модуля, где находится директива `include, и еще раз после endmodule. Итак, моя ошибка здесь, похоже, заключается в том, что test.vh включен в командную строку. Удаление test.vh из списка исходных файлов при вызове iverilog устраняет ошибку. Тем не менее, первоначальный вопрос о допустимой области для объявления функции остается.   -  person andrsmllr    schedule 20.02.2016
comment
Я думаю, ты хочешь iverilog -o test.o -Wall test.v (без test.vh). Файл test.vh включен в `включенный оператор   -  person Greg    schedule 20.02.2016
comment
Я предполагаю, что есть проблема, связанная с `include, поскольку это обычная практика, которой придерживаются во всей отрасли (определение функций в другом файле)   -  person Karan Shah    schedule 21.02.2016


Ответы (1)


В старом стандарте Verilog ничего не разрешается за пределами пары module/endmodule. Директивы компилятора (вещи, начинающиеся с `) являются исключением, потому что они предварительно обрабатываются перед любым другим синтаксисом.

В SystemVerilog добавлена ​​концепция модуля компиляции, которая позволяет коду существовать вне области видимости модуля. . Но он также добавил пакеты, которые можно импортировать вместо «включенных», чтобы избавиться от проблема наличия функции, умноженной на определенную, когда вы выбираете одну из них.

person dave_59    schedule 20.02.2016
comment
Что вы считаете старым стандартом Verilog? Все до СВ? - person andrsmllr; 22.02.2016
comment
Старый стандарт - это любой стандарт, который был отменен другим стандартом. - person dave_59; 22.02.2016
comment
Ну, тогда есть пара тех старых стандартов :-) Но я понимаю вашу точку зрения. - person andrsmllr; 23.02.2016