simulationsystemc

SystemC simulation misses the first iteration


I'm having difficulties with initiating the simulation. Whenever I start a for loop, I always miss the first iteration of the loop. Here is my code:

#include <systemc.h>
#include <iostream>

using namespace std;

SC_MODULE(cpu){
    sc_in_clk clk { "cpu_clk" };
    sc_in<bool> rw { "cpu_rw" };
    sc_inout<sc_lv<16>> dbus { "cpu_dbus" };
    sc_out<sc_lv<20>> abus { "cpu_abus" };

    void cpu_loop();

    SC_CTOR(cpu){
        SC_CTHREAD(cpu_loop, clk.pos());
    }
};

void cpu::cpu_loop(){
    while(1){
        wait();

        cout << "cpu" << endl;
    }
}

SC_MODULE(sram){
    sc_in_clk clk { "sram_clk" };
    sc_in<bool> rw { "sram_rw" };
    sc_inout<sc_lv<16>> dbus { "sram_dbus" };
    sc_in<sc_lv<20>> abus { "sram_abus" };

    void sram_loop();

    SC_CTOR(sram){
        SC_CTHREAD(sram_loop, clk.pos());
    }
};

void sram::sram_loop(){
    while(1){
        wait();

        cout << "sram" << endl;
    }
}

int sc_main(int argc, char* argv[]) {
    int i;
    sc_signal<sc_lv<16>, SC_MANY_WRITERS> dbus { "main_dbus" };
    sc_signal<sc_lv<20>, SC_MANY_WRITERS> abus { "main_abus" };
    sc_signal<bool> clk { "main_clk" };
    sc_signal<bool> rw { "main_rw" };

    cpu custom_cpu("custom_cpu");
    sram custom_sram ("custom_sram");

    custom_cpu.abus(abus);
    custom_cpu.dbus(dbus);
    custom_cpu.clk(clk);
    custom_cpu.rw(rw);


    custom_sram.abus(abus);
    custom_sram.dbus(dbus);
    custom_sram.clk(clk);
    custom_sram.rw(rw);

    sc_start(1, SC_MS);
    clk = 0;

    for(i = 0; i < 10; i++){
        cout << "============== " << i << "==============" << endl;
        clk = 1;
        sc_start(1, SC_MS);
        clk = 0;
        sc_start(1, SC_MS);
    }

    return 0;
}

And here is the output:

============== 0==============
============== 1==============
cpu
sram
============== 2==============
cpu
sram
============== 3==============
cpu
sram
============== 4==============
cpu
sram
============== 5==============
cpu
sram
============== 6==============
cpu
sram
============== 7==============
cpu
sram
============== 8==============
cpu
sram
============== 9==============
cpu
sram

I've searched for an answer, but it seems that no one else has this problem, so I'm assuming I'm doing something wrong.


Solution

  • If you do the print out before you call wait in your while loops, you get the expected output. This is consistent with the for loop. For example:

    void cpu::cpu_loop(){
        while(1){
            cout << "cpu" << endl;
            wait();
        }
    }
    

    This runs on EDA playgrpound.