Ubantu12.04平台上的SystemC实验:2输入与非门

一、实验环境

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

 

转载于:https://www.cnblogs.com/yuzeren48/archive/2012/12/10/SystemC%e5%ae%9e%e9%aa%8c-2%e8%be%93%e5%85%a5%e4%b8%8e%e9%9d%9e%e9%97%a8.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值