是否可以在VHDL或Verilog中进行交互式用户输入和输出模拟?

时间:2016-06-29 19:13:38

标签: vhdl verilog riscv

例如,我想为没有FPGA的交互式游戏运行模拟:https://github.com/fabioperez/space-invaders-vhdl,这样:

  • 信号由键盘键设置
  • 输出可以显示在窗口

http://www.nand2tetris.org/会这样做,但会使用简化的自定义教育语言。

VHDL textio的{​​{1}}和read(input有点接近但不完全:

  • write(output等待换行符,我们想要一些可以检测的是键盘键是否被按下
  • read(input:需要一些方法来刷新数据,以确保将模拟显示器的渲染器获取它
  • 我们需要某种方法来节省模拟速度

当然,我不需要用VHDL做任何事情:我只需要一种与其他程序同步与VHDL通信的最小方式,然后我就可以做到这一点。在C中用SDL显示。

还问:https://github.com/tgingold/ghdl/issues/92

严肃的应用:在硬件CPU仿真之上运行交互式Linux内核+ BusyBox,例如: https://github.com/lowRISC/lowrisc-chip(使用verilator)该项目目前仅使用功能模拟器进行交互式模拟(读取ISA程序集并模拟其高级功能),并且仅进行非交互式Verilog硬件单元测试。

3 个答案:

答案 0 :(得分:6)

Verilator 是此应用程序的完美解决方案。

它将Verilog模拟循环暴露给C ++(并将Verilog转换为C ++),允许您设置输入,并从C ++获取输出。

请参阅文档中的“连接到C ++”示例:http://www.veripool.org/projects/verilator/wiki/Manual-verilator

所以你可以在没有任何IPC的情况下将其插入SDL / ncurses /等。

对于独立于模拟器的解决方案,可能值得研究VHDL(VHPI)/ Verilog(DPI)的外语API,如上所述in this comment,但是很少有如何使用的示例那些,你将不得不担心IPC。

最小可运行示例:https://github.com/cirosantilli/rtl-cheat/tree/4e3289704ae5e2aa64170cbca756a3d46bbfa19d/interactive

enter image description here enter image description here

在Verilator + SDL中实现nand2tetris的相关项目可在以下位置找到:https://hackaday.io/project/160865-nand2tetris-in-verilog-part3-verilator-and-sdl2

答案 1 :(得分:3)

Connectal将在实际CPU上运行的软件连接到FPGA或模拟器上的RTL(BSV,可以链接到VHDL和Verilog)。 BSV免费用于学术和研究用途以及开源项目。在任何情况下,Connectal都是开源的,模拟器连接的软件使用SystemVerilog DPI,您可以在项目中使用它而不使用BSV。

Connectal有一个显示FGPA /模拟器输出的示例。它使用Qt在模拟时显示在计算机显示器上。从FPGA直接显示在HDMI显示器上。

用Verilog或VHDL模拟的CPU往往太慢而无法进行交互式使用,但我已将使用qemu模拟的CPU连接到verilator或FPGA上的设备或加速器。 qemu的表现相当不错。我认为它适用于您的目的。

我添加了一个插件FgpaOps API,以便模拟器或FPGA可以处理CPU加载/存储指令:

struct FpgaOps {
    uint64_t (*read)(hwaddr addr);
    void (*write)(hwaddr addr, uint64_t value);
    void (*close)(void);
    void *(*alloc_mem)(size_t size);
};

就我而言,我使用connectal来实现FpgaOps插件。此代码在hw / riscv下,但不是特定于riscv,因此它可以与qemu支持的任何处理器体系结构一起使用。

答案 2 :(得分:0)

只要您愿意模拟像 UART 这样的真实硬件接口,就不需要任何太聪明或定制的东西来与您的 Sim 交互。

我的 TTL CPU 的 Verilog 模拟包括一个(合理)准确的 UM245R UART 模型,并且 UART 支持通过 verilog 文件接口的交互式 IO。 一个文件用于输入,另一个用于输出;双向。

我使用它与模拟硬件进行交互,以便我可以开发软件并通过自动化测试对其进行测试,而不必弄乱硬件。 我什至在模拟硬件上运行 CHIP8 游戏,通过将控制代码从 UART 发送回图形终端来绘制 CHIP8 GUI。

UART 在这里... https://github.com/Johnlon/spam-1/blob/master/verilog/uart/um245r.v
有时间我会写一篇文章。