Visual Studio 2012配置SystemC开发环境
一、编译System库
参考http://blog.csdn.net/bcs_01/article/details/9715253
1.下载SystemC library source code
到http://www.accellera.org/home/下载SystemC library,目前的版本是systemc 2.3.0
2. 以SystemC 2.3.0为例,下载后的文件名喂systemc-2.3.0.tgz,解压到工作目录下:E:\workspace\systemc\systemc-2.3.0
3. 打开E:\workspace\systemc\systemc-2.3.0\msvc80\SystemC目录下的SystemC.sln
4.VS2012 "生成(Build英文)"-->“生成解决方案(Build Solution)”,生成SystemC.lib文件。
如果编译成功的话(忽略那些Warning)。在E:\workspace\systemc\systemc-2.3.0\msvc80\SystemC\debug目录下就生成了SystemC.lib
VS2012在编译时会遇到这样的问题:fatal error C1189: #error : The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.导致生成库不成功,解决方案是:工程项目SystemC处右键Properties -> configuration Properties ->C/C++ -> Preprocessor -> Preprocessor Definitions 添加_XKEYCHECK_H。
二、新建SystemC工程,并配置项目属性
参考http://yexin218.iteye.com/blog/356620
5.新建项目,win32控制台应用程序,控制台应用程序设置时选择“空项目”。
6.添加.cpp源文件与.h头文件。附录A中给出了一个systemC加法器的应用实例。
7.添加源文件后进行项目属性设置。
C/C++→General →Additional Include Directories (F:\systemc-2.3.0\src)
C/C++ →Language →Enable Run-Time Type Info→Yes
C/C++→Code Generation→Runtime Library→Multi-thread Debug(/MTd)
C/C++→ Command Line→Additional Options加上/vmg /D_CRT_SECURE_NO_DEPRECATE
Linker →General→Additional Library Directories (D:\systemc- 2.3.0\msvc80\SystemC\Debug)
Linker →Input→Additional Dependencies (SystemC.lib)
C/C++ -> General properties Warning level= Level 1(/W1)
上述属性设置在每次建立SystemC工程时都需要设置。若想免去每次都设置的麻烦可通过以下方法。
参考http://blog.sina.com.cn/s/blog_5ca0964e01014a9y.html
View-->Property Manager 在左侧会有属性窗口打开。展开树形找到“Microsoft.Cpp.Win32.user”,双击之后就可以设置所有项目的属性了。
三、编译、调试程序
8. 编译调试程序时会遇到一些问题,整理如下:
1)调试时,应用控制台自动退出。调试->开始执行(不调试)
2)运行时产生“ConsoleApplication1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
参考http://blog.sina.com.cn/s/blog_81d2b15701016pd3.html
调试->选项和设置 打开选项对话框。
> 调试->常规->启用源服务器支持
> 调试->符号->微软符号服务器
四、附录A
adder.h
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #ifndef _ADDER_H 2 #define _ADDER_H 3 4 SC_MODULE(Adder){ 5 public: 6 sc_in<int> data_in_1; 7 sc_in<int> data_in_2; 8 sc_out<int> data_out; 9 SC_CTOR(Adder){ 10 SC_METHOD(adder_action); 11 sensitive << data_in_1 <<data_in_2; 12 } 13 14 void adder_action(){ 15 data_out = data_in_1 + data_in_2; 16 } 17 }; 18 19 #endif
adder.cpp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <systemc.h> 2 #include "adder.h" 3 4 SC_MODULE(Stimulator) { 5 public: 6 sc_out<int> data_out_1, data_out_2; 7 8 SC_CTOR(Stimulator){ 9 SC_THREAD(send_data); 10 dont_initialize(); 11 }; 12 13 private: 14 void send_data() { 15 int i = 3; 16 while(true){ 17 wait(i, SC_NS); 18 cout << "Time: " << sc_time_stamp() << "::"; 19 cout << "Send data: " << 4*i << ", " << 5*i-2 << endl; 20 data_out_1 = 4*i; 21 data_out_2 = 5*i-2; 22 i++; 23 if(i >= 14) { 24 wait(1,SC_NS); 25 sc_stop(); 26 } 27 } 28 }; 29 }; 30 31 SC_MODULE(Monitor) { 32 public: 33 sc_in<int> data_in; 34 35 SC_CTOR(Monitor){ 36 SC_METHOD(display); 37 dont_initialize(); 38 sensitive << data_in; 39 }; 40 41 private: 42 void display(){ 43 cout << "Time: " << sc_time_stamp() << "::"; 44 cout << "Receive data: " << data_in.read() << endl; 45 }; 46 }; 47 48 int sc_main(int argc, char* argv[]) { 49 Stimulator *stim; 50 Monitor *mon; 51 Adder *adder; 52 53 stim = new Stimulator("Stimulator"); 54 mon = new Monitor("Monitor"); 55 adder = new Adder("Adder"); 56 57 sc_signal<int> data_in_1, data_in_2, data_out; 58 59 stim->data_out_1(data_in_1); 60 stim->data_out_2(data_in_2); 61 mon->data_in(data_out); 62 adder->data_in_1(data_in_1); 63 adder->data_in_2(data_in_2); 64 adder->data_out(data_out); 65 66 sc_start(); 67 68 return 0; 69 }