介绍(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)
SpinalHDL会产生和Verilog等价的DUT硬件模型, 并用Verilator把它转换成C++的周期精度模型。
C++模型会被编译成共享对象(shared object)(.so), 该共享对象通过JNR-FFI和Scala联系起来。
本地Verilator API通过提供多线程API来进行抽象描述。
优势
因为Verilator后端用编译生成的C++仿真模型, 仿真速度比其他商业和免费仿真器都要快。
局限
Verilator只支持对Verilog/System Verilog代码的综合, 因此在对Verilog黑盒仿真的时候要注意是不是不可综合的。
VHDL黑盒无法被仿真。
因为必须编译并链接到产生的C++模型上, 仿真启动过程有些缓慢。
二、SpinalHDL如何用GHDL/Icarus仿真(How SpinalHDL simulates the hardware with GHDL/Icarus backend)
基于选择的仿真器, SpinalHDL生成Verilog/VHDL的DUT模型
HDL模型会加载到仿真器中
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)
SpinalHDL生成Verilog/VHDL(基于你的选择)硬件模型的DUT;
HDL模型被加载到仿真器中;
仿真和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会产生更好的结果, 因为他们有更少的仿真负载消耗。