我是靠谱客的博主 魔幻柠檬,最近开发中收集的这篇文章主要介绍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(敏感列表事件)。

最后

以上就是魔幻柠檬为你收集整理的SystemC:SC_THREAD和SC_METHOD的全部内容,希望文章能够帮你解决SystemC:SC_THREAD和SC_METHOD所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部