本文作为SpinalHDL学习笔记第三十三篇,介绍SpinalHDL仿真线程 API相关内容。
在 SpinalSim 中,可以使用多个线程来编写测试平台,方法与 SystemVerilog 类似,有点像 VHDL/Verilog的 process/always 块。这允许使用流畅的 API 编写并发任务并控制仿真时间。
目录:
1.分裂和合并仿真线程
2.休眠和等待
3.无线程 API
4.敏感 API
1.分裂和合并仿真线程
// Create a new thread
val myNewThread = fork {
// New simulation thread body
}
// Wait until `myNewThread` is execution is done.
myNewThread.join()
2.休眠和等待
// Sleep 1000 units of time
sleep(1000)
// waitUntil the dut.io.a value is bigger than 42 before continuing
waitUntil(dut.io.a > 42)
3.无线程 API
可以使用一些函数来避免使用线程,但仍然允许控制仿真时的流程。
无线程函数 | 描述 |
delayed(delay){ callback } | 注册要在当前时间步 delay 步之后调用的回调代码。 |
与使用常规模拟线程 + 休眠相比, delayed 函数的优点是:
• 性能(无上下文切换)
• 内存使用情况(无本机 JVM 线程内存分配)
与 ClockDomain 对象相关的一些其他无线程函数被设计为Callback API 的一部分,而其他一些与仿真增量周期执行过程相关的函数被设计为Sensitive API 的一部分。
4.敏感 API
可以注册要在仿真过程中每个仿真增量周期调用的回调函数:
敏感函数 | 描述 |
forkSensitie { callback } | 注册要在仿真的每个仿真增量周期调用的回调代码 |
forkSensitieWhile { callback } | 注册要在仿真过程的每个仿真增量周期调用的回调代码,而回调返回值为 true(意 味着应该为下一个仿真增量周期重新调度) |