您可以将 Modelsim 测试台与外部刺激连接吗

电器工程 视频文件 模拟 模型模拟
2022-01-08 03:40:28

我正在一个同时进行驱动程序软件和 FPGA 开发的团队工作。FPGA 仿真是在 Modelsim 中完成的,驱动软件是用 C 语言编写的。为了最大限度地降低集成风险,我希望能够在将产品放在硬件上之前对产品的两部分之间的交互进行建模。

我知道 Modelsim 支持一个测试平台,它可以让您以文本文件的形式提供刺激,其中包含要输入的时间和值。我想知道 Modelsim 是否具有允许您将管道连接到外部应用程序(例如我们的驱动程序)的模式,并运行一种分布式模拟,其中软件可以将值推送到测试台中,然后稍后观察结果.

我无法使用文本文件输入的技巧是让产品的两半进行交互。我需要让软件将值“写入”到 FPGA 模拟器中,读取结果,然后将新值写入 FPGA,这取决于它读取的结果。文本文件要求输入独立于输出。

我已经在 StackExchange 和 google 上进行了搜索,但是我无法提出一组关键字来缩小我的搜索范围,以识别我正在寻找的行为,或者确定它不存在。

2个回答

通过 Unix 命名管道对 ModelSim 仿真进行外部控制

摘要:在本论文中,我们提出了一种通过外部程序控制 ModelSim 仿真的方法。ModelSim 和外部程序之间的通信是通过使用命名管道(“FIFO”)完成的,命名管道在每个应用程序中显示为普通文件。使用 FIFO 与使用普通文件进行进程间通信 (IPC) 的主要区别在于,尝试写入 FIFO 的应用程序会暂停,直到另一个应用程序尝试从 FIFO 读取,反之亦然。这提高了 IPC 的可靠性。这种方法的主要优点是 1) 由于只使用通用文件操作,因此外部应用程序几乎可以用任何编程语言编写;2)它使验证工程师能够以最少的重写重用标准验证软件包;3) 通过让多个被测设备 (DUT) 相互通信,可以创建更准确的最终系统仿真;4) 即使 ModelSim 的仿真引擎不是多线程的,在单系统映像 (SSI) 集群或多处理器计算机上也可以轻松提高整体仿真的性能。由于其为行为 VHDL 实现文件输入/输出 (I/O),ModelSim 无法直接读取或写入这些 FIFO。使用 ModelSim 的外语界面 (FLI) 演示了此限制的解决方法。本文还展示了该方法的一个工作示例,该方法用于验证 VHDL 中的下一代浮点例程。具体来说,开源的 IEEE Compliance Checker 软件包,它是用 C++ 编写的,

FIFO 需要外部编程接口的问题是 VHDL 文件 I/O 在数据可用之前无法优雅地处理阻塞。

不幸的是,该论文在网络上不可用。

Model Sim ® 外语界面版本 5.6d,PDF 3.4 MB。

在 Linux x86 平台上使用 ModelSim 外语接口进行 c – VHDL 协同仿真和模拟器控制 Andre Pool - fli@andrepool.com - 1.5 版 - 创建于 2012 年 11 月,最后更新于 2013 年 9 月,PDF,320KB(从未提及 FIFO) .

在 Linux x86 平台(匹配的 github 代码库)上使用 ModelSim 外语接口进行 c – VHDL 协同仿真和模拟器控制。

还有一点开源,使用 ghdl 中的 VHPI Foreign 函数调用: vhdl/src/sim/ghdlex_mein at master·texane/vhdl·GitHub

看起来像是 Martin Strubel 在 GHDL_discuss 列表上的更新: http ://www.section5.ch/downloads/ghdlex-0.051.tgz显示 fifo.c 的日期为 2014 年 4 月 14 日。

根据定义,FLI 会将您锁定在 Modelsim 中,不确定他们的 VHPI 支持状态(这是 IEEE Std 1076-2008,VHDL LRM 的一部分)。

通过提供速率缓冲,使用套接字或文件 FIFO 允许软件和硬件进程以不同的速率运行。如果您的软件系统比硬件模拟快几个数量级(通常是这样),这并不总是必要的。

努力为 VHDL 提供 UNIX (POSIX) 功能,请参阅Public Domain VHDL packages,其中包含指向早期论文SNUG San Jose 2002 1 C/UNIX Functions for VHDL Testbenches C/UNIX Functions for VHDL Testbenches以及幻灯片的指针设置有关 Unix 管道和 rsh 的附加说明这显示了如何保持命名管道打开。所有的 VHDL 代码也可以下载。我认为这将导致实现目标的最简单方法。

那么 Modelsim 是否有一些原生的东西可以让你连接到管道上呢?可能不会,在 Windows 下更是如此。可以做到吗?是的,但这条路不适合胆小的人。您可以死锁一端或另一端,或者可能两者都在等待数据可用性。

理论上,外部编程接口允许您为“管道”的一端或另一端生成子进程,这也意味着您可以使用共享内存模型在两端之间进行通信。

你可能想看看Cocotb它是一个基于 Python 的协同仿真库,设计目标之一是启用您描述的方法,轻松模拟未修改的生产软件和 RTL。

ping存储库中有一个针对模拟运行未修改命令的示例和一个遍历代码的教程。

对于用户空间驱动程序、配置实用程序等,您有几个选项可以在未修改的情况下运行您的软件:

  1. 如果您对设备的访问归结为几个功能(例如读取和写入调用),您可以链接到模拟库,该库在执行对模拟的访问时会阻塞。这非常适合配置。

  2. 如果您的软件使用内存映射 IO 并取消引用指针来访问设备,那么事情会变得稍微复杂一些 - 您必须创建一个共享内存区域,并设置保护位和陷阱访问

如果您使用网络,则可以使用 TUN/TAP 等虚拟接口(参见上面提到的教程),我怀疑 USB 传输或其他常见主机接口可能有类似的选项。

Cocotb 与各种模拟器和 VHDL(通过 VHPI)或 Verilog/SystemVerilog 设计(通过 VPI)一起工作。不幸的是,Modelsim 没有实现 VHPI,所以作为一个 VHDL 用户,你会被 FLI 困住,它几乎不像接口那么有用。您可以向 Mentor抱怨,试图说服他们实现行业标准接口,或者您可以评估另一个支持 VHPI 的模拟器。

可悲的是,似乎工具供应商一般对 VHDL 市场并不特别感兴趣,从他们实现任何 VHDL 相关功能所花费的时间来看......

免责声明:我是一名 Cocotb 开发人员。