Jump to content
SRachuj

Expected behavior of sc_simcontext::next_time

Recommended Posts

Hello,

I have issues understanding sc_simcontext::next_time. The easiest way to describe what does not make sense for me is to give an example:

#include <systemc>

using namespace sc_core;

SC_MODULE(A)
{
	sc_out<bool> out;
	SC_CTOR(A)
	{
		SC_THREAD(t);
	}

	void t()
	{
		bool c = false;
		while (1) {
			wait(sc_time(1, SC_NS));
			c = !c;
			out.write(c);
		}
	}
};

SC_MODULE(B)
{
	sc_in<bool> in;
	SC_CTOR(B)
	{
		SC_THREAD(t)
	}

	void t()
	{
		while (1) {
			wait(in.value_changed_event());
			std::cout << "got: " << in.read() << std::endl;
		}
	}
};

int sc_main(int argc, char** argv)
{
	A a("a");
	B b("b");
	sc_signal<bool> s;
	a.out.bind(s);
	b.in.bind(s);

	while (1) {
		sc_time t;
		std::cout << sc_get_curr_simcontext()->next_time(t) << ": " << t << std::endl;
		sc_start(sc_time(1, SC_NS));
		sleep(1);
	}
}

In this example, I would expect, that the output within the while loop of sc_main always prints 1 and the time until the next event happens (which should be 1 ns). However, when I run this program I get the following output:

0: 0 s
0: 0 s
got: 1
0: 0 s
got: 0
0: 0 s
got: 1
0: 0 s
got: 0
0: 0 s
got: 1
0: 0 s
got: 0
^C

Why do I always get "false" as the result for next_time? Did I misunderstand the what next_time does? Currently I'm using SystemC 2.3.1a.

Thank you for your answers in advance!

Share this post


Link to post
Share on other sites

Hello @SRachuj,

Please find the comment in-line:

while (1) {
		sc_time t;
		std::cout << sc_get_curr_simcontext()->next_time(t) << ": " << t << std::endl; //< It hits the call to next_time(t) when the simulation has ended or did not even begin.
		sc_start(sc_time(1, SC_NS));
		sleep(1);
	}

You are calling the next_time(t):

  • when the simulation has not even started so no events would be scheduled in the SystemC kernel.
  • In the next pass once you have started the simulation for 1 ns. The simulation kernel will delete all the events which are scheduled after 1 ns.

Try running putting the code in the module B.

void t()
{
	sc_time t; //< Added the sc_time state variable.
	while (1) {
		wait(in.value_changed_event());
		std::cout << sc_get_curr_simcontext()->next_time(t) << ": " << t << std::endl; //< Added the next_time(t) in Module B.
		std::cout << "got: " << in.read() << std::endl;
	}
}

Regards,

Ameya Vikram Singh

 

Share this post


Link to post
Share on other sites

Have you looked at the functions defined in clause 4.5.7 Functions to detect pending activity of IEEE Std. 1666-2011? Using the simcontext directly is not advisable as its interface is not part of the SystemC standard. It is thus an implementation detail of the Accellera proof-of-concept implementation of SystemC on which you should not depend on if you want a portable solution.

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

×