介绍(Introduction)

和往常一样, 你可以用标准仿真工具对SpinalHDL生成的VHDL/Verilog仿真。然而, 自1.0.0版本后, SpinalHDL在Scala中集成了可以直接书写testbenches并测试硬件的API。这个API有能力读写DUT信号, 分叉和汇合仿真进程, 在条件满足之前休眠并等待。因此, 使用SpinalHDL的仿真API很容易就可以用最常见的Scala单元测试(unit-test)框架集成到testbenches里。

为了能对用户定义的模块仿真, SpinalHDL用外置的HDL仿真器作为后端。当前, 可以支持一下仿真器:

  • Verilator

  • GHDL(测试版, SpinalHDL 1.4.1版本后支持)

  • Icarus Verilog(测试版, SpinalHDL 1.4.1版本后支持)

  • VCS(测试版, SpinalHDL 1.7.版本后支持)

有了外置HDL仿真器就可以不用增加SpinalHDL代码库的复杂度直接测试生成的HDL源代码。

一、SpinalHDL如何用Verilator仿真(How SpinalHDL simulates the hardware with Verilator backend)

  1. SpinalHDL会产生和Verilog等价的DUT硬件模型, 并用Verilator把它转换成C++的周期精度模型。

  2. C++模型会被编译成共享对象(shared object)(.so), 该共享对象通过JNR-FFI和Scala联系起来。

  3. 本地Verilator API通过提供多线程API来进行抽象描述。

优势

  • 因为Verilator后端用编译生成的C++仿真模型, 仿真速度比其他商业和免费仿真器都要快。

局限

  • Verilator只支持对Verilog/System Verilog代码的综合, 因此在对Verilog黑盒仿真的时候要注意是不是不可综合的。

  • VHDL黑盒无法被仿真。

  • 因为必须编译并链接到产生的C++模型上, 仿真启动过程有些缓慢。

二、SpinalHDL如何用GHDL/Icarus仿真(How SpinalHDL simulates the hardware with GHDL/Icarus backend)

  1. 基于选择的仿真器, SpinalHDL生成Verilog/VHDL的DUT模型

  2. HDL模型会加载到仿真器中

  3. JVM和仿真之间的通信通过共享存储建立。指令用VPI发射给仿真器。

优势

  • GHDL和Icarus Verilog都可以兼容不可综合的HDL代码;

  • 相比于Verilator, 仿真启动过程非常快。

局限

  • GHDL只接受VHDL代码, 因此该仿真器只能用VHDL黑盒;

  • Icarus只接受Verilog代码, 因此该仿真器只能用Verilog黑盒;

  • 仿真时间比Verilator慢了大概一个数量级

最后, 因为本地Verilator API非常粗糙, SpinalHDL通过提供单和多线程的仿真API进行抽象描述, 来帮助用户建立testbench实现。

三、SpinalHDL如何用Synopsys VCS仿真(How SpinalHDL simulates the hardware with Synopsys VCS backend)

  1. SpinalHDL生成Verilog/VHDL(基于你的选择)硬件模型的DUT;

  2. HDL模型被加载到仿真器中;

  3. 仿真和JVM之间的通信通过共享存储建立, 指令用VPI发给仿真器。

优势

  • 支持所有的SystemVerilog/Verilog/VHDL语言特征;

  • 支持加密IP;

  • 支持FSDB波形dump;

  • 编译和仿真均有很高性能。

局限

  • Synopsys VCS是一款商用仿真工具, 是资源是封闭的并且付费, 你需要合法地拥有自己的licenses来使用它。

在使用VCS仿真后端之前, 确保检查系统的VCS环境。

四、性能

当需要进行高性能仿真, 应该用Verilator作为后端。对于像Murax一样的小型SoC, Intel® Core™ i7-4720HQ足以每秒仿真1,200,000个时钟周期。然而, 当DUT很简单并且最大也就几千个时钟周期的仿真, 用GHDL或Icarus Verilog会产生更好的结果, 因为他们有更少的仿真负载消耗。