【问题标题】:Testing VHDL / FPGA Using Python and A Simulator [closed]使用 Python 和模拟器测试 VHDL / FPGA [关闭]
【发布时间】:2026-01-02 04:15:01
【问题描述】:

测试VHDL 代码逻辑的标准方法是用VHDL 编写测试平台并使用类似ModelSim 的模拟器;我已经做过很多次了。

我听说工程师现在不再使用 VHDL 编写测试平台,而是使用 Python 来测试 VHDL 代码。

问题:

  1. 这是怎么做到的?

    • 这是通过在 Python 中编写测试平台然后编译此 Python 文件或链接到 Modelsim 来完成的吗?
    • 这是否在 Python 中使用 myHDL 之类的模块完成,然后将 VHDL 文件链接/导入到 Python 中?是这样,时序图是怎么生成的?
  2. 在 Python 中编写测试平台时,您可以使用标准 Python 编码/模块还是只使用 myHDL 之类的模块?

    • 例如,如果我想在 VHDL 中测试 TCP/IP 堆栈,我可以使用 Python 中的套接字模块来执行此操作(即导入套接字)吗?
  3. 是否有说明如何执行此操作的参考资料、论文或教程?我检查了 Xilinx、Altera 和 Modelsim 网站,但没有找到任何东西。

我在网上找到的关于将 Python 用于 FPGA 的唯一信息是一些软件包:其中 myHDL 被引用最多。

【问题讨论】:

标签: python testing vhdl fpga modelsim


【解决方案1】:

为什么 Python 对此有好处

Python 是一种用于在测试平台中编写参考模型或处理和验证测试平台输出文件的高效语言。与在 VHDL 测试平台中相比,使用 Python 进行编程所需的时间要少得多。

Python 的一个关键特性使它如此适合自动使用大整数。如果您的 VHDL 使用 >64 位宽度,则与其他语言的接口可能会很乏味。同样在验证算术功能时,例如Python 的 Decimal 包是构建高精度引用的便捷工具。

如何做到这一点?

这是一个不依赖任何其他软件工具的示例。

与 Python 交互的一种直接实用的方法是通过输入和输出文件。您可以在 VHDL 测试平台中读取和写入文件,因为它在您的模拟器中运行。通常文件中的每一行代表一个事务。

根据您的需要,您可以让 VHDL 测试平台将您的设计输出与参考进行比较,或者将输出文件读回 Python 程序。如果使用文件花费的时间太长,至少在 Linux 中很容易设置一个带有mkfifo 的管道,您可以像使用文件一样使用它,然后您可以让您的 Python 程序和模拟器同步读取和写入.

使用标准 Python 模块

使用我描述的方法,您必须找到一种方法将模块正在执行的任何操作分离为数据流或原始事务。不幸的是,对于您的 TCP/IP 堆栈示例,我认为没有直接的方法可以做到这一点,可能需要进行大量澄清才能进一步讨论。

更多信息

上面的cmets中链接了几个有用的东西,特别是user1155120发的链接:https://electronics.stackexchange.com/questions/106784/can-you-interface-a-modelsim-testbench-with-an-external-stimuli

【讨论】:

    【解决方案2】:

    也许最好用 SystemC/myHdl/HWToolkit 等其他语言设计整个设计,然后对其进行测试,然后仅将其导出为您的目标语言。

    为了模拟 HDL 并从常规 python 代码驱动它,您必须使用 cocotb/PyCoRAM 等框架。尽管如此,它还是会很快变得复杂。

    我发现的最佳方法之一是将模拟器 + 代理与队列/抽象内存一起使用,并且在代码中仅使用此队列而不是模拟器或模型本身。它使测试平台/验证的编写变得简单。 在 python-hw word 中,只有 HWToolkit 当前使用这种方法: tx_rx_test.py

    【讨论】:

      【解决方案3】:

      您可以将 IO 从 python 写入文本文件,并使用传统的 File-IO VHDL 方法来刺激 DUT。

      但是,您最好在本地环境中使用为执行功能验证而开发的语言执行验证。使用 Systemverilog 和打包为“Questa Prime”的 Modelsim 超集(如果您可以访问它)会好得多。

      假设您希望您的 python 文件在传输函数和/或激励生成方面成为实时模拟的一部分,则需要将它们转换为共享对象文件。其他一切都是后处理,不依赖于模拟器。例如写入输出文件以供以后比较。使用共享对象文件的非本地模拟需要通过 VPI/VLI/FLI/PLI/DPI(取决于您使用的语言/工具)进行访问,这会引入跨接口来回传递内核的开销。即停止 sim、外部工作、运行 sim、停止 sim 等。

      Systemverilog (IEEE-1800) 是由 IC 设计人员为 IC 设计人员开发的,用于解决功能验证问题。虽然我完全愿意在系统工程模拟的 .so 文件方面重复使用,但如果您正在编写测试平台(您不应该编写自己的 TB,但这是另一个讨论),您最好使用 SV给定所有用于限制刺激生成、功能覆盖和通过 UCDB 报告的内置函数。

      您应该在您的 Modelsim 安装中有参考手册来描述使用编程接口。您可以在此处了解更多信息:https://verificationacademy.com/ 但是,它高度以 SV 为中心...不幸的是,VHDL 不是一种验证语言,即使它们添加了更像 SV 的附加功能,它仍然可以更好地归类为一种建模语言。

      【讨论】:

        【解决方案4】:

        查看 PyVHDL。它将 Python 和 VHDL 与具有编辑、模拟和 VCD 生成和显示功能的 Eclipse GUI 集成在一起。

        界面图片:https://i.stack.imgur.com/BvQWN.jpg

        【讨论】: