头文件中的Verilog函数声明

时间:2016-02-20 11:13:08

标签: verilog system-verilog xilinx iverilog

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

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

1 个答案:

答案 0 :(得分:2)

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

SystemVerilog添加了compilation unit的概念,它允许代码存在于范围之外的模块中。但是它还添加了可以imported instead of `included的包来解决当你使用其中一个函数时多次定义函数的问题。