1

当我尝试编译包含头文件的测试台时,该头文件包含函数声明 Icarus Verilog (v10.0 stable) 中止并出现以下错误:

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

这个错误很明显。但是,头文件实际上包含模块(测试台)中。由于包含指令应该只替换为相应头文件中的文本,因此函数声明实际上包含在模块中(与错误消息声称的相反)。我之前曾在 Xilinx ISE (fuse/isim) 上使用过这个头文件,它的工作原理与预期一样。甚至没有警告。

是否允许在头文件中声明函数(以便以后包含模块中)?

我无法在 Verilog LRM(IEEE 1364-2001,第 10 章)中找到这个问题的答案。

例子:

测试.vh:

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

测试.v:

module bar;
`include "test.vh"
endmodule

调用iverilog:iverilog -o test.o -Wall test.v test.vh

4

1 回答 1

2

在旧的 Verilog 标准中,不允许超出对的范围module/endmodule。编译器指令(以`开头的东西)是一个例外,因为它们在任何其他语法之前被预处理。

SystemVerilog 添加了编译单元的概念,它允许代码存在于模块范围之外。但它还添加了可以导入的包而不是 `included,以消除在您使用其中一个时多次定义函数的问题。

于 2016-02-20T15:05:47.973 回答