Why this code generates exception?

F

fl

Hi,
I am using SystemC, a kind of C++ library to do some simulation. I
find the example code, see below:
...............
SC_MODULE(isq)
{
sc_in<bool> RSTN;
sc_in_clk CLK;

sc_out<bool> DIN_rdy;
sc_in<bool> DIN_vld;
sc_in<sc_uint<18> > DIN_value;
sc_in<bool> DOUT_rdy;
sc_out<bool> DOUT_vld;
sc_out<sc_uint<10> > DOUT_value;

void thread();
sc_uint<10> isqrt5(sc_uint<18>);

SC_CTOR(isq){
SC_CTHREAD(thread, CLK.pos());
reset_signal_is(RSTN,false);
}
};

..................
isq *isqp;

isqp = new isq("isq0");
(*isqp)(reset, clk,
in_rdy, in_vld, it,
out_rdy, out_vld, is);

...............................

This code segment generates the following warning in "Microsoft Visual
C Express 2008".

...............
'isq_VS0.exe': Loaded 'C:\systemcfiles\SystemCsln0\Debug\isq_VS0.exe',
Symbols loaded.
'isq_VS0.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'isq_VS0.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
First-chance exception at 0x7c812afb in isq_VS0.exe: Microsoft C++
exception: sc_core::sc_user at memory location 0x0086f947..
The program '[4224] isq_VS0.exe: Native' has exited with code 0 (0x0).
..................

I cannot see anything wrong with the above code. The relavant
definitions are attached below. Coudl you give me some idea on this
issue? How to identify the cause of this warning?

Thanks.








..................
//
----------------------------------------------------------------------------
// CLASS : sc_module
//
// Base class for all structural entities.
//
----------------------------------------------------------------------------

class sc_module
: public sc_object, public sc_process_host
{
friend class sc_module_name;
friend class sc_module_registry;
friend class sc_object;
friend class sc_port_registry;
friend class sc_process_b;
friend class sc_simcontext;

public:

sc_simcontext* sc_get_curr_simcontext()
{ return simcontext(); }

// to generate unique names for objects in an MT-Safe way
const char* gen_unique_name( const char* basename_, bool
preserve_first );

virtual const char* kind() const
{ return "sc_module"; }

protected:

// called by construction_done
virtual void before_end_of_elaboration();

void construction_done();

// called by elaboration_done (does nothing by default)
virtual void end_of_elaboration();

void elaboration_done( bool& );

// called by start_simulation (does nothing by default)
virtual void start_of_simulation();

void start_simulation();

// called by simulation_done (does nothing by default)
virtual void end_of_simulation();

void simulation_done();

void sc_module_init();

// constructor
sc_module( const char* nm );
sc_module( const std::string& nm );
sc_module( const sc_module_name& nm ); /* for those used to old
style */
sc_module();

public:

// destructor
virtual ~sc_module();

// positional binding methods

sc_module& operator << ( sc_interface& );
sc_module& operator << ( sc_port_base& );

sc_module& operator , ( sc_interface& interface_ )
{ return operator << ( interface_ ); }

sc_module& operator , ( sc_port_base& port_ )
{ return operator << ( port_ ); }

// operator() is declared at the end of the class.

const ::std::vector<sc_object*>& get_child_objects() const;

protected:

void add_child_object( sc_object* );
void remove_child_object( sc_object* );

// this must be called by user-defined modules
void end_module();


// to prevent initialization for SC_METHODs and SC_THREADs
void dont_initialize();

// set reset sensitivity for SC_CTHREADs
void reset_signal_is( const sc_in<bool>& port, bool level );
void reset_signal_is( const sc_signal_in_if<bool>& iface, bool
level );

// static sensitivity for SC_THREADs and SC_CTHREADs


// static sensitivity for SC_METHODs

void next_trigger()
{ ::sc_core::next_trigger( simcontext() ); }


// dynamic sensitivty for SC_METHODs


// for SC_CTHREADs


// These are protected so that user derived classes can refer to
them.
sc_sensitive sensitive;
sc_sensitive_pos sensitive_pos;
sc_sensitive_neg sensitive_neg;

// Function to set the stack size of the current (c)thread
process.
void set_stack_size( std::size_t );

int append_port( sc_port_base* );

private:
sc_module( const sc_module& );

private:

bool m_end_module_called;
std::vector<sc_port_base*>* m_port_vec;
int m_port_index;
sc_name_gen* m_name_gen;
std::vector<sc_object*> m_child_objects;
sc_module_name* m_module_name_p;

public:

void defunct() { }

// positional binding methods (cont'd)

void operator () ( const sc_bind_proxy& p001,
const sc_bind_proxy& p002 = SC_BIND_PROXY_NIL,
...

const sc_bind_proxy& p051 = SC_BIND_PROXY_NIL,
const sc_bind_proxy& p064 = SC_BIND_PROXY_NIL );

};

........
#define
SC_MODULE(user_module_name)
\
struct user_module_name : ::sc_core::sc_module
 
F

fl

Hi,
I am using SystemC, a kind of C++ library to do some simulation. I
find the example code, see below:
..............
SC_MODULE(isq)
{
        sc_in<bool> RSTN;
        sc_in_clk   CLK;

        sc_out<bool> DIN_rdy;
        sc_in<bool> DIN_vld;
        sc_in<sc_uint<18> > DIN_value;
        sc_in<bool> DOUT_rdy;
        sc_out<bool> DOUT_vld;
        sc_out<sc_uint<10> > DOUT_value;

        void thread();
        sc_uint<10> isqrt5(sc_uint<18>);

        SC_CTOR(isq){
                SC_CTHREAD(thread, CLK.pos());
                reset_signal_is(RSTN,false);
        }

};

.................
        isq *isqp;

        isqp = new isq("isq0");
        (*isqp)(reset, clk,
                in_rdy, in_vld, it,
                out_rdy, out_vld, is);

..............................

This code segment generates the following warning in "Microsoft Visual
C Express 2008".

..............
'isq_VS0.exe': Loaded 'C:\systemcfiles\SystemCsln0\Debug\isq_VS0.exe',
Symbols loaded.
'isq_VS0.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll'
'isq_VS0.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll'
First-chance exception at 0x7c812afb in isq_VS0.exe: Microsoft C++
exception: sc_core::sc_user at memory location 0x0086f947..
The program '[4224] isq_VS0.exe: Native' has exited with code 0 (0x0).
.................

I cannot see anything wrong with the above code. The relavant
definitions are attached below. Coudl you give me some idea on this
issue? How to identify the cause of this warning?

Thanks.

.................
//
---------------------------------------------------------------------------­-
//  CLASS : sc_module
//
//  Base class for all structural entities.
//
---------------------------------------------------------------------------­-

class sc_module
: public sc_object, public sc_process_host
{
    friend class sc_module_name;
    friend class sc_module_registry;
    friend class sc_object;
    friend class sc_port_registry;
        friend class sc_process_b;
    friend class sc_simcontext;

public:

    sc_simcontext* sc_get_curr_simcontext()
        { return simcontext(); }

    // to generate unique names for objects in an MT-Safe way
    const char* gen_unique_name( const char* basename_, bool
preserve_first );

    virtual const char* kind() const
        { return "sc_module"; }

protected:

    // called by construction_done
    virtual void before_end_of_elaboration();

    void construction_done();

    // called by elaboration_done (does nothing by default)
    virtual void end_of_elaboration();

    void elaboration_done( bool& );

    // called by start_simulation (does nothing by default)
    virtual void start_of_simulation();

    void start_simulation();

    // called by simulation_done (does nothing by default)
    virtual void end_of_simulation();

    void simulation_done();

    void sc_module_init();

    // constructor
    sc_module( const char* nm );
    sc_module( const std::string& nm );
    sc_module( const sc_module_name& nm ); /* for those used to old
style */
    sc_module();

public:

    // destructor
    virtual ~sc_module();

    // positional binding methods

    sc_module& operator << ( sc_interface& );
    sc_module& operator << ( sc_port_base& );

    sc_module& operator , ( sc_interface& interface_ )
        { return operator << ( interface_ ); }

    sc_module& operator , ( sc_port_base& port_ )
        { return operator << ( port_ ); }

    // operator() is declared at the end of the class.

    const ::std::vector<sc_object*>& get_child_objects() const;

protected:

    void add_child_object( sc_object* );
    void remove_child_object( sc_object* );

    // this must be called by user-defined modules
    void end_module();

    // to prevent initialization for SC_METHODs and SC_THREADs
    void dont_initialize();

    // set reset sensitivity for SC_CTHREADs
    void reset_signal_is( const sc_in<bool>& port, bool level );
    void reset_signal_is( const sc_signal_in_if<bool>& iface, bool
level );

    // static sensitivity for SC_THREADs and SC_CTHREADs

    // static sensitivity for SC_METHODs

    void next_trigger()
        { ::sc_core::next_trigger( simcontext() ); }

    // dynamic sensitivty for SC_METHODs

    // for SC_CTHREADs

    // These are protected so that user derived classes can refer to
them.
    sc_sensitive     sensitive;
    sc_sensitive_pos sensitive_pos;
    sc_sensitive_neg sensitive_neg;

    // Function to set the stack size of the current (c)thread
process.
    void set_stack_size( std::size_t );

    int append_port( sc_port_base* );

private:
    sc_module( const sc_module& );

private:

    bool                        m_end_module_called;
    std::vector<sc_port_base*>* m_port_vec;
    int                         m_port_index;
    sc_name_gen*                m_name_gen;
    std::vector<sc_object*>     m_child_objects;
    sc_module_name*             m_module_name_p;

public:

    void defunct() { }

    // positional binding methods (cont'd)

    void operator () ( const sc_bind_proxy& p001,
                       const sc_bind_proxy& p002 = SC_BIND_PROXY_NIL,
..

                       const sc_bind_proxy& p051 = SC_BIND_PROXY_NIL,
                       const sc_bind_proxy& p064 = SC_BIND_PROXY_NIL );

};

.......
#define
SC_MODULE(user_module_name)
\
    struct user_module_name : ::sc_core::sc_module

Sorry, the above code is not complete. I add more complete here. After
ispq is memory allocated, it is initialized with the correponding
parameters. The types are correct to me. So, why it generates
exception warning? When I comment this initilization, there is no
warning anymore. Thanks.

............
int sc_main(int argc, char *argv[])
{
sc_clock clk;
sc_signal<bool> reset;
sc_signal<bool> in_rdy;
sc_signal<bool> in_vld;
sc_signal<bool> out_vld;
sc_signal<bool> out_rdy;
sc_signal<sc_uint<18> > it;
sc_signal<sc_uint<10> > is;
int errors;
isq *isqp;

isqp = new isq("isq0");
(*isqp)(reset, clk,
in_rdy, in_vld, it,
out_rdy, out_vld, is);
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top