在硬件仿真上的语言不是很多,主流的有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<bool> a , b ;                 //   sc_in<type>     明确模块的输入端口
		sc_out<bool>  sum , carry ;     //   sc_out<type>   明确模块的输出端口

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

		SC_CTOR(half_adder){       //   systemC constructor   构造函数的宏函数
			SC_METHOD(prc_half_adder);   //     SC_METHOD 定义事件驱动
			sensititive<<a<<b;            //      定义事件驱动的敏感量
			}
		};
文件half_adder.cpp
	#include"half_adder.h"

	void half_adder::prc_half_adder(){     //关于事件驱动的实现
	sum = a^b ;
	carry = a & b ;
	}

可以看出systemC使用的是一般的c++风格,书写的标准同c++相同,没有太多的变化
第二个例子:
关于一个全加器的实现方式:
文件:   decoder2by4.h
	#include "system.h"
	SC_MODULE(decoder2by4){
	sc_in<bool> enable ;
	sc_in<sc_uint<2> >select ;       //    定义为4输出无符号整型数据类型

	sc_out<sc_uint<4> > 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<bool>   a , b , carry_in ;
		 sc_out<bool> sum,carry_out ;

		 sc_signal<bool> 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<<c1<<c2 ;               

		 ~full_adder(){
				 delete ha1_ptr ;
				 delete ha2_ptr ;
				 }
		};
文件:full_adder.cpp
	#include "full_adder.h"

	void full_adder::prc_or(){
					carry_out = c1 | c2 ;
	}