Когда я пытаюсь скомпилировать тестовую среду, которая включает файл заголовка, содержащий объявление функции, 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
iverilog -E -o test.o -Wall test.v test.vh
предварительно обработанный вывод показывает, что файл заголовка фактически включен дважды: один раз внутри модуля, где находится директива`include
, и еще раз послеendmodule
. Итак, моя ошибка здесь, похоже, заключается в том, что test.vh включен в командную строку. Удаление test.vh из списка исходных файлов при вызове iverilog устраняет ошибку. Тем не менее, первоначальный вопрос о допустимой области для объявления функции остается. - person andrsmllr   schedule 20.02.2016iverilog -o test.o -Wall test.v
(без test.vh). Файл test.vh включен в `включенный оператор - person Greg   schedule 20.02.2016