以下简化的流程图说明了SystemC仿真内核的操作流程。
首先,如前面“modules”中所讨论的那样进行详细说明。 在elab过程中,构建SystemC模块并建立各种仿真参数。 这个elab阶段之后是对sc_start()的调用,它调用仿真内核。 此调用开始初始化阶段。 需要启动在elab期间定义的进程(例如,SC_THREAD进程)。 在初始化阶段,所有进程最初都放在就绪池中。 定义:只要可以执行,进程就会准备就绪。
我们有时会说进程被放入准备执行的进程池中。 下图描绘了进程和事件池。
然后,仿真进入评估阶段。通过将它们指定为运行和调用,从就绪池中随机地取出一个个进程。每个进程程一直执行,直到它完成(例如,通过return)或暂停(例如,调用wait())。
在执行期间,进程可以调用立即事件通知(即,event.notify())并且可能使一个或多个等待进程处于就绪状态。如上图中的E1-E4所示,还可以生成延迟或定时事件通知。已完成的进程将被丢弃。暂停的进程被放入等待池中。仿真继续进行,直到没有更多进程准备好运行。
此时,执行将退出上图底部的评估气泡,其中包含三种可能性之一:等待进程或零延迟时间,非零时间延迟或两者都不存在的事件。
首先,可能存在等待SC_ZERO_TIME延迟(.notify(0))的进程或事件(稍后将讨论)。这种延迟称为deltacycle延迟。在这种情况下,具有零时间延迟的等待池进程被放回到就绪池中。源自延迟通知的零时间事件可能导致等待这些事件的进程也被放入就绪池中。如果已将任何进程移入就绪池,则会进行另一轮评估。
其次,可能存在稍后安排的等待非零时间延迟发生的进程或事件。在这种情况下,时间提前到指示的最近时间。等待该特定延迟的进程将被放入就绪池中。如果在此新时间发生事件,则等待该事件的进程将放入就绪池中。如果已将任何进程移入就绪池,则会进行另一轮评估。
第三,可能没有延迟的过程或事件。由于就绪池中没有进程,因此模拟只需返回sc_main并完成清理即可结束。无法在SystemC的当前定义中成功重新输入sc_start。