systemC入门

在硬件仿真上的语言不是很多,主流的有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_unit<2> >select ;       //    定义为4输出无符号整型数据类型

    sc_out<sc_unit<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 ;
    }

猜你喜欢

转载自blog.51cto.com/13824643/2134001