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(敏感列表事件)。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

123axj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值