一、实验环境
Vmware Workstation 8.0.2 build-591240
Ubantu Linux Version 12.04
SystemC Version 2.3.0
二、环境配置
1.从OSCI官方网站(http://www.systemc.org/)下载最新版本的SystemC源程序文件systemc-2.3.0.tgz。我下载下来放在主文件夹下
2.加压缩并配置安装SystemC,大致过程及对应命令如下:
tar -xvzf systemc-2.3.0.tgz ;解压缩到systemc-2.3.0文件夹
cd systemc-2.3.0/
./configure -prefix=/home/yuzeren48/systemc-2.3.0/objdir ;执行配置文件,指定SystemC的安装路径
make ;重新编译SystemC。此时可能出现错误 g++: Command not found,解决方法:sudo apt-get install g++。系统会自动安装。
make install ;安装SystemC 。此时出现***与***为同一文件,错误1,错误2 什么的是正常现象。
安装完毕,SystemC将安装在/home/yuzeren48/systemc-2.3.0/objdir 路径下,记住这个路径,因为后面编译SystemC源程序时需要指定头文件和目标文件的路径。
三、实验步骤
1.在systemc-2.3.0目录下新建一个myobj文件夹,编辑SystemC源程序文件。其中nand2.h为定义2输入与非门的头文件,stim.h为程序的测试文件,提供信号输入测试用例,mon.h为显示输出文件,监视程序的输入输出信号并将其显示在屏幕上。nand2.cc为测试主程序文件。源程序见附录。
2.编译链接源程序文件并生成可执行文件nand2:
cd myobj
g++ nand2.cc -I/home/yuzeren48/systemc-2.3.0/objdir/include -L/home/yuzeren48/systemc-2.3.0/objdir/lib-linux -o nand2 -lsystemc
注意在这个过程中所提供的-I、-L和-l参数,即头文件路径、库文件路径以及库文件名的正确性。
如果g++命令成功执行,则生成一个名为nand2的可执行文件。
3.执行nand2:
./nand2
注意:执行此命令时,可能会提示 error while loading shared libraries: libsystemc-2.3.0.so: cannot open shared object file: No such file or directory
解决办法:首先找到libsystemc-2.3.0.so此共享库文件所在的位置,可以通过搜索,我的在/home/yuzeren48/systemc-2.3.0/objdir/lib-linux下。然后输入命令:export LD_LIBRARY_PATH=/home/yuzeren48/systemc-2.3.0/objdir/lib-linux:$LD_LIBRARY_PATH (LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库)
结果如下:
SystemC 2.3.0-ASI --- Dec 10 2012 10:11:35 Copyright (c) 1996-2012 by all Contributors, ALL RIGHTS RESERVED Time A B F 0 s 0 0 1 10 ns 0 1 1 20 ns 1 0 1 30 ns 1 1 0
从运行结果可以看出,其正确实现了2输入与非门的逻辑功能。
四:附录
1. nand2.h
该文件为定义2输入与非门的头文件
/*nand2.h*/ #ifndef _NAND2_H #define _NAND2_H #include <systemc.h> SC_MODULE(nand2){ //declare nand2 module sc_in<bool> A,B; //input signal ports sc_out<bool> F; //output port void do_nand(){ //simulate logic function of the nand F.write(!( A.read() && B.read())); }; SC_CTOR(nand2){ SC_METHOD(do_nand); //constructor sensitive<<A<<B; //sensitivity list } }; #endif
SystemC 通过使用类sc_module建立层次结构,sc_module可以被直接应用,或隐式的通过宏命令SC_MODULE使用。sc_in,sc_out分别定义了输入及输出信号。函数do_nand实现了2输入与非门的逻辑功能,其中F.write(!(A.read()&&B.read())) 可以被替换为F=!(A&&B)。SC_CTOR等价于c++中类的构造函数,构造函数的功能有:
建立层次
注册函数为仿真内核的进程
为进程声明sensitivity list
2. stim.h
该文件为仿真产生仿真信号
/*stim.h*/ #ifndef _STIM_H #define _STIM_H #include"systemc.h" SC_MODULE(stim){ sc_out<bool> A,B; //declare outport signal sc_in<bool> Clk; //declare clock void gen_stim(){ //function to generate the test bench A.write(0); B.write(0); wait(); A.write(0); B.write(1); wait(); A.write(1); B.write(0); wait(); A.write(1); B.write(1); wait(); sc_stop(); } SC_CTOR(stim){ SC_THREAD(gen_stim); sensitive<<Clk.pos(); } }; #endif
注意当信号产生结束后调用sc_stop,将会结束仿真,在下面的mon.h中我们会看到这是监视信号循环结束的条件。
3. mon.h
该文件监视输入输出信号,并将结果输出
/*mon.h*/ #ifndef _MON_H #define _MON_H #include"systemc.h" SC_MODULE(mon){ sc_in<bool> A,B,F; sc_in_clk Clk; void monitor(){ //watch the inport and outport signal until simulatus stop while(1){ wait(); cout<<sc_time_stamp()<<"\t"<<A.read() <<" "<<B.read()<<" "<<F.read()<<endl; } } SC_CTOR(mon){ SC_THREAD(monitor); sensitive<<Clk.pos(); cout<<"Time\tA B F"<<endl; } }; #endif
4. nand2.cc
该文件为主程序文件
/*nand2.cc*/ #include"nand2.h" #include"stim.h" #include"mon.h" int sc_main(int argc, char* argv[]){ sc_signal<bool> Asig, Bsig, Fsig; sc_clock testClk("TestClock",10,SC_NS,0.5); nand2 nand("nand2"); nand.A(Asig); nand.B(Bsig); nand.F(Fsig); stim stim1("Stimulus"); stim1.A(Asig); stim1.B(Bsig); stim1.Clk(testClk); mon monitor1("Monitor"); monitor1.A(Asig); monitor1.B(Bsig); monitor1.F(Fsig); monitor1.Clk(testClk); sc_start(); //stimulus start return 0; }
文件开始声明输入输出信号,使用sc_clock声明时钟信号,然后实例化每个MODULZE并关联。调用sc_start()开始仿真知道信号结束。
2012-12-10 14:11:57