Hello everyone,
I have successfuly compiled SystemC-2.3.0 under VS2012.
Compilation:
For a system description and compilation, I had to enable static linking the following way, aside from configuring the include and library directories and the library name.
Properties->configuration properties->C/C++->Code Generation
Runtime Library set to Multi-threaded Debug (\MTd)
After that, I was able to compile the simulation project.
Execution:
During execution, Windows throws an exception for the DCAST of line 359 on sc_thread_process.cpp. This is executed by the call to SC_THREAD(run) in the "CPU" constructor. The related code can be found enclosed.
Console output:
Error: (E549) uncaught exception: Access violation - no RTTI data!
In file: c:\users\raul\documents\visual studio 2012\projects\systemc-2.3.0\src\sysc\kernel\sc_except.cpp:98
Visual Studio output:
First-chance exception at 0x0135EF3F in coprocessor_func.exe: 0xC0000005: Access violation reading location 0x00000005.
First-chance exception at 0x74D54B32 in coprocessor_func.exe: Microsoft C++ exception: std::__non_rtti_object at memory location 0x007EF570.
First-chance exception at 0x74D54B32 in coprocessor_func.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000.
First-chance exception at 0x74D54B32 in coprocessor_func.exe: Microsoft C++ exception: sc_core::sc_report at memory location 0x007EE304.
The program '[4260] coprocessor_func.exe' has exited with code 1 (0x1).
Could this be related to the issue that dynamic cast should not be called from within a constructor because the object is not yet fully built?
References:
Under item 6:
http://en.cppreferen...ge/dynamic_cast
This is an example that I am using without issues under Linux. Any ideas of what can be going wrong?
Thanks in advance,
Raul Fajardo
Code:
#include <systemc.h>
#include <iostream>
using namespace std;
class CoProcessor
{
sc_time m_process_time;
public:
CoProcessor()
{
m_process_time = sc_time(20, SC_US);
}
unsigned int sum(unsigned int a, unsigned int
{
unsigned int tmp = a + b;
wait(m_process_time);
return tmp;
}
};
class CPU : public sc_module
{
CoProcessor co_cpu;
public:
SC_HAS_PROCESS(CPU); //enables the definition of SC_THREAD or SC_METHOD (SC_METHOD has sensitivity and never ends)
CPU(sc_module_name nm) : sc_module(nm)
{
SC_THREAD(run); //registers the function to the simulation kernel, enables wait()
}
void run()
{
unsigned int a, b, c;
b = 10;
c = 5;
a = co_cpu.sum(b, c);
cout << "Computation result of " << b << " + " << c << ": " << a << endl;
cout << "Algorithm was run in " << sc_time_stamp() << endl;
}
};
int sc_main(int argc, char * argv[])
{
CPU processor("main_processor");
sc_start(500, SC_US); //simulate for 500 microseconds
return 0;
}