一、实验环境
Vmware Workstation ACE Edition Version 6.0.1 build-55017
Debian Linux Version 2.6.18
SystemC Version 2.2.0
二、环境配置
1.从OSCI官方网站(http://www.systemc.org/)下载最新版本的SystemC源程序文件systemc-2.2.0.tgz。
2.加压缩并配置安装SystemC,大致过程及对应命令如下:
tar –xvzf systemc-2.2.0.tgz ;解压缩到systemc-2.2.0文件夹
cd system-2.2.0
mkdir objdir ;建立临时文件夹,用于存放SystemC安装文件
cd objdir
../configure –prefix=/home/user/systemc ;执行配置文件,指定SystemC的安装路径
cd ..
make ;重新编译SystemC
make install ;安装SystemC
安装完毕,SystemC将安装在/home/user/systemc路径下,记住这个路径,因为后面编译SystemC源程序时需要指定头文件和目标文件的路径。
三、实验步骤
1.编辑SystemC源程序文件,其中nand2.h为定义2输入与非门的头文件,tb.h为定义验证程序的头文件,nand2.cpp为测试用主程序文件。
2.编译链接源程序文件并生成可执行文件nand2:
g++ nand2.cpp –I/home/user/systemc/include –L/home/user/systemc/lib-linux –o nand2 –lsystemc
注意在这个过程中所提供的-I、-L和-l参数,即头文件路径、库文件路径以及库文件名的正确性。
如果g++命令成功执行,则生成一个名为nand2的可执行文件。
3.执行nand2:
./nand2
结果如下:
Info: (I804) /IEEE_Std_1666/deprecated: sc_start(double) deprecated, use sc_start(sc_time) or sc_start()
a=0,b=0,f=1
a=0,b=1,f=1
a=1,b=0,f=1
a=1,b=1,f=1
a=1,b=1,f=0
Info: (I804) /IEEE_Std_1666/deprecated: You can turn off warnings about
IEEE 1666 deprecated features by placing this method call as the
first statement in your sc_main() function:
sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING);
从运行结果可以看出,其正确实现了2输入与非门的逻辑功能。
附:源程序列表
1.nand2.h
#ifndef _NAND2_H
#define _NAND2_H
#include <systemc.h>
#include <math.h>
SC_MODULE(nand2){
sc_in<bool> A;
sc_in<bool> B;
sc_out<bool> F;
void do_nand(){
F=!( A & B);
};
SC_CTOR(nand2){
SC_METHOD(do_nand);
sensitive<<A<<B;
}
};
#endif
2.tb.h
#ifndef _TB_H
#define _TB_H
SC_MODULE(tb)
{
sc_out<bool> a,b;
sc_in<bool> f;
sc_in_clk clk;
void gen_input(){
ait(); a=0; b=0;
ait(); a=0; b=1;
wait(); a=1; b=0;
wait(); a=1; b=1;
wait(100);
}
void display_variable() {
out<<"a="<<a<<",b="<<b<<",f="<<f<<endl;
}
SC_CTOR(tb) {
C_CTHREAD(gen_input,clk.pos());
SC_METHOD(display_variable);
ensitive<<f<<a<<b;
dont_initialize();
}
};
#endif
3.nand2.cpp
#include <systemc.h>
#include "nand2.h"
#include "tb.h"
int sc_main(int, char**){
sc_signal<bool> a,b,f;
sc_clock clk("Clk",20,SC_NS);
nand2 N2("Nand2");
N2.A(a);
N2.B(b);
N2.F(f);
tb tb1("tb");
tb1.clk(clk);
tb1.a(a);
tb1.b(b);
tb1.f(f);
sc_start(200);
return 0;
}