假设仿真代码如下:
object SimTest extends App{ SimConfig.withWave.compile(new testModule()).doSim{ dut => dut.clockDomain.forkStimulus(10) } }
SpinalHDL在仿真时遇到了以下报错:
Exception in thread "main" java.util.NoSuchElementException: key not found: (clk : Bool)
** 原因是:我的testModule中,没有自动产生默认时钟域的clk信号 **
在SpinalHDL中,如果在代码中存在Reg,他是会自动例化时钟信号clk的;但是如果在模块代码testModule中没有Reg,则不会自动生成默认时钟域,相当于我的代码是一堆组合逻辑,因此默认不需要clk。
为了能让仿真代码跑起来,可以尝试:
-
检查testModule模块代码中,是否需要添加Reg(Reg会自动例化在默认时钟域下)
-
检查代码是否在默认时钟域下运行
-
如果你的模块是组合逻辑,不存在时序逻辑,那么删除"dut.clockdomain.forkStimulus()"代码
SpinalHDL的仿真与传统的Verilog仿真思想稍有不同:
传统Verilog的testbench主要是通过“用硬件测试硬件”,主要体现在:在写testbench的时候,生成一堆硬件(wire, reg)并对其附加一定的规则,然后输入到dut上进行测试
SpinalHDL注重“软件与硬件分离”,主要体现在:在testbench时,其使用的仿真代码是“软件”形式的,如"#="信号赋值的时候,用的是scala中的Int类型,而不是spinal中的UInt类型(scala不会生成硬件),又如使用条件分支时,用的是if()(scala的条件分支)而不是when()(生成硬件的条件分支)