Mark Posted April 2, 2020 Report Share Posted April 2, 2020 I'm new to systemC. My code needs to process some data after reading it from fifo. So I created sc_event tkn_in_fifo_data_written. However compiler produces this error message: Quote terminate called after throwing an instance of 'sc_core::sc_report' what(): Error: (E525) wait(n) is only valid for n > 0: n = 0 Can someone please tell me what's wrong? Also perhaps error message should say something else? template <class T, class M> class cmod_module: public sc_module { public: sc_fifo_in< T > tkn_in_fifo; sc_fifo_out< M > tkn_out_fifo; sc_event tkn_in_fifo_data_written; int numTknsRcvd; int numTknsSent; BAYER_TYPE *bayer_444; //virtual void ingress(); //get tkn in void ingress() { T tkn; while(true) { while(! hasBufferSpace() ) { // do something } tkn_in_fifo.read(tkn); processRcvdTkn(tkn); numTknsRcvd++; cout << name() << " " << numTknsRcvd << " tkns receivedd!" << endl; tkn_in_fifo_data_written.notify(); wait(); } } void egress() { M tkn; cout << name() << " " << numTknsSent << " tkns sent!" << endl; while(true){ while (! canSendTkn()) { cout << "waiting!" <<endl; //wait(tkn_in_fifo.data_written_event()); wait(tkn_in_fifo_data_written); } processTknToSend(tkn); tkn_out_fifo.write(tkn); numTknsSent++; cout << name() << " " << numTknsSent << " tkns sent!" << endl; wait(); } } virtual bool hasBufferSpace() = 0; virtual bool canSendTkn() = 0; virtual void processRcvdTkn(T& tkn) = 0; virtual void processTknToSend(M& tkn) = 0; }; Quote Link to comment Share on other sites More sharing options...
David Black Posted April 2, 2020 Report Share Posted April 2, 2020 The syntax wait(), which calls void sc_core::wait(void), assumes a static sensitivity list, but you have not setup a static sensitivity list that I can see. Also, you are sending and immediate notification, which I somehow doubt you really grasp the implication thereof. You need to learn about the fundamentals of the SystemC scheduler to get this working correctly. Quote Link to comment Share on other sites More sharing options...
Philipp A Hartmann Posted April 2, 2020 Report Share Posted April 2, 2020 I suggest to move to SystemC 2.3.3, if possible. (The error message indicates, that you seem to be using SystemC 2.3.1). Secondly, can you show the derived class of the fifo as well (including its constructor)? Mark 1 Quote Link to comment Share on other sites More sharing options...
Mark Posted April 2, 2020 Author Report Share Posted April 2, 2020 1 hour ago, Philipp A Hartmann said: I suggest to move to SystemC 2.3.3, if possible. (The error message indicates, that you seem to be using SystemC 2.3.1). Secondly, can you show the derived class of the fifo as well (including its constructor)? I'm forced to use whatever systemC version that comes with latest VCS version(vcs_vP-2019.06-SP2). Here is healer file: #include "systemc.h" #include "tkn.h" #include "cmod_utils.h" #include <cmod_module.h> // from Dierke model #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <math.h> //#include "global.h" //#include "ISP_Utils.h" #include "ltm.h" #include "ltm.HW_MOD_BA.h" #define CTRL LTM_Ctrl<sc_uint<14>, sc_uint<13>, sc_uint<20>, sc_uint<20> > #define TKN MDA3_tkn<sc_int<2>,unsigned int > class ltm_func: public cmod_module<TKN, unsigned int > { public: sc_fifo_in< CTRL> params_in_fifo; CTRL params; hdr_param hdr; unsigned int pxl_out; virtual bool hasBufferSpace(); virtual bool canSendTkn(); virtual void processRcvdTkn(TKN& tkn); virtual void processTknToSend(unsigned int& tkn); virtual void processParams(); SC_CTOR(ltm_func) { numTknsRcvd=0; numTknsSent=0; SC_THREAD(ingress); dont_initialize(); sensitive << tkn_in_fifo.data_written(); SC_THREAD(egress); sensitive << tkn_in_fifo.data_written() << tkn_out_fifo.data_read(); dont_initialize(); //SC_THREAD(params); //sensitive << params_in_fifo.data_written(); } }; ltm_func.cpp #include "ltm_func.h" bool ltm_func::hasBufferSpace() { return true; } bool ltm_func::canSendTkn() { return this->numTknsRcvd > this->numTknsSent; } void ltm_func::processRcvdTkn(TKN& tkn) { unsigned int Y1; ltm_debug debug; cout << "result before is::: " << pxl_out << endl; LTM_HW_func_BA(tkn.data, &hdr, &Y1, &pxl_out, &debug); cout << "result after is::: " << pxl_out << endl; } void ltm_func::processTknToSend(unsigned int& tkn) { tkn = pxl_out; } void ltm_func::processParams() { while(true){ while (! canSendTkn()) { wait(params_in_fifo.data_written_event()); } params_in_fifo.read(params); wait(); } } Quote Link to comment Share on other sites More sharing options...
Mark Posted April 2, 2020 Author Report Share Posted April 2, 2020 2 hours ago, David Black said: The syntax wait(), which calls void sc_core::wait(void), assumes a static sensitivity list, but you have not setup a static sensitivity list that I can see. Also, you are sending and immediate notification, which I somehow doubt you really grasp the implication thereof. You need to learn about the fundamentals of the SystemC scheduler to get this working correctly. what you saw in first post is called pure virtual class. It's inherited by derived class where sensitivity list is supplied. Quote Link to comment Share on other sites More sharing options...
Philipp A Hartmann Posted April 5, 2020 Report Share Posted April 5, 2020 From the code itself, it's not obvious to me, where the unexpected overload of sc_core::wait(int) is called. Can you try attaching a debugger and break on the exception (catch throw in gdb) and check from the backtrace, where from the exception is thrown? 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.