mil*_*sma 0 c++ multithreading systemc
我通过在开始时设置断点来调试Visual Studio 2008(64位)中的以下代码,do_test1并且do_test2令我惊讶的是,代码在sc_main函数的同一个线程中运行.
我没有在Linux环境中调试.但是,通过搜索源代码,我发现"pthread.h"一些SystemC库源代码包含了它.
问题1:在Windows中,是否会SC_THREAD创建一个真正的线程?或者它总是在同一个线程中sc_main?如果是这种情况,我可以说SC_THREAD是创建一个"假"线程吗?
问题2:在Linux中,既然"pthread.h"包括在内,会SC_THREAD创建一个新的线程吗?
问题3:在Windows和Linux中,我是否错过了启用真实线程的一些设置?
========================================
以下代码来自本网站:
http://www.asic-world.com/systemc/systemc_time4.html#Example_:_sc_event
#include <systemc.h>
SC_MODULE (events) {
sc_in<bool> clock;
sc_event e1;
sc_event e2;
void do_test1() {
while (true) {
// Wait for posedge of clock
wait();
cout << "@" << sc_time_stamp() <<" Starting test"<<endl;
// Wait for posedge of clock
wait();
cout << "@" << sc_time_stamp() <<" Triggering e1"<<endl;
// Trigger event e1
e1.notify(5,SC_NS);
// Wait for posedge of clock
wait();
// Wait for event e2
wait(e2);
cout << "@" << sc_time_stamp() <<" Got Trigger e2"<<endl;
// Wait for posedge of clock
wait();
cout<<"Terminating Simulation"<<endl;
sc_stop(); // sc_stop triggers end of simulation
}
}
void do_test2() {
while (true) {
// Wait for event e2
wait(e1);
cout << "@" << sc_time_stamp() <<" Got Trigger e1"<<endl;
// Wait for 3 posedge of clock
wait(3);
cout << "@" << sc_time_stamp() <<" Triggering e2"<<endl;
// Trigger event e2
e2.notify();
}
}
SC_CTOR(events) {
SC_CTHREAD(do_test1,clock.pos());
SC_CTHREAD(do_test2,clock.pos());
}
};
int sc_main (int argc, char* argv[]) {
sc_clock clock ("my_clock",1,0.5);
events object("events");
object.clock (clock);
sc_start(); // Run the simulation till sc_stop is encountered
return 0;// Terminate simulation
}
Run Code Online (Sandbox Code Playgroud)
Ahm*_*sar 11
简短回答:
线程库,无论是用户级线程(更轻和更快的上下文切换)还是内核级线程,都不用于提供真正的并发.相反,它们用于实现SC_THREAD进程的协同语义.
答案很长:
SystemC有3种类型的进程(即并发单元),其中最重要的只有两种:
SC_METHODs是方法(类似于alwaysVerilog中的语句),当由事件触发时,它们在零时间内完整地执行.他们不能wait用来等待时间间隔或事件发生.SC_THREADs是initial只执行一次的方法(如Verilog中的语句),但它们可以wait用来等待特定事件或时间段,并且可以使用循环来模拟always
语句(因此SC_THREAD可以消耗时间).对于实现透视图,SC_METHODs 没有问题,因为它们就像在触发时要调用的SystemC内核中注册的方法一样.但是,对于SC_THREADs,虽然它们被定义为成员函数,但它们的行为与普通例程不同.它们被称为协程:
子程序,允许多个入口点在某些位置暂停和恢复执行.
SystemC内核不为系统级或RTL模型提供真正的并发性.它仅通过流程构造提供模拟并发.因此,在编写高级模型时,您不必使用同步原语(例如,锁或信号量)来保护不同进程共享的数据,因为在任何时候,只有一个进程正在执行且不能被中止SystemC的内核(执行切换到下一工序准备只有当当前执行的进程放弃控制来执行.然而,可以使用的同步,但SystemC的推广使用的消息传递中的通道进程之间的沟通.这是一个优点,因为它降低了复杂性.但是,也有缺点.SystemC模型按顺序执行(非并行化),因此它们不利用多核架构来加速模拟.这是一个热门的研究领域,需要模拟性能.
无论如何,SystemC内核因此实现了协作调度,其中每个人都SC_THREAD愿意放弃控制(通过使用wait)以允许其他SC_THREAD进程执行.如果在一个SC_THREAD永不放弃控制的过程中有一个无限循环,那么整个模拟将停留在那里并且模拟时间不会提前.SC_METHODs的情况也是如此,必须返回SystemC内核才能重新获得控制权.
为了使用协同程序实现该协作调度策略,使用了一个线程库(例如,包含在SystemC源代码中的pthreads或QuickThread)来启用SC_THREAD(作为线程启动)暂停自身并使内核恢复他们以后.阅读本文以了解更多相关信息.