在硬件仿真上的语言不是很多,主流的有vhdl,verilog,systemverilog以及systemC。
systemC是一种系统级语言也是一种硬件仿真的语言,它是由c++经过修改得到的。
想比于其他的硬件语言,它主要有以下的优势:
(1)    更高的仿真速度
(2)   硬件与软件的协同仿真
(3)   体系的架构探索

一般的数字系统开发有以下的部分,它们由高向低逐步进行:
(1)    c/c++  形成可执行规范
(2)    RTL级的设计
(3)   寄存器级的设计
(4)  门级的网表

以下是我们的第一个systemC的程序实例:
这个程序描述的是一个半加器。
    //文件half_adder.h
    #include "system.h"

    SC_MODULE(half_adder){        //  SC_MODULE  是一个类定义的宏函数,实现这个类
        sc_in a , b ;                 //   sc_in     明确模块的输入端口
        sc_out  sum , carry ;     //   sc_out   明确模块的输出端口

        void prc_half_adder();             //   事件函数的声明

        SC_CTOR(half_adder){       //   systemC constructor   构造函数的宏函数
            SC_METHOD(prc_half_adder);   //     SC_METHOD 定义事件驱动
            sensititive< enable ;
    sc_in >select ;       //    定义为4输出无符号整型数据类型

    sc_out > z ;

    void prc_decoder2by4();

    SC_CTOR(decoder2by4){
    SC_METHOD(decoder2by4);
    sensitive(enable);
    sensitive(select);
    //      sensitive(enable,select) ;
    };
文件:    decoder2by4.cpp
    #include "decoder2by4.cpp"
    void decoder2by4::prc_decoder2by4(){
        if(enable){
                switch(select.read()){     //     由于c++类型匹配严格,所以所得的结果需要通过
                                                                                    //     .read()方法 进行修改           
                case 0 : z = 0xe ;   break ;
                case 1:  z = 0xd;    break ;
                case2:   z = 0xb;    break;
                case3:   z = 0x7;    break;
                }
            }
    else
                z = 0xf;
    }
    由之前的那些例子可以看出,事件的函数返回类型是void同时无输入的参数。
    描述的层次:
    文件:  full_adder.h
        #include "half_adder.h"
        SCX_MODULE(full_adder){
         sc_in   a , b , carry_in ;
         sc_out sum,carry_out ;

         sc_signal c1,s1,c2 ;

         void prc_or() ;
         half_adder * ha1_ptr , * ha2_ptr ;

         SC_CTOR(full_adder){
         ha1_ptr = new half_adder("ha1");       //      动态分配的形式出现
         ha1_ptr->a(a) ;           //     名称链接方式
         ha1_ptr->b(b) ;
         ha1_ptr->sum(s1) ;
         ha1_ptr->carry(c1) ;

         ha2_ptr = new half_adder("ha2");
         (*ha2_ptr)(s1,carry_in,sum,c2) ;       //     位置链接方式

         SC_METHOD(prc_or);
         sensitive<