## 介绍(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会产生更好的结果, 因为他们有更少的仿真负载消耗。