Jump to content

makefile SystemC

Recommended Posts

Hallo everybody,

I'm working with SystemC in Linux.

Unfortunately, I'm a beginner in writing makefiles. Is their anyone who has already written a makefile for systemc.h?


Thanks in advance.


Share this post

Link to post
Share on other sites

You can check out the example Makefiles in the installation (examples/build-unix/Makefile.{config,rules} and e.g. examples/sysc/simple_bus/Makefile) as a starting point. The files in examples/build-unix are reasonably generic, and you may "just" need to adjust the settings in Makefile.config. In the project's Makefile itself, you then set the PROJECT variable and your SRCS (to point to your source files).  Admittedly, documentation could be better (as usual), but you can ask here, if you have further questions.

The CMake support included in SystemC 2.3.2 is still experimental and is mostly targeted for early adopters with CMake knowledge.

Greetings from Duisburg,

Share this post

Link to post
Share on other sites

Thank you very much.

Before, I tried to only use the bash for compiling the file. I was able to compile HelloWorld.cpp.

My current beginner's project compiles, but the signals are not connected. Thus, their is no exchange between the modules.

Probably, my faults are quite obvious but their is no person in my environment having knowledge in SystemC.

So, in the following are the .cpp file and the command to compile. Is the .cpp file faulty, the bash command or both of them?

Thanks for your time and answer.



$ g++ -I. -I$SYSTEMC_HOME/include -L. -L$SYSTEMC_HOME
/lib-linux -Wl,-rpath=$SYSTEMC_HOME/lib-linux -o sc_main sc_main.cpp -lsystemc -lm


#include <systemc.h>

SC_MODULE( stimuli_pressure_mech ) {

    sc_out<double> force_out;
    sc_out<double> area_out;

    void stimuli_pressure_mech_process();

    SC_CTOR(stimuli_pressure_mech) {
        std::cout << std::endl << "Hallo stimuli" << std::endl;

void stimuli_pressure_mech::stimuli_pressure_mech_process() {
    double force_mech = 1;
    double area = 5;

   // while(1){
    std::cout << "force_mech: " << force_mech << ",\t" << "area: " <<area << std::endl;

SC_MODULE( pass_on_impulse ) {

    sc_in<double> force_in;
    sc_in<double> area_in;

// sc_out<double> energy_air_out;
    void pass_on_impulse_process();

SC_CTOR( pass_on_impulse ) {
    std::cout << std::endl << "Hallo pass_on_impulse" << std::endl;
    sensitive << force_in << area_in;


void pass_on_impulse::pass_on_impulse_process() {

    const double MATERIAL_CONST = 1.2;
    double area;
    double force;
    double energy_air;
    //while ( true ) {
    cout << "force_in: " << force_in << endl;
        force = force_in.read();
        area = area_in.read();
        energy_air = force * MATERIAL_CONST;
        cout << "force: " << force << endl;
        cout << "area: " << area << endl;
       // energy_out.write( energy_air );
        cout << "Output pass on impulse: " << energy_air;
      //  wait();

int sc_main(int argc, char *argv[]) {
    //deactivate warnings
    sc_core::sc_report_handler::set_actions( "/IEEE_Std_1666/deprecated",sc_core::SC_DO_NOTHING );

sc_signal<double> force_main;
sc_signal<double> area_main;

stimuli_pressure_mech *S;
pass_on_impulse *PI;

S = new stimuli_pressure_mech("stimuli_pressure_mech");

PI = new pass_on_impulse("pass_on_impulse");

return 0;


Share this post

Link to post
Share on other sites

Your stimuli_pressure_mech_process() member function has to be registered as a SC_THREAD and not a SC_METHOD to be able to use the wait() functions for timing the application of your stimuli.

It is not good practice to use the <systemc.h> header. Instead, you should get used right from the start to use the <systemc> header and prefix SystemC functions and types with the appropriate namespace prefixes. In context of functions, you can abbreviate typing by using "using" statements (e.g., "using namespace sc_core;") (cf. to a good book on C++). Also, instead of deactivating the deprecation warnings, you should fix the source of the problem in your code.

"sc_start(200)" with only the integer argument is non-standard and, if I remember correctly, has been removed from recent versions of the SystemC PoC simulator. Instead, you should also specify the time unit, e.g., "sc_start(200.0, sc_core::SC_NS);".

I suggest you read a good introductory book on SystemC, e.g., "SystemC from the Ground Up".

Share this post

Link to post
Share on other sites

In addition to Thorsten's comments, your main problem is that you call the processes directly instead of invoking sc_start.  You should never call process functions manually.  They are  scheduled by the kernel during the simulation instead.

Here's a cleaned up version of your sc_main:

int sc_main(int /*argc*/, char* /*argv*/[])
  sc_signal<double> force_main("force main");
  sc_signal<double> area_main("area_main");

  stimuli_pressure_mech S("stimuli_pressure_mech");

  pass_on_impulse PI("pass_on_impulse");

  return 0;

I did the following changes:

  • Drop warning suppression - why do you want to allow deprecated features? They are deprecated for a reason.
  • Add names to your signals
  • Drop dynamic allocation of modules in favor of properly cleaned up local variables
  • Drop manual calls to processes
  • Call sc_start to start the simulation (without specific end time, but Thorsten's suggestions is also possible)

Hope that helps,

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now