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
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