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入门的主要内容,如果未能解决你的问题,请参考以下文章