systemC入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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_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 ;
}

以上是关于systemC入门的主要内容,如果未能解决你的问题,请参考以下文章

systemC全加器建模

systemC构建时钟分频器

如何初始化作为数组的 systemc 端口名称?

Atom编辑器入门到精通 Atom使用进阶

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)

Cg入门19:Fragment shader - 片段级模型动态变色