你能解释sc_spawn和另一个进程(SC_METHOD,SC_THREAD,SC_CTHREAD)之间的区别吗?
谢谢大家。 钩
答案 0 :(得分:2)
要理解这一点,您必须首先了解SystemC的详细说明和模拟阶段。精化和模拟的阶段应按以下顺序进行(来自IEEE Std 1666-2011:
- 详细说明 - 构建模块层次结构
- 详细说明 - 回调功能
before_end_of_elaboration
- 详细说明 - 回调功能
end_of_elaboration
- 模拟 - 回调功能
start_of_simulation
- 模拟 - 初始化阶段
- 模拟 - 评估,更新,增量通知和定时通知阶段(重复)
- 模拟 - 回调功能
end_of_simulation
- 模拟 - 模块层次结构的破坏
醇>
进程是从sc_object
派生的对象,通过调用SC_METHOD
,SC_THREAD
,SC_CTHREAD
或sc_spawn
函数创建。
如果在详细说明(1.)或before_end_of_elaboration
(2.)期间创建了创建的进程,则它是静态进程。如果它是在end_of_elaboration
(3.)回调期间或模拟期间创建的,则它是动态过程。
由SC_METHOD
,SC_THREAD
或SC_CTHREAD
宏创建的流程实例是未发布的流程实例,通常是静态流程。 产生的流程实例是通过调用sc_spawn
创建的流程。通常,它们是动态过程,但如果在sc_spawn
阶段之前调用end_of_elaboration
,则可以是静态的。
这意味着,用简单的话来说明这一点,sc_spawn
使您能够在模拟期间动态添加进程。例如:如果模拟过程中的某个条件成立,则可能存在只需要某个过程的情况。
现在让我们来看看模拟过程中产生的过程。 SystemC(6)的实际模拟包括以下阶段:
- 初始化阶段 - 以未指定的顺序执行所有进程(SC_CTHREADS除外)。
- 评估阶段 - 选择准备运行并恢复执行的流程。这可能会导致立即发生事件通知,这可能导致其他进程准备好在同一阶段运行。重复,只要仍有进程准备好运行。
- 更新阶段 - 执行对步骤1或2中的request_uptdate()调用产生的任何挂起的update()调用。
- Delta通知阶段 - 如果存在待处理的增量通知(来自对notify()的调用),请确定由于延迟通知而准备运行的进程并转到步骤2.
- 定时通知阶段 - 如果存在待定时通知或超时:
醇>
- 将模拟时间提前到最早的待定时间通知或超时;
- 确定哪些流程实例对通知的事件敏感,并在此精确时间内超时;
- 将所有此类流程实例添加到可运行流程集中;
- 如果没有待处理的定时通知或超时→模拟结束。否则,请进入评估阶段。
如果调用sc_spawn
来创建生成的流程实例,则新流程将添加到可运行流程集中(除非调用dont_initialize
)。如果在评估阶段调用sc_spawn
,则它应在当前评估阶段(2.)中运行。如果在更新阶段(3.)期间调用它,则它应在下一个评估阶段运行。
如果在详细说明期间调用sc_spawn
,则生成的进程将是调用sc_spawn
的模块实例的子进程。如果在模拟期间调用它,它将是调用函数sc_spawn
的进程的子进程。您可以从方法流程(sc_spawn
),线程流程(SC_METHOD
)或时钟线程流程(SC_THREAD
)中调用SC_CTHREAD
。
This tutorial显示了通过SC_METHOD
和SC_THREAD
以及sc_spawn
实施流程之间的区别。