我最近所做的是在模拟环境和主机系统之间创建一个接口。不同的 hdl 模拟器有不同的接口,让模拟器不以批处理模式思考,传统的模拟模型,而是像真正的设计一样永远运行是问题的一半。
然后从使用 C(或其他)的主机上,您可以创建抽象,这些抽象可能允许也可能不允许您为任何目标编写应用程序软件(取决于您拥有的语言和编译器功能)。例如,您可以制作一个通用的 poke 和 peek 函数,并在最终目标上拥有那些实际 poke 和 peek 内存或 I/O,但是对于通过抽象进行的模拟,您可以与模拟相同内存周期的模拟测试台对话。
我更进一步,在主机和测试台之间使用了(Berkeley)套接字,这样模拟可以在主机应用程序停止和启动时继续运行。与拥有一个带有操作系统的真实处理器不同,您正在启动应用程序并运行它们以完成并启动另一个。至少对于测试应用程序,对于交付,您可能只有一个应用程序。
通过创建这些抽象层,我可以编写真正的应用程序,这些应用程序将在构建目标时使用。在此过程中,您最初可以使用逻辑的软件模拟,然后如果您喜欢使用抽象接口(丢弃逻辑)构建一个 fpga,例如说一个 uart。用 uart 接口或其他方式替换应用程序抽象层和模拟器之间的 shim。然后,当您将处理器和逻辑结合在同一个芯片或同一个板上时,再次用直接调用他们一直在与之交谈的任何接口替换抽象层。如果出现问题并且您保留了抽象层,您可以将应用程序带回仿真模型并访问所有内部逻辑。
特别是这一次,我使用的是 sourceforge 上的 hdl 语言循环 cdl,文档需要一些帮助,但示例可能会让你继续前进,它会产生可合成的 verilog,所以你会在那里获得额外的胜利。除了连接和启动 C 仿真模型所需的最低限度之外,我扔掉了所有脚本批处理的东西。所以我的测试台是用 C 语言(从技术上讲是 C++),套接字层是在那里完成的。输出可以是 gtkwave 使用的 .vcd 文件。基本上,您可以使用没有许可证等的开源软件来完成大部分 HDL 设计。通过向 CDL 仿真部分添加一两行代码,我可以让它作为无限循环运行,我可以说它有效很好,似乎没有任何内存泄漏等。
modelsim 和 cadence 都有将宿主 C 程序连接到仿真世界的标准化方法,从那里您可以使用 IPC 来访问与抽象层 api 对话的宿主应用程序。
这对于一张照片来说可能有点矫枉过正,无论如何,我已经放弃了照片,以获得更快和基于 C 的基于手臂的 micros。有/曾经有一个开放的核心图片,您可以简单地将其合并到您的模拟中,即使这不是您在这里想要做的。