sc_spawn和其他进程[SystemC]

时间:2018-06-14 14:14:41

标签: process systemc

你能解释sc_spawn和另一个进程(SC_METHOD,SC_THREAD,SC_CTHREAD)之间的区别吗?

谢谢大家。 钩

1 个答案:

答案 0 :(得分:2)

要理解这一点,您必须首先了解SystemC的详细说明和模拟阶段。精化和模拟的阶段应按以下顺序进行(来自IEEE Std 1666-2011

  
      
  1. 详细说明 - 构建模块层次结构
  2.   
  3. 详细说明 - 回调功能before_end_of_elaboration
  4.   
  5. 详细说明 - 回调功能end_of_elaboration
  6.   
  7. 模拟 - 回调功能start_of_simulation
  8.   
  9. 模拟 - 初始化阶段
  10.   
  11. 模拟 - 评估,更新,增量通知和定时通知阶段(重复)
  12.   
  13. 模拟 - 回调功能end_of_simulation
  14.   
  15. 模拟 - 模块层次结构的破坏
  16.   

进程是从sc_object派生的对象,通过调用SC_METHODSC_THREADSC_CTHREADsc_spawn函数创建。

如果在详细说明(1.)或before_end_of_elaboration(2.)期间创建了创建的进程,则它是静态进程。如果它是在end_of_elaboration(3.)回调期间或模拟期间创建的,则它是动态过程

SC_METHODSC_THREADSC_CTHREAD宏创建的流程实例是未发布的流程实例,通常是静态流程。 产生的流程实例是通过调用sc_spawn创建的流程。通常,它们是动态过程,但如果在sc_spawn阶段之前调用end_of_elaboration,则可以是静态的。

这意味着,用简单的话来说明这一点,sc_spawn使您能够在模拟期间动态添加进程。例如:如果模拟过程中的某个条件成立,则可能存在只需要某个过程的情况。

现在让我们来看看模拟过程中产生的过程。 SystemC(6)的实际模拟包括以下阶段:

  
      
  1. 初始化阶段 - 以未指定的顺序执行所有进程(SC_CTHREADS除外)。
  2.   
  3. 评估阶段 - 选择准备运行并恢复执行的流程。这可能会导致立即发生事件通知,这可能导致其他进程准备好在同一阶段运行。重复,只要仍有进程准备好运行。
  4.   
  5. 更新阶段 - 执行对步骤1或2中的request_uptdate()调用产生的任何挂起的update()调用。
  6.   
  7. Delta通知阶段 - 如果存在待处理的增量通知(来自对notify()的调用),请确定由于延迟通知而准备运行的进程并转到步骤2.
  8.   
  9. 定时通知阶段 - 如果存在待定时通知或超时:      
        
    1. 将模拟时间提前到最早的待定时间通知或超时;
    2.   
    3. 确定哪些流程实例对通知的事件敏感,并在此精确时间内超时;
    4.   
    5. 将所有此类流程实例添加到可运行流程集中;
    6.   
    7. 如果没有待处理的定时通知或超时→模拟结束。否则,请进入评估阶段。
    8.   
  10.   

如果调用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_METHODSC_THREAD以及sc_spawn实施流程之间的区别。