我为一些用 System Verilog 编写的硬件开发了一个用 C++ 编写的高级模拟器。
System Verilog 代码包括许多只包含逻辑的函数(即,没有任何耗时,没有触发器)。我想在我的 C++ 模拟器中重用这段代码。
有没有办法通过以下方式在 C++(或 C,很容易链接到 C++)中重用这些函数:
- 在编译之前将系统 Verilog 转换为 C/C++?
- 将系统 Verilog 编译为 C/C++ 可调用的函数?
- 还有什么办法吗?
我为一些用 System Verilog 编写的硬件开发了一个用 C++ 编写的高级模拟器。
System Verilog 代码包括许多只包含逻辑的函数(即,没有任何耗时,没有触发器)。我想在我的 C++ 模拟器中重用这段代码。
有没有办法通过以下方式在 C++(或 C,很容易链接到 C++)中重用这些函数:
通常这种集成是在另一个方向上完成的,这意味着从 Verilog 调用 C/C++ 例程。当然,这只对验证组件有意义,显然无法合成。最有可能做您想做的事情的环境是 SystemC/Verilog 联合仿真,但这意味着使用 Verilog 模拟器(您明确不想要)和使用 SystemC 的 C 模型。
寻求高性能的模拟器通常会生成 C 或本机代码。我不知道有什么方法可以从 VCS(我最熟悉的模拟器)中生成的代码中提取特定功能,但可以使用其中一个开源模拟器来做到这一点。任何商业(即许可)模拟器都不太可能支持生成无需许可即可运行的代码。我不确定您是否希望使用独立于模拟器的 Verilog 功能是由许可、运行时开销、工具安装负担或其他完全驱动的。
我假设您不维护 SystemVerilog 例程,因此可能无法更改它们的实现方式。但是,如果可能的话,当 C 和 Verilog 都需要功能时,一种常见的策略是编写代码生成器,可以将单个定义转换为 C 和 Verilog 实现。
另一个更深奥的可能性是 SystemC 综合。它相对较新,我没有使用它的经验,但是如果您可以使用这些工具并且它们适用于您的功能,那么它将允许您将 C 实现重用于 C 模型、硬件仿真和综合。
快速搜索带来了Verilog2C++和Verilator。我没有使用过这些程序;你需要自己尝试一下。
如果您有一个底层 SV/Verilog 模拟器(例如免费的 à la Icarus/CVC),那么您可以使用 DPI。其他人可以尝试 Verilator——我猜它更像是 Verilog/V2K 而不是 SV,也许你可以将你的 SV 代码映射到 Verilog?
Verilator 是一个很好的工具。基本上 Verilator 可以将您的设计编译为 C++ 类,它代表您的顶级模块。然后,您可以通过在自定义 C++ 代码中驱动和刺激 C++ 类来模拟设计。
Verilator 还支持 DPI 接口,这意味着您可以将 Verilog 函数/任务导出为 C++ 函数,并导入 C++ 函数以在 Verilog 代码中使用。
关于验证器和 DPI,您可能想看看我是如何评估它的:
“...为了练习 cpp (c++) 验证平台,使用系统 verilog DPI,使用 verilog DUT,我决定下载 verilator 并做一些自学练习。
首先我安装了软件。这在 debian 机器上相当简单:apt-get install verilator..." http://bknpk.ddns.net/my_web/SystemC_MyFirst/verilator_my_first.html