首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >systemc中的事件生成

systemc中的事件生成
EN

Stack Overflow用户
提问于 2017-08-21 09:28:02
回答 2查看 1.1K关注 0票数 2

我正在尝试理解systemc中的事件生成。我发现它取决于构造函数中线程注册的顺序。

代码语言:javascript
运行
复制
#include <systemc.h>                                                                                                   
    SC_MODULE(EventTest){                                                  
        sc_event ev1;
        void p1(){
           ev1.notify();
           ev1.notify(0, SC_NS);                                                                                    
        }

    void p2(){
        wait(ev1);
        cout<<"ev1 is activated at "<<sc_time_stamp()<<endl;           
        wait(ev1);
        cout<<"ev1-2 is activated at "<<sc_time_stamp()<<endl;         
    }
    SC_CTOR(EventTest){                                                
        SC_THREAD(p1);
        SC_THREAD(p2);                                       
    }   
};      

int sc_main(int argc, char *argv[]){                                   
    EventTest d("d");                                               
    sc_start();
    return 1;
}

输出:ev1 is activated at 0 s

如果我将in SC_CTOR更改为>

代码语言:javascript
运行
复制
SC_THREAD(p2);
 SC_THREAD(p1);

那么输出是>

代码语言:javascript
运行
复制
ev1 is activated at 0 s
ev1-2 is activated at 0 s

请有人告诉我注册顺序如何影响事件的产生?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-21 10:04:18

您的代码由两个SystemC进程(SystemC线程或称为进程的方法)组成,它们都是SystemC线程:p1p2。它们将在模拟的第一个增量周期中执行。然而,SystemC标准不能保证进程在同一个增量周期中的运行顺序。

  • 如果首先执行p1,它将对事件ev1执行非定时通知。参见IEEE Std 1666-2011的5.10.6节。 调用带空参数列表的成员函数notification应立即创建通知。对事件敏感的任何和所有进程实例都应在控件从函数通知返回之前运行,但当前正在执行的进程实例除外,无论其静态或动态敏感性如何,该进程实例都不应由于立即通知而使其无法运行。

然而,没有什么事情在等待着这一事件。通知什么也不做。然后p1执行定时通知。在这种情况下,行为是不同的:

使用表示非零时间的参数对函数通知的调用应在给定时间创建时间通知,该通知相对于调用函数通知时的模拟时间表示。换句话说,时间参数的值被添加到当前模拟时间,以确定事件将被通知的时间。时间论点不应是否定的。注:在增量通知的情况下,在增量通知阶段对事件敏感的所有进程都将在随后的评估阶段中运行。在定时通知的情况下,所有在事件发生时对事件敏感的进程都将在事件发生时运行,这将是未来的模拟时间。

最后,执行进程p1结束和p2。第一个wait将暂停该进程。然后传播挂起的事件通知,并解锁进程p2。然后,流程p2将执行第二个wait并再次挂起。由于没有任何通知事件,模拟将结束。

  • 如果首先执行p2,它将挂起第一个wait。然后,将执行p1。它将进行第一次通知。当p2在等待通知时,p1将被暂停(立即通知),p2将继续并继续直到第二个waitp2被暂停。然后,p1继续。它执行定时通知,进程结束。当p2等待通知并发生时,p2执行继续进行,流程结束。模拟也结束了。

最后,在两种情况下,p1总是在p2之后与您使用的SystemC实现一起执行。对于SystemC的另一个实现来说,情况可能正好相反。您应该考虑在相同的模拟时间并行执行它们。在这种情况下,两项命令都是正确的。

最后,这意味着您的代码可能导致不确定的行为。

票数 2
EN

Stack Overflow用户

发布于 2021-05-25 07:37:42

您可以在下面打印的代码中添加:

代码语言:javascript
运行
复制
  6     void p1(){
  7         cout << "P1 is run" << endl;
  8         ev1.notify();
  9         ev1.notify(0, SC_NS);
 10         cout << "P1 is end" << endl;
 11     }
 12 
 13     void p2(){
 14         cout << "P2 is run" << endl;
 15         wait(ev1);
 16         cout<<"ev1 is activated at "<<sc_time_stamp()<<endl;
 17         wait(ev1);
 18         cout<<"ev1-2 is activated at "<<sc_time_stamp()<<endl;
 19         cout << "P2 is end" << endl;
 20     }

语言参考手册说:“当一个方法进程被触发时,关联的函数从开始执行到结束,然后将控制返回给内核。”

如果首先触发p1,则立即通知ev1结果为零,然后在0NS之后通知ev1。然后触发p2,只导致ev1 is activated at 0 s

代码语言:javascript
运行
复制
P1 is run
P1 is end
P2 is run
ev1 is activated at 0 s

如果首先触发p2,则等待ev1,然后触发p1。立即通知ev1导致ev1 is activated at 0 s。在0ns之后通知ev1,结果是ev1-2 is activated at 0 s

代码语言:javascript
运行
复制
P2 is run
P1 is run
P1 is end
ev1 is activated at 0 s
ev1-2 is activated at 0 s
P2 is end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45793627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档