在头文件中声明 Verilog 函数

Posted

技术标签:

【中文标题】在头文件中声明 Verilog 函数【英文标题】:Declaration of a Verilog function in a header file 【发布时间】:2016-02-20 11:13:08 【问题描述】:

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

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

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

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

我无法在 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

【问题讨论】:

似乎是工具问题。很多时候,我更喜欢将 clog2 功能保留在公共区域。你有更新版本的iverilog吗? 当仅使用iverilog -E -o test.o -Wall test.v test.vh 调用预处理器时,预处理后的输出显示头文件实际上被“包含”了两次,一次是在`include 指令所在的模块内,一次是在@987654327 之后@。所以我的错误似乎是在命令行中包含了 test.vh 。在调用iverilog 时从源文件列表中删除test.vh 会使错误消失。然而,关于函数声明的有效范围的原始问题仍然存在。 我想你想要iverilog -o test.o -Wall test.v(没有test.vh)。 test.vh 文件包含在 `included 语句中 我猜,存在与 `include 相关的问题,因为这是整个行业遵循的正常做法(在其他文件中定义函数) 【参考方案1】:

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

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

【讨论】:

您认为“旧”的 Verilog 标准是什么? SV 之前的一切? “旧”标准是已被其他标准淘汰的任何标准。 那么有几个“旧”标准 :-) 但我明白你的意思。

以上是关于在头文件中声明 Verilog 函数的主要内容,如果未能解决你的问题,请参考以下文章

C++头文件中声明类的小问题

避免在类头文件中声明私有函数 (C++)

c语言在头文件中如何引用另一个头文件中的函数

c语言中,如何在头文件中调用某个源文件的函数??

不要在头文件中写函数定义

为啥在头文件中声明并在文件中定义会给出多个定义错误?