微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SystemC:SC_THREAD和SC_METHOD

SC_THREAD / SC_METHOD都是spec中提到的processes,SC_CTHREAD很少使用,这里不太讨论。

SC_THREAD / SC_METHOD本身是一个SystemC定义的宏,在源码中我们可以找到其对应的实际执行语句,其实就是将括号中对应的函数添加到SystemC kernel中的调度列表中。SC_THREAD / SC_METHOD必须在一个module的构造函数或before_end_of_elaboration / end_of_elaboration中使用。如果想在Simulation阶段动态创建一个thread或method,则需要使用sc_pawn。

A process may call function sc_spawn to create a spawned process instance, in which case the new process instance shall be added to the set of runnable processes (unless function sc_spawn_options::dont_initialize is called) and subsequently executed in this very same evaluation phase.

sc_process_handle sc_get_current_process_handle()可以获取到离它最近的上一个注册函数的句柄,然后就可以在Simulation阶段disable / enable这个processes。

SC_METHOD后面必须跟一个sensitive的敏感事件列表;SC_THREAD则一般不跟敏感列表,当然也可以加。

需要注意的是,Sensitive dont_initialize都只对离它最近的上一条SC_THREAD / SC_METHOD关联函数有效。比如有这样的语句SC_THREAD( function_1); SC_THREAD(function_2);sensitive << evt; 则evt 敏感事件 只对 function_2 这个SC_THREAD起作用。

如果希望有多个sc_event 来触发某个SC_METHOD或SC_THREAD,可以 写成SC_THREAD(function_2);sensitive << evt_1 << evt_2 ;也可以写成 SC_THREAD(function_2);sensitive << evt_1; sensitive << evt_2; 两种写法的效果是一样的。

SC_METHOD关联函数调用逻辑是,当敏感事件被触发(notify)的时候,函数被完整的调用一次,函数内部不能有任何的wait函数调用

SC_THREAD的调用逻辑是,Simulation阶段被调用一次,且在整个Simulation阶段只会被调用一次,故一般SC_THREAD中会使用while(1)来避免函数退出。SC_THREAD中一般是要求必须有显式或隐式的wait调用,否则会出现 SystemC程序停滞,也就是SystemC 仿真时间不往前推进,一直在while(1)中执行,这也是新手最容易犯的错误,且这种错误在debug过程非常容易被忽视。

SC_THREAD的敏感列表只有在函数中遇到wait() 或wait(int) 才有效,此时需要等待敏感列表的事件被触发,等效于在函数中使用wait(敏感列表事件)。

原文地址:https://www.jb51.cc/wenti/3280771.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐