katang Posted March 4, 2018 Report Share Posted March 4, 2018 I receive the message Error: (E520) next_trigger() is only allowed in SC_METHODs: in SC_THREADs and SC_CTHREADs use wait() instead when running my code (the relevant fragments are shown below). Any idea, what could be wrong? (what else is needed?) SC_MODULE(scMemory) { sc_core::sc_in<bool> Clock; public: void WaitAccessing(void) { next_trigger(memory_accessed); } void ReceivedClock(void); sc_event memory_accessed; // memory access finished }; SC_HAS_PROCESS(scMemory); scMemory::scMemory(sc_core::sc_module_name nm, int Size ) : sc_core::sc_module(nm), mClocks(0), Length(Size), my_state(STANDBY) { SC_METHOD(ReceivedClock); sensitive << Clock.pos(); SC_METHOD(WaitAccessing); sensitive << memory_accessed; dont_initialize(); // Do not receive clock during initialization } the error message changes to Error: (E519) wait() is only allowed in SC_THREADs and SC_CTHREADs: in SC_METHODs use next_trigger() instead if I change the code to SC_THREAD(WaitAccessing); void WaitAccessing(void) { wait(memory_accessed); } I surely do something wrong, but surely the diagnostic messages are not on the top, too. Quote Link to comment Share on other sites More sharing options...
Roman Popov Posted March 4, 2018 Report Share Posted March 4, 2018 Most likely you are calling WaitAccessing from somewhere else, not shown in your code sample. Just set a breakpoint on error and check call stack. Also, why do you put SC_HAS_PROCESS to global namespace? Quote Link to comment Share on other sites More sharing options...
katang Posted March 5, 2018 Author Report Share Posted March 5, 2018 Well, the full code of the member function calling WaitAccessing() is byte_t getByte(scCore* FromCore, SC_ADDRESS_TYPE Address){ AccessMemory(FromCore, scMemoryRead, Address, 1); // Request a content WaitAccessing(); return storage->contents[Address]; } Of course I set a breakpoint in the member function above (this is the only place where WaitAccessing() is called from) and it is exactly called from this place. Concerning your namespace question: I simple followed the example in SCFTGU, page 55 //FILE: module_name.cpp SC_HAS_PROCESS(module_name); module_name::module_name( sc_module_name instname[, other_args…]) : sc_module(instname) Is it wrong (or can be wrong)? Quote Link to comment Share on other sites More sharing options...
Roman Popov Posted March 5, 2018 Report Share Posted March 5, 2018 Can you give a complete small reproducer of your problem? Otherwise I can just guess. Who calls getByte? Some sc_thread? About SC_HAS_PROCESS - it should be fine unless you defne couple of modules in same translation unit. Quote Link to comment Share on other sites More sharing options...
katang Posted March 5, 2018 Author Report Share Posted March 5, 2018 OK, I will try to make an MWE. This module is part of a bigger project. Quote Link to comment Share on other sites More sharing options...
David Black Posted March 5, 2018 Report Share Posted March 5, 2018 Re. SC_HAS_PROCESS That would appear to be an error in the text. The best place to put SC_HAS_PROCESS is inside the constructor as the first line in the body of the constructor. It is syntactically legal there and the only things using it are the SC_METHOD, SC_THREAD, and SC_CTHREAD macros. Quote Link to comment Share on other sites More sharing options...
David Black Posted March 5, 2018 Report Share Posted March 5, 2018 Re. the error SC_METHOD is called repeatedly (every time an element of the static sensitivity list triggers); however, SC_METHOD processes must execute in single delta cycle (zero time). Blocking methods such as wait() is illegal there. Methods such as sc_fifo::write() call wait() and are therefore also illegal. To wait 10 ns, you can do something like this: #include <systemc> #include <iostream> struct Ex1 : sc_core::sc_module { Ex1( void ) { SC_HAS_PROCESS(Ex1); SC_METHOD(Method10ns); } void Method10ns( void ) { next_trigger( 10, SC_NS ); std::cout << "Now " << sc_core::sc_time_stamp() << sdt::endl; } }; SC_THREAD is called only one, and therefore normally contains an infinite loop to properly model hardware. Thus the above is coded more simply as: #include <systemc> #include <iostream> struct Ex1 : sc_core::sc_module { Ex1( void ) { SC_HAS_PROCESS(Ex1); SC_THREAD(Thread10ns); } void Thread10ns( void ) { for(;;) { std::cout << "Now " << sc_core::sc_time_stamp() << sdt::endl; wait( 10, SC_NS ); } } }; Quote Link to comment Share on other sites More sharing options...
FreeSourceC.com Posted October 27, 2019 Report Share Posted October 27, 2019 On 3/4/2018 at 10:31 PM, katang said: I receive the message Error: (E520) next_trigger() is only allowed in SC_METHODs: in SC_THREADs and SC_CTHREADs use wait() instead You can get some more info about wait() and next_trigger() via example at here : http://freesourcec.com/whats-the-diffrence-between-wait-and-next_trigger/ Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.