I debugged following code in Visual Studio 2008 (64 bit) by setting break point at the start of do_test1
and do_test2
, to my suprise, the code is running in the same thread of the sc_main
function.
I didn't debug in Linux environment. However, by searching the source code, I found the "pthread.h"
was included by some SystemC library source code.
Question 1: In Windows, will the SC_THREAD
create a real thread? Or it is always in the same thread of sc_main
? If this is the case, may I say SC_THREAD
is creating a "fake" thread?
Question 2: In Linux, since "pthread.h"
is included, will SC_THREAD
create a new thread?
Question 3: In Windows and Linux, did I miss some settings to enable the real thread?
========================================
Following code is from this website:
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
}
No & Yes. It depends on your SystemC library configuration.
You can configure SystemC to use pthread or Windows native thread. So when you compile and run your SystemC design, it creates REAL threads. However, by default, in UNIX environment, it won't use pthread by default because system calls are expensive. And SystemC only run threads one by one no matter how you configure your SystemC to use pthread or Window native thread. Because it only runs one thread at a time, using its user-level thread is faster than others because no system-calls are involved.
Why SystemC does not run all schedule threads at once? It's another question.